diff mbox series

[17/18] fs: fat: first dentry of long name in FAT iterator

Message ID 20201129020216.4865-18-xypron.glpk@gmx.de
State Accepted, archived
Commit 89735b44c4cee895b416f005468370d2943fa8d8
Delegated to: Tom Rini
Headers show
Series fs: fat: fix long name support | expand

Commit Message

Heinrich Schuchardt Nov. 29, 2020, 2:02 a.m. UTC
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(-)

--
2.29.2
diff mbox series

Patch

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;