
On Wednesday, October 10, 2012 8:14:02 PM, Stephen Warren wrote:
This makes the FAT filesystem API more consistent with other block-based filesystems. If in the future standard multi-filesystem commands such as "ls" or "load" are implemented, having FAT work the same way as other filesystems will be necessary.
Convert cmd_fat.c to the new API, so the code looks more like other files implementing the same commands for other filesystems.
Signed-off-by: Stephen Warren swarren@nvidia.com
v3: Rebase on new fat.c cleanup patch. v2: Fix inverted test of get_partition_info() result in fat_register_device().
common/cmd_fat.c | 8 +++--- fs/fat/fat.c | 69 +++++++++++++++++++++++++----------------------------- include/fat.h | 1 + 3 files changed, 37 insertions(+), 41 deletions(-)
diff --git a/common/cmd_fat.c b/common/cmd_fat.c index 5a5698b..c38302d 100644 --- a/common/cmd_fat.c +++ b/common/cmd_fat.c @@ -55,7 +55,7 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 1;
dev = dev_desc->dev;
- if (fat_register_device(dev_desc,part)!=0) {
- if (fat_set_blk_dev(dev_desc, &info) != 0) { printf("\n** Unable to use %s %d:%d for fatload **\n", argv[1], dev, part); return 1;
@@ -111,7 +111,7 @@ int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 1;
dev = dev_desc->dev;
- if (fat_register_device(dev_desc,part)!=0) {
- if (fat_set_blk_dev(dev_desc, &info) != 0) { printf("\n** Unable to use %s %d:%d for fatls **\n", argv[1], dev, part); return 1;
@@ -149,7 +149,7 @@ int do_fat_fsinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) return 1;
dev = dev_desc->dev;
- if (fat_register_device(dev_desc,part)!=0) {
- if (fat_set_blk_dev(dev_desc, &info) != 0) { printf("\n** Unable to use %s %d:%d for fatinfo **\n", argv[1], dev, part); return 1;
@@ -185,7 +185,7 @@ static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,
dev = dev_desc->dev;
- if (fat_register_device(dev_desc, part) != 0) {
- if (fat_set_blk_dev(dev_desc, &info) != 0) { printf("\n** Unable to use %s %d:%d for fatwrite **\n", argv[1], dev, part); return 1;
diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 2863c4b..a6fc07c 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -61,46 +61,12 @@ static int disk_read(__u32 block, __u32 nr_blocks, void *buf) cur_part_info.start + block, nr_blocks, buf); }
-int fat_register_device(block_dev_desc_t * dev_desc, int part_no) +int fat_set_blk_dev(block_dev_desc_t *dev_desc, disk_partition_t *info) { ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz);
- /* First close any currently found FAT filesystem */
- cur_dev = NULL;
-#if (defined(CONFIG_CMD_IDE) || \
defined(CONFIG_CMD_SATA) || \
defined(CONFIG_CMD_SCSI) || \
defined(CONFIG_CMD_USB) || \
defined(CONFIG_MMC) || \
defined(CONFIG_SYSTEMACE) )
- /* Read the partition table, if present */
- if (!get_partition_info(dev_desc, part_no, &cur_part_info)) {
cur_dev = dev_desc;
- }
-#endif
- /* Otherwise it might be a superfloppy (whole-disk FAT filesystem)
*/
- if (!cur_dev) {
if (part_no != 0) {
printf("** Partition %d not valid on device %d **\n",
part_no, dev_desc->dev);
return -1;
}
cur_dev = dev_desc;
cur_part_info.part = 0;
cur_part_info.start = 0;
cur_part_info.size = dev_desc->lba;
cur_part_info.blksz = dev_desc->blksz;
cur_part_info.name[0] = 0;
cur_part_info.type[0] = 0;
cur_part_info.bootable = 0;
-#ifdef CONFIG_PARTITION_UUIDS
cur_part_info.uuid[0] = 0;
-#endif
- }
cur_dev = dev_desc;
cur_part_info = *info;
/* Make sure it has a valid FAT header */ if (disk_read(0, 1, buffer) != 1) {
@@ -124,6 +90,35 @@ int fat_register_device(block_dev_desc_t * dev_desc, int part_no) return -1; }
+int fat_register_device(block_dev_desc_t *dev_desc, int part_no) +{
- disk_partition_t info;
- /* First close any currently found FAT filesystem */
- cur_dev = NULL;
- /* Read the partition table, if present */
- if (get_partition_info(dev_desc, part_no, &info)) {
if (part_no != 0) {
printf("** Partition %d not valid on device %d **\n",
part_no, dev_desc->dev);
return -1;
}
info.part = 0;
info.start = 0;
info.size = dev_desc->lba;
info.blksz = dev_desc->blksz;
info.name[0] = 0;
info.type[0] = 0;
info.bootable = 0;
+#ifdef CONFIG_PARTITION_UUIDS
info.uuid[0] = 0;
+#endif
- }
- return fat_set_blk_dev(dev_desc, &info);
+}
/*
- Get the first occurence of a directory delimiter ('/' or '') in
a string. diff --git a/include/fat.h b/include/fat.h index cc85b06..706cd7a 100644 --- a/include/fat.h +++ b/include/fat.h @@ -212,6 +212,7 @@ long file_fat_read_at(const char *filename, unsigned long pos, void *buffer, unsigned long maxsize); long file_fat_read(const char *filename, void *buffer, unsigned long maxsize); const char *file_getfsname(int idx); +int fat_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info); int fat_register_device(block_dev_desc_t *dev_desc, int part_no);
int file_fat_write(const char *filename, void *buffer, unsigned long maxsize);
For the V3 of this series: Reviewed-by: Benoît Thébaudeau benoit.thebaudeau@advansee.com
Best regards, Benoît