]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
fs: fat: search file should not allocate cluster
authorHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 26 Nov 2020 15:10:01 +0000 (16:10 +0100)
committerHeinrich Schuchardt <xypron.glpk@gmx.de>
Thu, 10 Dec 2020 08:14:59 +0000 (09:14 +0100)
Searching for a file is not a write operation. So it should not lead to the
allocation of a new cluster to the directory.

If we reuse deleted entries, we might not even use the new cluster and due
to not flushing it the directory could be corrupted.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
fs/fat/fat_write.c

index a029ef8ed6a08a29c72f2b0785a4e10e2188e7f9..56ea28553b30751ffbf08b73cff50b3c58c39dd0 100644 (file)
@@ -1154,10 +1154,12 @@ static void fill_dentry(fsdata *mydata, dir_entry *dentptr,
        memcpy(dentptr->name, shortname, SHORT_NAME_SIZE);
 }
 
-/*
- * Find a directory entry based on filename or start cluster number
- * If the directory entry is not found,
- * the new position for writing a directory entry will be returned
+/**
+ * find_directory_entry() - find a directory entry by filename
+ *
+ * @itr:       directory iterator
+ * @filename:  name of file to find
+ * Return:     directory entry or NULL
  */
 static dir_entry *find_directory_entry(fat_itr *itr, char *filename)
 {
@@ -1180,13 +1182,6 @@ static dir_entry *find_directory_entry(fat_itr *itr, char *filename)
                        return itr->dent;
        }
 
-       /* 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;
-
        return NULL;
 }
 
@@ -1348,12 +1343,6 @@ int file_fat_write_at(const char *filename, loff_t pos, void *buffer,
                        }
                }
 
-               if (!itr->dent) {
-                       printf("Error: allocating new dir entry\n");
-                       ret = -EIO;
-                       goto exit;
-               }
-
                if (pos) {
                        /* No hole allowed */
                        ret = -EINVAL;
@@ -1622,12 +1611,6 @@ int fat_mkdir(const char *new_dirname)
                        }
                }
 
-               if (!itr->dent) {
-                       printf("Error: allocating new dir entry\n");
-                       ret = -EIO;
-                       goto exit;
-               }
-
                /* Check if long name is needed */
                ndent = set_name(itr, dirname, shortname);
                if (ndent < 0) {