diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-09 16:20:34 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-06-09 16:28:01 -0400 |
commit | babef37dccbaa49249a22bae9150686815d7be71 (patch) | |
tree | 505658793d3ac66c9e103ae27ef1560b46bc6912 | |
parent | 006351ac8ead0d4a67dd3845e3ceffe650a23212 (diff) |
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.
Cc: stable@vger.kernel.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/ufs/inode.c | 18 |
1 files changed, 5 insertions, 13 deletions
diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 9bf10285c628..34f11cf0900a 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c | |||
@@ -844,7 +844,9 @@ void ufs_evict_inode(struct inode * inode) | |||
844 | truncate_inode_pages_final(&inode->i_data); | 844 | truncate_inode_pages_final(&inode->i_data); |
845 | if (want_delete) { | 845 | if (want_delete) { |
846 | inode->i_size = 0; | 846 | inode->i_size = 0; |
847 | if (inode->i_blocks) | 847 | if (inode->i_blocks && |
848 | (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || | ||
849 | S_ISLNK(inode->i_mode))) | ||
848 | ufs_truncate_blocks(inode); | 850 | ufs_truncate_blocks(inode); |
849 | } | 851 | } |
850 | 852 | ||
@@ -1103,7 +1105,7 @@ out: | |||
1103 | return err; | 1105 | return err; |
1104 | } | 1106 | } |
1105 | 1107 | ||
1106 | static void __ufs_truncate_blocks(struct inode *inode) | 1108 | static void ufs_truncate_blocks(struct inode *inode) |
1107 | { | 1109 | { |
1108 | struct ufs_inode_info *ufsi = UFS_I(inode); | 1110 | struct ufs_inode_info *ufsi = UFS_I(inode); |
1109 | struct super_block *sb = inode->i_sb; | 1111 | struct super_block *sb = inode->i_sb; |
@@ -1186,7 +1188,7 @@ static int ufs_truncate(struct inode *inode, loff_t size) | |||
1186 | 1188 | ||
1187 | truncate_setsize(inode, size); | 1189 | truncate_setsize(inode, size); |
1188 | 1190 | ||
1189 | __ufs_truncate_blocks(inode); | 1191 | ufs_truncate_blocks(inode); |
1190 | inode->i_mtime = inode->i_ctime = current_time(inode); | 1192 | inode->i_mtime = inode->i_ctime = current_time(inode); |
1191 | mark_inode_dirty(inode); | 1193 | mark_inode_dirty(inode); |
1192 | out: | 1194 | out: |
@@ -1194,16 +1196,6 @@ out: | |||
1194 | return err; | 1196 | return err; |
1195 | } | 1197 | } |
1196 | 1198 | ||
1197 | static void ufs_truncate_blocks(struct inode *inode) | ||
1198 | { | ||
1199 | if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode) || | ||
1200 | S_ISLNK(inode->i_mode))) | ||
1201 | return; | ||
1202 | if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) | ||
1203 | return; | ||
1204 | __ufs_truncate_blocks(inode); | ||
1205 | } | ||
1206 | |||
1207 | int ufs_setattr(struct dentry *dentry, struct iattr *attr) | 1199 | int ufs_setattr(struct dentry *dentry, struct iattr *attr) |
1208 | { | 1200 | { |
1209 | struct inode *inode = d_inode(dentry); | 1201 | struct inode *inode = d_inode(dentry); |