diff options
author | Eryu Guan <eguan@redhat.com> | 2016-12-09 16:49:54 +1100 |
---|---|---|
committer | Dave Chinner <david@fromorbit.com> | 2016-12-09 16:49:54 +1100 |
commit | 0c187dc508d7d8520319c0dcaa0601775f69ab5a (patch) | |
tree | 648849a301ea041631357e0c93f14fd046596dac | |
parent | 4cf4573d899cd80d8578c050061dc342f99f3a32 (diff) | |
download | op-kernel-dev-0c187dc508d7d8520319c0dcaa0601775f69ab5a.zip op-kernel-dev-0c187dc508d7d8520319c0dcaa0601775f69ab5a.tar.gz |
xfs: use xfs_vn_setattr_size to check on new size
Commit 6552321831dc ("xfs: remove i_iolock and use i_rwsem in the
VFS inode instead") introduced a regression that truncate(2) doesn't
check on new size, so it succeeds even if the new size exceeds the
current resource limit. Because xfs_setattr_size() was used instead
of xfs_vn_setattr_size(), and the latter calls xfs_vn_change_ok()
first to do sanity check on permission and new size.
This is found by truncate03 test from ltp, and the following is a
simplified reproducer:
#!/bin/bash
dev=/dev/sda5
mnt=/mnt/xfs
mkfs -t xfs -f $dev
mount $dev $mnt
# set max file size to 16k
ulimit -f 16
truncate -s $((16 * 1024 + 1)) /mnt/xfs/testfile
[ $? -eq 0 ] && echo "FAIL: truncate exceeded max file size"
ulimit -f unlimited
umount $mnt
Signed-off-by: Eryu Guan <eguan@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r-- | fs/xfs/xfs_iops.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index c962999..b930be0 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -988,7 +988,7 @@ xfs_vn_setattr( return error; xfs_ilock(ip, XFS_MMAPLOCK_EXCL); - error = xfs_setattr_size(ip, iattr); + error = xfs_vn_setattr_size(dentry, iattr); xfs_iunlock(ip, XFS_MMAPLOCK_EXCL); } else { error = xfs_vn_setattr_nonsize(dentry, iattr); |