Blame SOURCES/0059-fs-ntfs3-Fix-ntfs_look_for_free_space-does-only-repo.patch

Kmods SIG 8b815c
From edb853ff3dc01c22577ea5d0383d067b68a6d663 Mon Sep 17 00:00:00 2001
Kmods SIG 8b815c
From: Kari Argillander <kari.argillander@gmail.com>
Kmods SIG 8b815c
Date: Tue, 7 Sep 2021 17:28:39 +0300
Kmods SIG 8b815c
Subject: [Backport edb853ff3dc0] src: Fix ntfs_look_for_free_space() does
Kmods SIG 8b815c
 only report -ENOSPC
Kmods SIG 8b815c
Kmods SIG 8b815c
If ntfs_refresh_zone() returns error it will be changed to -ENOSPC. It
Kmods SIG 8b815c
is not right. Also caller of this functions also check other errors.
Kmods SIG 8b815c
Kmods SIG 8b815c
Fixes: 78ab59fee07f ("src: Rework file operations")
Kmods SIG 8b815c
Signed-off-by: Kari Argillander <kari.argillander@gmail.com>
Kmods SIG 8b815c
Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
Kmods SIG 8b815c
---
Kmods SIG 8b815c
 src/fsntfs.c | 51 +++++++++++++++++++++++++----------------------
Kmods SIG 8b815c
 1 file changed, 27 insertions(+), 24 deletions(-)
Kmods SIG 8b815c
Kmods SIG 8b815c
diff --git a/src/fsntfs.c b/src/fsntfs.c
Kmods SIG 8b815c
index 9232a7f410c68bb0b1f3a5cedd2295b814372404..e77fad89eaed372cbb972cab51d904fe99b3d565 100644
Kmods SIG 8b815c
--- a/src/fsntfs.c
Kmods SIG 8b815c
+++ b/src/fsntfs.c
Kmods SIG 8b815c
@@ -357,7 +357,7 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
Kmods SIG 8b815c
 			     enum ALLOCATE_OPT opt)
Kmods SIG 8b815c
 {
Kmods SIG 8b815c
 	int err;
Kmods SIG 8b815c
-	CLST alen = 0;
Kmods SIG 8b815c
+	CLST alen;
Kmods SIG 8b815c
 	struct super_block *sb = sbi->sb;
Kmods SIG 8b815c
 	size_t alcn, zlen, zeroes, zlcn, zlen2, ztrim, new_zlen;
Kmods SIG 8b815c
 	struct wnd_bitmap *wnd = &sbi->used.bitmap;
Kmods SIG 8b815c
@@ -369,13 +369,15 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
Kmods SIG 8b815c
 		if (!zlen) {
Kmods SIG 8b815c
 			err = ntfs_refresh_zone(sbi);
Kmods SIG 8b815c
 			if (err)
Kmods SIG 8b815c
-				goto out;
Kmods SIG 8b815c
+				goto up_write;
Kmods SIG 8b815c
+
Kmods SIG 8b815c
 			zlen = wnd_zone_len(wnd);
Kmods SIG 8b815c
 		}
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 		if (!zlen) {
Kmods SIG 8b815c
 			ntfs_err(sbi->sb, "no free space to extend mft");
Kmods SIG 8b815c
-			goto out;
Kmods SIG 8b815c
+			err = -ENOSPC;
Kmods SIG 8b815c
+			goto up_write;
Kmods SIG 8b815c
 		}
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 		lcn = wnd_zone_bit(wnd);
Kmods SIG 8b815c
@@ -384,12 +386,11 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
Kmods SIG 8b815c
 		wnd_zone_set(wnd, lcn + alen, zlen - alen);
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 		err = wnd_set_used(wnd, lcn, alen);
Kmods SIG 8b815c
-		if (err) {
Kmods SIG 8b815c
-			up_write(&wnd->rw_lock);
Kmods SIG 8b815c
-			return err;
Kmods SIG 8b815c
-		}
Kmods SIG 8b815c
+		if (err)
Kmods SIG 8b815c
+			goto up_write;
Kmods SIG 8b815c
+
Kmods SIG 8b815c
 		alcn = lcn;
Kmods SIG 8b815c
-		goto out;
Kmods SIG 8b815c
+		goto space_found;
Kmods SIG 8b815c
 	}
Kmods SIG 8b815c
 	/*
Kmods SIG 8b815c
 	 * 'Cause cluster 0 is always used this value means that we should use
Kmods SIG 8b815c
@@ -403,15 +404,17 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	alen = wnd_find(wnd, len, lcn, BITMAP_FIND_MARK_AS_USED, &alcn);
Kmods SIG 8b815c
 	if (alen)
Kmods SIG 8b815c
-		goto out;
Kmods SIG 8b815c
+		goto space_found;
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	/* Try to use clusters from MftZone. */
Kmods SIG 8b815c
 	zlen = wnd_zone_len(wnd);
Kmods SIG 8b815c
 	zeroes = wnd_zeroes(wnd);
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	/* Check too big request */
Kmods SIG 8b815c
-	if (len > zeroes + zlen || zlen <= NTFS_MIN_MFT_ZONE)
Kmods SIG 8b815c
-		goto out;
Kmods SIG 8b815c
+	if (len > zeroes + zlen || zlen <= NTFS_MIN_MFT_ZONE) {
Kmods SIG 8b815c
+		err = -ENOSPC;
Kmods SIG 8b815c
+		goto up_write;
Kmods SIG 8b815c
+	}
Kmods SIG 8b815c
 
Kmods SIG 8b815c
 	/* How many clusters to cat from zone. */
Kmods SIG 8b815c
 	zlcn = wnd_zone_bit(wnd);
Kmods SIG 8b815c
@@ -430,22 +433,22 @@ int ntfs_look_for_free_space(struct ntfs_sb_info *sbi, CLST lcn, CLST len,
Kmods SIG 8b815c
 	/* Allocate continues clusters. */
Kmods SIG 8b815c
 	alen = wnd_find(wnd, len, 0,
Kmods SIG 8b815c
 			BITMAP_FIND_MARK_AS_USED | BITMAP_FIND_FULL, &alcn);
Kmods SIG 8b815c
-
Kmods SIG 8b815c
-out:
Kmods SIG 8b815c
-	if (alen) {
Kmods SIG 8b815c
-		err = 0;
Kmods SIG 8b815c
-		*new_len = alen;
Kmods SIG 8b815c
-		*new_lcn = alcn;
Kmods SIG 8b815c
-
Kmods SIG 8b815c
-		ntfs_unmap_meta(sb, alcn, alen);
Kmods SIG 8b815c
-
Kmods SIG 8b815c
-		/* Set hint for next requests. */
Kmods SIG 8b815c
-		if (!(opt & ALLOCATE_MFT))
Kmods SIG 8b815c
-			sbi->used.next_free_lcn = alcn + alen;
Kmods SIG 8b815c
-	} else {
Kmods SIG 8b815c
+	if (!alen) {
Kmods SIG 8b815c
 		err = -ENOSPC;
Kmods SIG 8b815c
+		goto up_write;
Kmods SIG 8b815c
 	}
Kmods SIG 8b815c
 
Kmods SIG 8b815c
+space_found:
Kmods SIG 8b815c
+	err = 0;
Kmods SIG 8b815c
+	*new_len = alen;
Kmods SIG 8b815c
+	*new_lcn = alcn;
Kmods SIG 8b815c
+
Kmods SIG 8b815c
+	ntfs_unmap_meta(sb, alcn, alen);
Kmods SIG 8b815c
+
Kmods SIG 8b815c
+	/* Set hint for next requests. */
Kmods SIG 8b815c
+	if (!(opt & ALLOCATE_MFT))
Kmods SIG 8b815c
+		sbi->used.next_free_lcn = alcn + alen;
Kmods SIG 8b815c
+up_write:
Kmods SIG 8b815c
 	up_write(&wnd->rw_lock);
Kmods SIG 8b815c
 	return err;
Kmods SIG 8b815c
 }
Kmods SIG 8b815c
-- 
Kmods SIG 8b815c
2.31.1
Kmods SIG 8b815c