]> git.proxmox.com Git - mirror_spl-debian.git/blobdiff - include/linux/file_compat.h
Imported Upstream version 0.6.4.1
[mirror_spl-debian.git] / include / linux / file_compat.h
index 97bd7639610b05ac299fa3bb9d8ecbdf518f34c5..a2db2590a23554e7fc56fa841e79c58793275e8e 100644 (file)
@@ -6,7 +6,7 @@
  *  UCRL-CODE-235197
  *
  *  This file is part of the SPL, Solaris Porting Layer.
- *  For details, see <http://github.com/behlendorf/spl/>.
+ *  For details, see <http://zfsonlinux.org/>.
  *
  *  The SPL is free software; you can redistribute it and/or modify it
  *  under the terms of the GNU General Public License as published by the
@@ -50,28 +50,34 @@ spl_filp_open(const char *name, int flags, int mode, int *err)
 #define spl_filp_poff(f)               (&(f)->f_pos)
 #define spl_filp_write(fp, b, s, p)    (fp)->f_op->write((fp), (b), (s), p)
 
-#ifdef HAVE_3ARGS_FILE_FSYNC
-#define spl_filp_fsync(fp, sync)       (fp)->f_op->fsync((fp),               \
-                                       (fp)->f_dentry, sync)
-#else
-#define spl_filp_fsync(fp, sync)       (fp)->f_op->fsync((fp), sync)
-#endif
+static inline int
+spl_filp_fallocate(struct file *fp, int mode, loff_t offset, loff_t len)
+{
+       int error = -EOPNOTSUPP;
 
-#ifdef HAVE_INODE_I_MUTEX
-#define spl_inode_lock(ip)             (mutex_lock(&(ip)->i_mutex))
-#define spl_inode_lock_nested(ip, type)        (mutex_lock_nested((&(ip)->i_mutex),  \
-                                       (type)))
-#define spl_inode_unlock(ip)           (mutex_unlock(&(ip)->i_mutex))
+#ifdef HAVE_FILE_FALLOCATE
+       if (fp->f_op->fallocate)
+               error = fp->f_op->fallocate(fp, mode, offset, len);
 #else
-#define spl_inode_lock(ip)             (down(&(ip)->i_sem))
-#define spl_inode_unlock(ip)           (up(&(ip)->i_sem))
-#endif /* HAVE_INODE_I_MUTEX */
+#ifdef HAVE_INODE_FALLOCATE
+       if (fp->f_dentry && fp->f_dentry->d_inode &&
+           fp->f_dentry->d_inode->i_op->fallocate)
+               error = fp->f_dentry->d_inode->i_op->fallocate(
+                   fp->f_dentry->d_inode, mode, offset, len);
+#endif /* HAVE_INODE_FALLOCATE */
+#endif /*HAVE_FILE_FALLOCATE */
 
-#ifdef HAVE_KERN_PATH_PARENT
-#define spl_kern_path_parent(path, nd) kern_path_parent(path, nd)
+       return (error);
+}
+
+#ifdef HAVE_2ARGS_VFS_FSYNC
+#define        spl_filp_fsync(fp, sync)        vfs_fsync(fp, sync)
 #else
-#define spl_kern_path_parent(path, nd) path_lookup(path, LOOKUP_PARENT, nd)
-#endif /* HAVE_KERN_PATH_PARENT */
+#define        spl_filp_fsync(fp, sync)        vfs_fsync(fp, (fp)->f_dentry, sync)
+#endif /* HAVE_2ARGS_VFS_FSYNC */
+
+#define        spl_inode_lock(ip)              mutex_lock(&(ip)->i_mutex)
+#define        spl_inode_unlock(ip)            mutex_unlock(&(ip)->i_mutex)
 
 #endif /* SPL_FILE_COMPAT_H */