[U-Boot] [PATCH V3 4/4] FAT: implement fat_set_blk_dev(), convert cmd_fat.c

Benoît Thébaudeau benoit.thebaudeau at advansee.com
Wed Oct 10 20:44:38 CEST 2012


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 at 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 at advansee.com>

Best regards,
Benoît


More information about the U-Boot mailing list