Whamcloud - gitweb
LU-5912 libcfs: use vfs api for fsync calls 04/13404/3
authorBob Glossman <bob.glossman@intel.com>
Fri, 14 Nov 2014 22:26:30 +0000 (14:26 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 27 Jan 2015 02:44:33 +0000 (02:44 +0000)
Use vfs_fsync_range() instead of direct use of filp->f_op->fsync()
routines.  Doing so will apply correct locking transparently without
needing to decide how to do it ourselves.
What we were doing was a long term violation of the locking
protocols described in Documentation/filesystems/Locking in linux
source but was never noticed until new checking code went into the
RHEL 6.6 kernel.  The new check triggered a visible error in syslog.

Lustre-commit: a1f7493109cc995f43204d9a0f19a229ec5edef6
Lustre-change: http://review.whamcloud.com/12731

Signed-off-by: Bob Glossman <bob.glossman@intel.com>
Change-Id: I551215fc340637364fe04f6e3bae963cf983c953
Reviewed-by: Yang Sheng <yang.sheng@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-on: http://review.whamcloud.com/13404
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
libcfs/include/libcfs/linux/linux-fs.h
libcfs/libcfs/tracefile.c
lustre/osd-ldiskfs/osd_handler.c

index fa4e4d4..7b5680b 100644 (file)
 #define filp_poff(f)                                   \
        (&(f)->f_pos)
 
-#ifdef HAVE_FILE_FSYNC_4ARGS
-# define do_fsync(fp, flag)                            \
-       ((fp)->f_op->fsync(fp, 0, LLONG_MAX, flag))
-#elif defined(HAVE_FILE_FSYNC_2ARGS)
-# define do_fsync(fp, flag)                            \
-       ((fp)->f_op->fsync(fp, flag))
-#else
-# define do_fsync(fp, flag)                            \
-       ((fp)->f_op->fsync(fp, (fp)->f_dentry, flag))
-#endif
-
 #define filp_read(fp, buf, size, pos)                  \
        ((fp)->f_op->read((fp), (buf), (size), pos))
 
 #define filp_write(fp, buf, size, pos)                 \
        ((fp)->f_op->write((fp), (buf), (size), pos))
 
-#define filp_fsync(fp)                                 \
-       do_fsync(fp, 1)
+#ifdef HAVE_FILE_FSYNC_4ARGS
+#define ll_vfs_fsync(fp, datasync) \
+       vfs_fsync_range(fp, 0, LLONG_MAX, datasync)
+#else
+#define ll_vfs_fsync(fp, datasync) \
+       vfs_fsync_range(fp, (fp)->f_dentry, 0, LLONG_MAX, datasync)
+#endif
 
 #define flock_type(fl)                 ((fl)->fl_type)
 #define flock_set_type(fl, type)       do { (fl)->fl_type = (type); } while (0)
index 98c8208..3a1730a 100644 (file)
@@ -730,7 +730,7 @@ int cfs_tracefile_dump_all_pages(char *filename)
                 cfs_tage_free(tage);
         }
        MMSPACE_CLOSE;
-       rc = filp_fsync(filp);
+       rc = ll_vfs_fsync(filp, 1);
        if (rc)
                printk(KERN_ERR "sync returns %d\n", rc);
 close:
index 717be8c..124e62d 100644 (file)
@@ -3124,13 +3124,9 @@ static int osd_object_sync(const struct lu_env *env, struct dt_object *dt)
        file->f_dentry = dentry;
        file->f_mapping = inode->i_mapping;
        file->f_op = inode->i_fop;
-#ifndef HAVE_FILE_FSYNC_4ARGS
-       mutex_lock(&inode->i_mutex);
-#endif
-       rc = do_fsync(file, 0);
-#ifndef HAVE_FILE_FSYNC_4ARGS
-       mutex_unlock(&inode->i_mutex);
-#endif
+
+       rc = ll_vfs_fsync(file, 0);
+
        RETURN(rc);
 }