fs: fat: allocate a new cluster for root directory of fat32
authorAKASHI Takahiro <takahiro.akashi@linaro.org>
Fri, 24 May 2019 05:10:37 +0000 (14:10 +0900)
committerTom Rini <trini@konsulko.com>
Tue, 28 May 2019 22:55:09 +0000 (18:55 -0400)
Contrary to fat12/16, fat32 can have root directory at any location
and its size can be expanded.
Without this patch, root directory won't grow properly and so we will
eventually fail to add files under root directory. Please note that this
can happen even if you delete many files as deleted directory entries
are not reclaimed but just marked as "deleted" under the current
implementation.

Signed-off-by: AKASHI Takahiro <takahiro.akashi@linaro.org>
Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
fs/fat/fat_write.c

index 5ea15fab3af6f00a7ef2ee79095c4ba2f0ef93fd..729cf39630d35107b178859803e4b5e7ed5f055b 100644 (file)
@@ -247,8 +247,11 @@ fill_dir_slot(fat_itr *itr, const char *l_name)
                if (itr->remaining == 0)
                        flush_dir(itr);
 
+               /* allocate a cluster for more entries */
                if (!fat_itr_next(itr))
-                       if (!itr->dent && !itr->is_root && new_dir_table(itr))
+                       if (!itr->dent &&
+                           (!itr->is_root || itr->fsdata->fatsize == 32) &&
+                           new_dir_table(itr))
                                return -1;
        }
 
@@ -980,7 +983,10 @@ static dir_entry *find_directory_entry(fat_itr *itr, char *filename)
                        return itr->dent;
        }
 
-       if (!itr->dent && !itr->is_root && new_dir_table(itr))
+       /* allocate a cluster for more entries */
+       if (!itr->dent &&
+           (!itr->is_root || itr->fsdata->fatsize == 32) &&
+           new_dir_table(itr))
                /* indicate that allocating dent failed */
                itr->dent = NULL;