summaryrefslogtreecommitdiffstats
path: root/module/spl/spl-vnode.c
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2013-01-08 09:42:49 -0800
committerBrian Behlendorf <[email protected]>2013-01-08 09:53:13 -0800
commit1c7b3eaf87492e875d7ad05f183e98fa306e48c2 (patch)
tree363ffca3d6ce6c1ca4e09d44fd60d04cdc22667c /module/spl/spl-vnode.c
parent46a75aadb7c08085a4ad2e55dcf5b6fb387c1253 (diff)
RHEL 6.4 compat, fallocate()
In the upstream kernel the FALLOC_FL_PUNCH_HOLE #define was introduced after the fallocate() function was moved from the inode_operations to the file_operations structure. Therefore, the SPL code assumed that if FALLOC_FL_PUNCH_HOLE was defined it was safe to use f_ops->fallocate(). Unfortunately, the RHEL6.4 kernel has only backported the FALLOC_FL_PUNCH_HOLE #define and not the fallocate() change. To address this compatibility issue the spl_filp_fallocate() helper function was added to properly detect which interface is available. Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'module/spl/spl-vnode.c')
-rw-r--r--module/spl/spl-vnode.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/module/spl/spl-vnode.c b/module/spl/spl-vnode.c
index 0ecd9addf..d8da9814b 100644
--- a/module/spl/spl-vnode.c
+++ b/module/spl/spl-vnode.c
@@ -654,13 +654,15 @@ int vn_space(vnode_t *vp, int cmd, struct flock *bfp, int flag,
ASSERT(bfp->l_start >= 0 && bfp->l_len > 0);
#ifdef FALLOC_FL_PUNCH_HOLE
- if (vp->v_file->f_op->fallocate) {
- error = -vp->v_file->f_op->fallocate(vp->v_file,
- FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
- bfp->l_start, bfp->l_len);
- if (!error)
- SRETURN(0);
- }
+ /*
+ * When supported by the underlying file system preferentially
+ * use the fallocate() callback to preallocate the space.
+ */
+ error = -spl_filp_fallocate(vp->v_file,
+ FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
+ bfp->l_start, bfp->l_len);
+ if (error == 0)
+ SRETURN(0);
#endif
#ifdef HAVE_INODE_TRUNCATE_RANGE