From 89735b44c4cee895b416f005468370d2943fa8d8 Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Thu, 19 Nov 2020 07:44:08 +0100 Subject: [PATCH] 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 --- 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.39.5