|
@@ -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);
|