fs: fat: search file should not allocate cluster

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>
This commit is contained in:
Heinrich Schuchardt 2020-11-26 16:10:01 +01:00
parent 3049a5106c
commit 1e51c8d64a

View File

@ -1154,10 +1154,12 @@ static void fill_dentry(fsdata *mydata, dir_entry *dentptr,
memcpy(dentptr->name, shortname, SHORT_NAME_SIZE); memcpy(dentptr->name, shortname, SHORT_NAME_SIZE);
} }
/* /**
* Find a directory entry based on filename or start cluster number * find_directory_entry() - find a directory entry by filename
* If the directory entry is not found, *
* the new position for writing a directory entry will be returned * @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) 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; 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; 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) { if (pos) {
/* No hole allowed */ /* No hole allowed */
ret = -EINVAL; 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 */ /* Check if long name is needed */
ndent = set_name(itr, dirname, shortname); ndent = set_name(itr, dirname, shortname);
if (ndent < 0) { if (ndent < 0) {