
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 --- fs/fat/fat.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 5a418cfbb7..47344bb57e 100644 --- a/fs/fat/fat.c +++ b/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;
-- 2.29.2