fs/ntfs3: Fix very fragmented case in attr_punch_hole
authorKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Thu, 30 Jun 2022 15:31:26 +0000 (18:31 +0300)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Wed, 3 Aug 2022 15:25:05 +0000 (18:25 +0300)
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

index ad713f62015527d41681419f9d9442eb3d030c13..3d64335fa4c7a415f07a4bbdfca8e730bf802b5b 100644 (file)
@@ -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;
 }