Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit babef37d authored by Al Viro's avatar Al Viro
Browse files

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 006351ac
Loading
Loading
Loading
Loading
+5 −13
Original line number Original line Diff line number Diff line
@@ -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 @@ static int ufs_alloc_lastblock(struct inode *inode, loff_t size)
       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 @@ static int ufs_truncate(struct inode *inode, loff_t size)
	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);