]> git.sur5r.net Git - u-boot/commitdiff
fs: fat_write: fix the incorrect last cluster checking
authorWu, Josh <Josh.wu@atmel.com>
Thu, 8 May 2014 08:14:06 +0000 (16:14 +0800)
committerTom Rini <trini@ti.com>
Mon, 12 May 2014 20:31:50 +0000 (16:31 -0400)
In fat_write.c, the last clust condition check is incorrect:

  if ((curclust >= 0xffffff8) || (curclust >= 0xfff8)) {
   ... ...
  }

For example, in FAT32 if curclust is 0x11000. It is a valid clust.
But on above condition check, it will be think as a last clust.

So the correct last clust check should be:
  in fat32, curclust >= 0xffffff8
  in fat16, curclust >= 0xfff8
  in fat12, curclust >= 0xff8

This patch correct the last clust check.

Signed-off-by: Josh Wu <josh.wu@atmel.com>
fs/fat/fat_write.c
include/fat.h

index cef138ec9657ec48271f5ab4a0657ce329dc8b09..90d6ab63bf7731ee7088ede6a9a7be2fc495f412 100644 (file)
@@ -882,7 +882,7 @@ static dir_entry *find_directory_entry(fsdata *mydata, int startsect,
                }
 
                curclust = get_fatent_value(mydata, dir_curclust);
-               if ((curclust >= 0xffffff8) || (curclust >= 0xfff8)) {
+               if (IS_LAST_CLUST(curclust, mydata->fatsize)) {
                        empty_dentptr = dentptr;
                        return NULL;
                }
index 65da733aef36aa23132290ab0c61caec69fd6604..81d9790420d8057d0a8e3d1f5e22a6474c89cccd 100644 (file)
@@ -84,6 +84,9 @@
 #define START(dent)    (FAT2CPU16((dent)->start) \
                        + (mydata->fatsize != 32 ? 0 : \
                          (FAT2CPU16((dent)->starthi) << 16)))
+#define IS_LAST_CLUST(x, fatsize) ((x) >= ((fatsize) != 32 ? \
+                                       ((fatsize) != 16 ? 0xff8 : 0xfff8) : \
+                                       0xffffff8))
 #define CHECK_CLUST(x, fatsize) ((x) <= 1 || \
                                (x) >= ((fatsize) != 32 ? \
                                        ((fatsize) != 16 ? 0xff0 : 0xfff0) : \