diff options
Diffstat (limited to 'fs/reiserfs/inode.c')
| -rw-r--r-- | fs/reiserfs/inode.c | 15 | 
1 files changed, 11 insertions, 4 deletions
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index d83736fbc26..95d7680ead4 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c @@ -3085,8 +3085,10 @@ static ssize_t reiserfs_direct_IO(int rw, struct kiocb *iocb,  		loff_t isize = i_size_read(inode);  		loff_t end = offset + iov_length(iov, nr_segs); -		if (end > isize) -			vmtruncate(inode, isize); +		if ((end > isize) && inode_newsize_ok(inode, isize) == 0) { +			truncate_setsize(inode, isize); +			reiserfs_vfs_truncate_file(inode); +		}  	}  	return ret; @@ -3200,8 +3202,13 @@ int reiserfs_setattr(struct dentry *dentry, struct iattr *attr)  	 */  	reiserfs_write_unlock_once(inode->i_sb, depth);  	if ((attr->ia_valid & ATTR_SIZE) && -	    attr->ia_size != i_size_read(inode)) -		error = vmtruncate(inode, attr->ia_size); +	    attr->ia_size != i_size_read(inode)) { +		error = inode_newsize_ok(inode, attr->ia_size); +		if (!error) { +			truncate_setsize(inode, attr->ia_size); +			reiserfs_vfs_truncate_file(inode); +		} +	}  	if (!error) {  		setattr_copy(inode, attr);  |