fs: fat: first dentry of long name in FAT iterator
A long name is split over multiple directory entries. When deleting a file with a long name we need the first directory entry to be able to delete the whole chain. Add the necessary fields to the FAT iterator: * cluster of first directory entry * address of first directory entry * remaining entries in cluster Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
parent
4a593dd0c5
commit
89735b44c4
20
fs/fat/fat.c
20
fs/fat/fat.c
@ -700,6 +700,18 @@ struct fat_itr {
|
||||
* @dent: current directory entry
|
||||
*/
|
||||
dir_entry *dent;
|
||||
/**
|
||||
* @dent_rem: remaining entries after long name start
|
||||
*/
|
||||
int dent_rem;
|
||||
/**
|
||||
* @dent_clust: cluster of long name start
|
||||
*/
|
||||
unsigned int dent_clust;
|
||||
/**
|
||||
* @dent_start: first directory entry for long name
|
||||
*/
|
||||
dir_entry *dent_start;
|
||||
/**
|
||||
* @l_name: long name of current directory entry
|
||||
*/
|
||||
@ -966,9 +978,13 @@ static int fat_itr_next(fat_itr *itr)
|
||||
|
||||
while (1) {
|
||||
dent = next_dent(itr);
|
||||
if (!dent)
|
||||
if (!dent) {
|
||||
itr->dent_start = NULL;
|
||||
return 0;
|
||||
|
||||
}
|
||||
itr->dent_rem = itr->remaining;
|
||||
itr->dent_start = itr->dent;
|
||||
itr->dent_clust = itr->clust;
|
||||
if (dent->name[0] == DELETED_FLAG)
|
||||
continue;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user