Whamcloud - gitweb
LU-5912 libcfs: use vfs api for fsync calls 31/12731/3
authorBob Glossman <bob.glossman@intel.com>
Fri, 14 Nov 2014 22:26:30 +0000 (14:26 -0800)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 4 Dec 2014 13:32:13 +0000 (13:32 +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.

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

index 8d0f6a0..ff1b4bb 100644 (file)
        ((fp)->f_op->write((fp), (buf), (size), pos))
 
 #ifdef HAVE_FILE_FSYNC_4ARGS
-#define filp_fsync(fp, start, end) ((fp)->f_op->fsync((fp), start, end, 1))
-#elif defined(HAVE_FILE_FSYNC_2ARGS)
-#define filp_fsync(fp, start, end) ((fp)->f_op->fsync((fp), 1))
+#define ll_vfs_fsync_range(fp, start, end, datasync) \
+       vfs_fsync_range(fp, start, end, datasync)
 #else
-#define filp_fsync(fp, start, end) ((fp)->f_op->fsync((fp), (fp)->f_dentry, 1))
+#define ll_vfs_fsync_range(fp, start, end, datasync) \
+       vfs_fsync_range(fp, (fp)->f_dentry, start, end, datasync)
 #endif
 
 #define flock_type(fl)                 ((fl)->fl_type)
index 6090fdf..c544e43 100644 (file)
@@ -705,7 +705,7 @@ int cfs_tracefile_dump_all_pages(char *filename)
                 cfs_tage_free(tage);
         }
        MMSPACE_CLOSE;
-       rc = filp_fsync(filp, 0, LLONG_MAX);
+       rc = ll_vfs_fsync_range(filp, 0, LLONG_MAX, 1);
        if (rc)
                printk(KERN_ERR "sync returns %d\n", rc);
 close:
index 3eb178b..80d1e67 100644 (file)
@@ -3269,17 +3269,7 @@ static int osd_object_sync(const struct lu_env *env, struct dt_object *dt,
        file->f_op = inode->i_fop;
        set_file_inode(file, inode);
 
-#ifdef HAVE_FILE_FSYNC_4ARGS
-       rc = file->f_op->fsync(file, start, end, 0);
-#elif defined(HAVE_FILE_FSYNC_2ARGS)
-       mutex_lock(&inode->i_mutex);
-       rc = file->f_op->fsync(file, 0);
-       mutex_unlock(&inode->i_mutex);
-#else
-       mutex_lock(&inode->i_mutex);
-       rc = file->f_op->fsync(file, dentry, 0);
-       mutex_unlock(&inode->i_mutex);
-#endif
+       rc = ll_vfs_fsync_range(file, start, end, 0);
 
        RETURN(rc);
 }