diff options
| author | Konstantin Komarov <almaz.alexandrovich@paragon-software.com> | 2025-12-12 14:33:19 +0300 |
|---|---|---|
| committer | Konstantin Komarov <almaz.alexandrovich@paragon-software.com> | 2025-12-29 13:33:30 +0000 |
| commit | 576248a34b927e93b2fd3fff7df735ba73ad7d01 (patch) | |
| tree | 7a197917198361c95138e4f8e656d334e726a41d /fs/ntfs3 | |
| parent | 3a6aba7f3cf2b46816e08548c254d98de9c74eba (diff) | |
| download | lwn-576248a34b927e93b2fd3fff7df735ba73ad7d01.tar.gz lwn-576248a34b927e93b2fd3fff7df735ba73ad7d01.zip | |
fs/ntfs3: handle attr_set_size() errors when truncating files
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>
Diffstat (limited to 'fs/ntfs3')
| -rw-r--r-- | fs/ntfs3/file.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c index b48cdd77efae..a88045ab549f 100644 --- a/fs/ntfs3/file.c +++ b/fs/ntfs3/file.c @@ -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; } |
