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>
This commit is contained in:
Al Viro 2017-06-09 16:20:34 -04:00
Родитель 006351ac8e
Коммит babef37dcc
1 изменённых файлов: 5 добавлений и 13 удалений

Просмотреть файл

@ -844,7 +844,9 @@ void ufs_evict_inode(struct inode * inode)
truncate_inode_pages_final(&inode->i_data); truncate_inode_pages_final(&inode->i_data);
if (want_delete) { if (want_delete) {
inode->i_size = 0; 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); ufs_truncate_blocks(inode);
} }
@ -1103,7 +1105,7 @@ out:
return err; 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 ufs_inode_info *ufsi = UFS_I(inode);
struct super_block *sb = inode->i_sb; 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); truncate_setsize(inode, size);
__ufs_truncate_blocks(inode); ufs_truncate_blocks(inode);
inode->i_mtime = inode->i_ctime = current_time(inode); inode->i_mtime = inode->i_ctime = current_time(inode);
mark_inode_dirty(inode); mark_inode_dirty(inode);
out: out:
@ -1194,16 +1196,6 @@ out:
return err; 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) int ufs_setattr(struct dentry *dentry, struct iattr *attr)
{ {
struct inode *inode = d_inode(dentry); struct inode *inode = d_inode(dentry);