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:
parent
3049a5106c
commit
1e51c8d64a
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user