diff options
author | Josef Bacik <josef@redhat.com> | 2010-11-17 20:46:16 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-01-12 20:16:43 -0500 |
commit | c25d246715b87ad37e69e7abd1a0fed781423fa2 (patch) | |
tree | 18c13bcaa9e125a362d7d0ff24787d859d8d9b64 /fs | |
parent | 79124f18b335172e1916075c633745e12dae1dac (diff) |
XFS: handle hole punching via fallocate properly
This patch simply allows XFS to handle the hole punching flag in fallocate
properly. I've tested this with a little program that does a bunch of random
hole punching with FL_KEEP_SIZE and without it to make sure it does the right
thing. Thanks,
Signed-off-by: Josef Bacik <josef@redhat.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 94d5fd6a2973..da54403633b6 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
@@ -516,6 +516,7 @@ xfs_vn_fallocate( | |||
516 | loff_t new_size = 0; | 516 | loff_t new_size = 0; |
517 | xfs_flock64_t bf; | 517 | xfs_flock64_t bf; |
518 | xfs_inode_t *ip = XFS_I(inode); | 518 | xfs_inode_t *ip = XFS_I(inode); |
519 | int cmd = XFS_IOC_RESVSP; | ||
519 | 520 | ||
520 | /* preallocation on directories not yet supported */ | 521 | /* preallocation on directories not yet supported */ |
521 | error = -ENODEV; | 522 | error = -ENODEV; |
@@ -528,6 +529,9 @@ xfs_vn_fallocate( | |||
528 | 529 | ||
529 | xfs_ilock(ip, XFS_IOLOCK_EXCL); | 530 | xfs_ilock(ip, XFS_IOLOCK_EXCL); |
530 | 531 | ||
532 | if (mode & FALLOC_FL_PUNCH_HOLE) | ||
533 | cmd = XFS_IOC_UNRESVSP; | ||
534 | |||
531 | /* check the new inode size is valid before allocating */ | 535 | /* check the new inode size is valid before allocating */ |
532 | if (!(mode & FALLOC_FL_KEEP_SIZE) && | 536 | if (!(mode & FALLOC_FL_KEEP_SIZE) && |
533 | offset + len > i_size_read(inode)) { | 537 | offset + len > i_size_read(inode)) { |
@@ -537,8 +541,7 @@ xfs_vn_fallocate( | |||
537 | goto out_unlock; | 541 | goto out_unlock; |
538 | } | 542 | } |
539 | 543 | ||
540 | error = -xfs_change_file_space(ip, XFS_IOC_RESVSP, &bf, | 544 | error = -xfs_change_file_space(ip, cmd, &bf, 0, XFS_ATTR_NOLOCK); |
541 | 0, XFS_ATTR_NOLOCK); | ||
542 | if (error) | 545 | if (error) |
543 | goto out_unlock; | 546 | goto out_unlock; |
544 | 547 | ||