[U-Boot] [PATCH] mmc and fat bug fixes
Benoît Thébaudeau
benoit.thebaudeau at advansee.com
Wed May 15 17:37:04 CEST 2013
Hi Ruud,
On Wednesday, May 15, 2013 4:23:51 PM, Ruud Commandeur wrote:
> This patch fixes a number of mmc and fat-related bugs:
There should be only one logical change per patch.
>
> > Added a check for blkcnt > 0 in mmc_write_blocks (drivers/mmc.c) to prevent
> > a hangup for further mmc commands.
Adding Andy, the MMC custodian, to Cc.
>
> > Solved a checksum issue in fs/fat/fat.c. The mkcksum has const char
> > arguments with a size specifier, like "const char name[8]". In the
> > function, it is assumed that sizeof(name) will have the value 8, but this
> > is not the case (at least not for the Sourcery CodeBench compiler and
> > probably not according to ANSI C). This causes "long filename checksum
> > errors" for each fat file listed or written.
>
> > Made some changes to fs/fat/fat_write.c. Fixed testing fat_val for
> > 0xffff/0xfff8 and 0xfffffff/0xffffff8 by adding the corresponding fatsize
> > in the test (as read in earlier posts) and some changes in debug output.
Expressions like "as read in earlier posts" should not be present in a patch
description since it is unclear what it refers to once the patch has been
applied.
Line lengths should be at most 80 characters, including in the patch
description.
>
> Signed-off-by: Ruud Commandeur <rcommandeur at clb.nl>
> Cc: Tom Rini <trini at ti.com>
> Cc: Benoît Thébaudeau <benoit.thebaudeau at advansee.com>
> Cc: Mats Karrman <Mats.Karrman at tritech.se>
>
> Index: drivers/mmc/mmc.c
> ===================================================================
> --- drivers/mmc/mmc.c (revision 9)
> +++ drivers/mmc/mmc.c (working copy)
> @@ -282,8 +282,9 @@
>
> if (blkcnt > 1)
> cmd.cmdidx = MMC_CMD_WRITE_MULTIPLE_BLOCK;
> - else
> + else if (blkcnt > 0)
> cmd.cmdidx = MMC_CMD_WRITE_SINGLE_BLOCK;
> + else return 0; //Called with blkcnt = 0
The comment above is useless. Also, the comment style in U-Boot is /**/, not //.
>
> if (mmc->high_capacity)
> cmd.cmdarg = start;
> Index: fs/fat/fat.c
> ===================================================================
> --- fs/fat/fat.c (revision 9)
> +++ fs/fat/fat.c (working copy)
> @@ -569,10 +569,12 @@
>
> __u8 ret = 0;
>
> - for (i = 0; i < sizeof(name); i++)
> + for (i = 0; i < 8; i++) {
> ret = (((ret & 1) << 7) | ((ret & 0xfe) >> 1)) + name[i];
> - for (i = 0; i < sizeof(ext); i++)
> + }
> + for (i = 0; i < 3; i++) {
> ret = (((ret & 1) << 7) | ((ret & 0xfe) >> 1)) + ext[i];
> + }
>
> return ret;
> }
There should not be curly braces for single-line blocks.
Anyway, this has already been done by Marek in commit 6ad77d8, so this hunk
should be dropped.
> Index: fs/fat/fat_write.c
> ===================================================================
> --- fs/fat/fat_write.c (revision 9)
> +++ fs/fat/fat_write.c (working copy)
> @@ -41,6 +41,7 @@
> }
>
> static int total_sector;
> +
> static int disk_write(__u32 block, __u32 nr_blocks, void *buf)
> {
> if (!cur_dev || !cur_dev->block_write)
This hunk is not very useful.
> @@ -104,8 +105,7 @@
> } else
> memcpy(dirent->ext, s_name + period_location + 1, 3);
>
> - debug("name : %s\n", dirent->name);
> - debug("ext : %s\n", dirent->ext);
> + debug("name.ext : %.8s.%.3s\n", dirent->name, dirent->ext);
Correct. You could just remove the space before the colon since this is the
standard English formatting.
> }
>
> static __u8 num_of_fats;
> @@ -264,6 +264,7 @@
> goto name0_4;
> }
> slotptr->name0_4[j] = name[*idx];
> + slotptr->name0_4[j + 1] = 0x00;
> (*idx)++;
> end_idx++;
> }
> @@ -275,6 +276,7 @@
> goto name5_10;
> }
> slotptr->name5_10[j] = name[*idx];
> + slotptr->name5_10[j + 1] = 0x00;
> (*idx)++;
> end_idx++;
> }
> @@ -286,6 +288,7 @@
> goto name11_12;
> }
> slotptr->name11_12[j] = name[*idx];
> + slotptr->name11_12[j + 1] = 0x00;
> (*idx)++;
> end_idx++;
> }
These 3 hunks are correct, but they should be mentioned in the patch
description.
> @@ -569,7 +572,7 @@
> else
> startsect = mydata->rootdir_sect;
>
> - debug("clustnum: %d, startsect: %d\n", clustnum, startsect);
> + debug("clustnum: %d, startsect: %d, size %lu\n", clustnum, startsect,
> size);
Line too long: max 80 chars.
>
> if (disk_write(startsect, size / mydata->sect_size, buffer) < 0) {
> debug("Error writing data\n");
> @@ -587,10 +590,7 @@
> debug("Error writing data\n");
> return -1;
> }
> -
> - return 0;
OK.
> }
> -
This empty line would be better kept for code legibility.
> return 0;
> }
>
> @@ -656,7 +656,8 @@
> else
> break;
>
> - if (fat_val == 0xfffffff || fat_val == 0xffff)
> + if (((fat_val == 0xfffffff) && (mydata->fatsize == 32)) ||
> + ((fat_val == 0xffff) && (mydata->fatsize == 16)))
> break;
>
> entry = fat_val;
> @@ -901,7 +902,8 @@
> }
>
> curclust = get_fatent_value(mydata, dir_curclust);
> - if ((curclust >= 0xffffff8) || (curclust >= 0xfff8)) {
> + if (((curclust >= 0xffffff8) && (mydata->fatsize == 32)) ||
> + ((curclust >= 0xfff8) && (mydata->fatsize == 16))) {
> empty_dentptr = dentptr;
> return NULL;
> }
>
These 2 hunks are correct, but please remove the parentheses around the "=="
expressions: They make the code less readable. And add another tab to indent the
2nd line of the if-s so that it is more indented than the if block contents.
Best regards,
Benoît
More information about the U-Boot
mailing list