FAILED: patch "[PATCH] excessive checks in ufs_write_failed() and ufs_evict_inode()" failed to apply to 4.4-stable tree
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
babef37dccbaa49249a22bae9150686815d7be71Mon Sep 17 00:00:00 2001
From: Al Viro <[email protected]>
Date: Fri, 9 Jun 2017 16:20:34 -0400
Subject: [PATCH] excessive checks in ufs_write_failed() and ufs_evict_inode()
As it is, short copy in write() to append-only file will fail to truncate the excessive allocated blocks. As the matter of fact, all checks in ufs_truncate_blocks() are either redundant or wrong for that caller. As for the only other caller (ufs_evict_inode()), we only need the file type checks there.
fs/ufs/inode.c +5 -13
@@ -844,7 +844,9 @@ void ufs_evict_inode(struct inode * inode)truncate_inode_pages_final (&inode->i_data);if (want_delete) { inode->i_size =0 ; -if (inode->i_blocks) +if (inode->i_blocks && + (S_ISREG (inode->i_mode) ||S_ISDIR (inode->i_mode) || +S_ISLNK (inode->i_mode)))ufs_truncate_blocks (inode); }
@@ -1103,7 +1105,7 @@ static int ufs_alloc_lastblock(struct inode *inode, loff_t size)return err; } -static void __ufs_truncate_blocks (struct inode *inode) +static void ufs_truncate_blocks (struct inode *inode) {struct ufs_inode_info *ufsi =UFS_I (inode);struct super_block *sb = inode->i_sb;
@@ -1186,7 +1188,7 @@ static int ufs_truncate(struct inode *inode, loff_t size)truncate_setsize (inode, size); -__ufs_truncate_blocks (inode); +ufs_truncate_blocks (inode); inode->i_mtime = inode->i_ctime =current_time (inode);mark_inode_dirty (inode); out:
@@ -1194,16 +1196,6 @@ static int ufs_truncate(struct inode *inode, loff_t size)return err; } -static void ufs_truncate_blocks (struct inode *inode) -{ -if (!(S_ISREG (inode->i_mode) ||S_ISDIR (inode->i_mode) || -S_ISLNK (inode->i_mode))) -return ; -if (IS_APPEND (inode) ||IS_IMMUTABLE (inode)) -return ; -__ufs_truncate_blocks (inode); -} -int ufs_setattr (struct dentry *dentry,struct iattr *attr) {struct inode *inode =d_inode (dentry);