diff mbox series

[1/5] fs/ntfs3: Fix very fragmented case in attr_punch_hole

Message ID 011fda2c-3717-b429-dc87-0f1471a735d5@paragon-software.com (mailing list archive)
State New
Headers show
Series fs/ntfs3: Some fixes and refactoring | expand

Commit Message

Konstantin Komarov July 1, 2022, 1:09 p.m. UTC
In some cases we need to ni_find_attr attr_b

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
---
  fs/ntfs3/attrib.c | 13 ++++++++++++-
  1 file changed, 12 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/fs/ntfs3/attrib.c b/fs/ntfs3/attrib.c
index 59d8f482ef0a..43b9482f9830 100644
--- a/fs/ntfs3/attrib.c
+++ b/fs/ntfs3/attrib.c
@@ -2054,6 +2054,7 @@  int attr_punch_hole(struct ntfs_inode *ni, u64 vbo, u64 bytes, u32 *frame_size)
  				if (err)
  					goto out;
  				/* Layout of records maybe changed. */
+				attr_b = NULL;
  			}
  		}
  		/* Free all allocated memory. */
@@ -2073,6 +2074,14 @@  int attr_punch_hole(struct ntfs_inode *ni, u64 vbo, u64 bytes, u32 *frame_size)
  	}
  
  	total_size -= (u64)dealloc << sbi->cluster_bits;
+	if (!attr_b) {
+		attr_b = ni_find_attr(ni, NULL, NULL, ATTR_DATA, NULL, 0, NULL,
+				      &mi_b);
+		if (!attr_b) {
+			err = -EINVAL;
+			goto out;
+		}
+	}
  	attr_b->nres.total_size = cpu_to_le64(total_size);
  	mi_b->dirty = true;
  
@@ -2083,8 +2092,10 @@  int attr_punch_hole(struct ntfs_inode *ni, u64 vbo, u64 bytes, u32 *frame_size)
  
  out:
  	up_write(&ni->file.run_lock);
-	if (err)
+	if (err) {
+		ntfs_set_state(sbi, NTFS_DIRTY_ERROR);
  		make_bad_inode(&ni->vfs_inode);
+	}
  
  	return err;
  }