]> granicus.if.org Git - spl/commitdiff
Linux 2.6.35 compat: filp_fsync() dropped 'stuct dentry *'
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 14 Jul 2010 18:26:54 +0000 (11:26 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 14 Jul 2010 18:40:55 +0000 (11:40 -0700)
The prototype for filp_fsync() drop the unused argument 'stuct dentry *'.
I've fixed this by adding the needed autoconf check and moving all of
those filp related functions to file_compat.h.  This will simplify
handling any further API changes in the future.

config/spl-build.m4
configure
include/linux/file_compat.h
module/spl/spl-debug.c
module/spl/spl-vnode.c
spl_config.h.in

index ae4e1f1625e59614a6d9c856b9048ff1bee3c037..b908a56d5b78cc6e79588823f724257868131d02 100644 (file)
@@ -76,6 +76,7 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [
        SPL_AC_PUT_TASK_STRUCT
        SPL_AC_5ARGS_PROC_HANDLER
        SPL_AC_KVASPRINTF
+       SPL_AC_3ARGS_FILE_FSYNC
 ])
 
 AC_DEFUN([SPL_AC_MODULE_SYMVERS], [
@@ -1438,3 +1439,22 @@ AC_DEFUN([SPL_AC_KVASPRINTF], [
                [kvasprintf() is available])],
                [])
 ])
+
+dnl #
+dnl # 2.6.35 API change,
+dnl # Unused 'struct dentry *' removed from prototype.
+dnl #
+AC_DEFUN([SPL_AC_3ARGS_FILE_FSYNC], [
+       AC_MSG_CHECKING([whether file_fsync() wants 3 args])
+       SPL_LINUX_TRY_COMPILE([
+               #include <linux/buffer_head.h>
+       ],[
+               file_fsync(NULL, NULL, 0);
+       ],[
+               AC_MSG_RESULT(yes)
+               AC_DEFINE(HAVE_3ARGS_FILE_FSYNC, 1,
+                         [file_fsync() wants 3 args])
+       ],[
+               AC_MSG_RESULT(no)
+       ])
+])
index 04da5953a149b873412f056ff1779936756ac4ed..656f0425aa8bcd024bf0623226228d1cc019985e 100755 (executable)
--- a/configure
+++ b/configure
@@ -14905,6 +14905,71 @@ _ACEOF
        fi
 
 
+
+       { $as_echo "$as_me:$LINENO: checking whether file_fsync() wants 3 args" >&5
+$as_echo_n "checking whether file_fsync() wants 3 args... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/buffer_head.h>
+
+int
+main (void)
+{
+
+               file_fsync(NULL, NULL, 0);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_3ARGS_FILE_FSYNC 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
  ;;
                 user)
                                if test "x$AWK" != xgawk; then
@@ -18350,6 +18415,71 @@ _ACEOF
 
 
 
+       { $as_echo "$as_me:$LINENO: checking whether file_fsync() wants 3 args" >&5
+$as_echo_n "checking whether file_fsync() wants 3 args... " >&6; }
+
+
+cat confdefs.h - <<_ACEOF >conftest.c
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+
+               #include <linux/buffer_head.h>
+
+int
+main (void)
+{
+
+               file_fsync(NULL, NULL, 0);
+
+  ;
+  return 0;
+}
+
+_ACEOF
+
+
+       rm -Rf build && mkdir -p build
+       echo "obj-m := conftest.o" >build/Makefile
+       if { ac_try='cp conftest.c build && make modules -C $LINUX_OBJ EXTRA_CFLAGS="-Werror-implicit-function-declaration $EXTRA_KCFLAGS" $ARCH_UM M=$PWD/build'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } >/dev/null && { ac_try='test -s build/conftest.o'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+
+               { $as_echo "$as_me:$LINENO: result: yes" >&5
+$as_echo "yes" >&6; }
+
+cat >>confdefs.h <<\_ACEOF
+#define HAVE_3ARGS_FILE_FSYNC 1
+_ACEOF
+
+
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+               { $as_echo "$as_me:$LINENO: result: no" >&5
+$as_echo "no" >&6; }
+
+
+
+fi
+
+       rm -Rf build
+
+
+
+
 
                                if test "x$AWK" != xgawk; then
 
index d30e90356dc48f7df08db1df159151493ef709a7..b03373ebdc39c4ca40b951946e45f1cf00a65991 100644 (file)
 #include <linux/fdtable.h>
 #endif
 
+static inline struct file *
+spl_filp_open(const char *name, int flags, int mode, int *err)
+{
+        struct file *filp = NULL;
+        int rc;
+
+        filp = filp_open(name, flags, mode);
+        if (IS_ERR(filp)) {
+                rc = PTR_ERR(filp);
+                if (err)
+                        *err = rc;
+                filp = NULL;
+        }
+        return filp;
+}
+
+#define spl_filp_close(f)              filp_close(f, NULL)
+#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
+
 #endif /* SPL_FILE_COMPAT_H */
 
index 6a108624127b10ef9780bd7669db23f47861a2e2..75778752b0b2f92dbcb8eb8405a07a2ea5438323 100644 (file)
@@ -35,6 +35,7 @@
 #include <linux/interrupt.h>
 #include <linux/spinlock.h>
 #include <linux/proc_compat.h>
+#include <linux/file_compat.h>
 #include <sys/sysmacros.h>
 #include <sys/debug.h>
 #include <spl-ctl.h>
@@ -902,28 +903,6 @@ put_pages_back(struct page_collection *pc)
                 put_pages_back_on_all_cpus(pc);
 }
 
-static struct file *
-trace_filp_open (const char *name, int flags, int mode, int *err)
-{
-        struct file *filp = NULL;
-        int rc;
-
-        filp = filp_open(name, flags, mode);
-        if (IS_ERR(filp)) {
-                rc = PTR_ERR(filp);
-                printk(KERN_ERR "SPL: Can't open %s file: %d\n", name, rc);
-                if (err)
-                        *err = rc;
-                filp = NULL;
-        }
-        return filp;
-}
-
-#define trace_filp_write(fp, b, s, p)  (fp)->f_op->write((fp), (b), (s), p)
-#define trace_filp_fsync(fp)           (fp)->f_op->fsync((fp),(fp)->f_dentry,1)
-#define trace_filp_close(f)            filp_close(f, NULL)
-#define trace_filp_poff(f)             (&(f)->f_pos)
-
 static int
 spl_debug_dump_all_pages(dumplog_priv_t *dp, char *filename)
 {
@@ -936,7 +915,7 @@ spl_debug_dump_all_pages(dumplog_priv_t *dp, char *filename)
 
         down_write(&trace_sem);
 
-        filp = trace_filp_open(filename, O_CREAT|O_EXCL|O_WRONLY|O_LARGEFILE,
+        filp = spl_filp_open(filename, O_CREAT|O_EXCL|O_WRONLY|O_LARGEFILE,
                                0600, &rc);
         if (filp == NULL) {
                 if (rc != -EEXIST)
@@ -958,8 +937,8 @@ spl_debug_dump_all_pages(dumplog_priv_t *dp, char *filename)
         list_for_each_entry_safe(tage, tmp, &pc.pc_pages, linkage) {
                 __ASSERT_TAGE_INVARIANT(tage);
 
-                rc = trace_filp_write(filp, page_address(tage->page),
-                                      tage->used, trace_filp_poff(filp));
+                rc = spl_filp_write(filp, page_address(tage->page),
+                                    tage->used, spl_filp_poff(filp));
                 if (rc != (int)tage->used) {
                         printk(KERN_WARNING "SPL: Wanted to write %u "
                                "but wrote %d\n", tage->used, rc);
@@ -973,11 +952,11 @@ spl_debug_dump_all_pages(dumplog_priv_t *dp, char *filename)
 
         set_fs(oldfs);
 
-        rc = trace_filp_fsync(filp);
+        rc = spl_filp_fsync(filp, 1);
         if (rc)
                 printk(KERN_ERR "SPL: Unable to sync: %d\n", rc);
  close:
-        trace_filp_close(filp);
+        spl_filp_close(filp);
  out:
         up_write(&trace_sem);
 
index b5c34fbcd0c82ad73b77b381927ab32adaf610ff..c67fc4c7fca53e30d52a4aa22d6bc27304690348 100644 (file)
@@ -473,7 +473,7 @@ int vn_fsync(vnode_t *vp, int flags, void *x3, void *x4)
        if (flags & FDSYNC)
                datasync = 1;
 
-       RETURN(-file_fsync(vp->v_file, vp->v_file->f_dentry, datasync));
+       RETURN(-spl_filp_fsync(vp->v_file, datasync));
 } /* vn_fsync() */
 EXPORT_SYMBOL(vn_fsync);
 
index 5ed1991f99327acf5646e82e560bfed05c6b0244..8d57a63ea215d7bd87811b8610e058767711082f 100644 (file)
@@ -18,6 +18,9 @@
 /* vfs_unlink() wants 2 args */
 #undef HAVE_2ARGS_VFS_UNLINK
 
+/* file_fsync() wants 3 args */
+#undef HAVE_3ARGS_FILE_FSYNC
+
 /* INIT_WORK wants 3 args */
 #undef HAVE_3ARGS_INIT_WORK