diff mbox series

[15/18] fs: fat: search file should not allocate cluster

Message ID 20201129020216.4865-16-xypron.glpk@gmx.de
State Accepted, archived
Commit 1e51c8d64a945946af72099dd469a3320ce02e7c
Delegated to: Tom Rini
Headers show
Series fs: fat: fix long name support | expand

Commit Message

Heinrich Schuchardt Nov. 29, 2020, 2:02 a.m. UTC
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 | 29 ++++++-----------------------
 1 file changed, 6 insertions(+), 23 deletions(-)

--
2.29.2
diff mbox series

Patch

diff --git a/fs/fat/fat_write.c b/fs/fat/fat_write.c
index a029ef8ed6..56ea28553b 100644
--- a/fs/fat/fat_write.c
+++ b/fs/fat/fat_write.c
@@ -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) {