]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
fs/ntfs3: handle attr_set_size() errors when truncating files
authorKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Fri, 12 Dec 2025 11:33:19 +0000 (14:33 +0300)
committerKonstantin Komarov <almaz.alexandrovich@paragon-software.com>
Mon, 29 Dec 2025 13:33:30 +0000 (13:33 +0000)
If attr_set_size() fails while truncating down, the error is silently
ignored and the inode may be left in an inconsistent state.

Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
fs/ntfs3/file.c

index b48cdd77efaeea8bb583529effca0b274f17b6d5..a88045ab549f20c18dba3931cda2b9a9c635b705 100644 (file)
@@ -505,8 +505,8 @@ static int ntfs_truncate(struct inode *inode, loff_t new_size)
 {
        struct super_block *sb = inode->i_sb;
        struct ntfs_inode *ni = ntfs_i(inode);
-       int err, dirty = 0;
        u64 new_valid;
+       int err;
 
        if (!S_ISREG(inode->i_mode))
                return 0;
@@ -522,7 +522,6 @@ static int ntfs_truncate(struct inode *inode, loff_t new_size)
        }
 
        new_valid = ntfs_up_block(sb, min_t(u64, ni->i_valid, new_size));
-
        truncate_setsize(inode, new_size);
 
        ni_lock(ni);
@@ -536,20 +535,19 @@ static int ntfs_truncate(struct inode *inode, loff_t new_size)
                ni->i_valid = new_valid;
 
        ni_unlock(ni);
+       if (unlikely(err))
+               return err;
 
        ni->std_fa |= FILE_ATTRIBUTE_ARCHIVE;
        inode_set_mtime_to_ts(inode, inode_set_ctime_current(inode));
        if (!IS_DIRSYNC(inode)) {
-               dirty = 1;
+               mark_inode_dirty(inode);
        } else {
                err = ntfs_sync_inode(inode);
                if (err)
                        return err;
        }
 
-       if (dirty)
-               mark_inode_dirty(inode);
-
        return 0;
 }