From 88f2129504f0530106ebdbe7f5ff918d03bfcb42 Mon Sep 17 00:00:00 2001 From: Bob Glossman Date: Fri, 14 Nov 2014 14:26:30 -0800 Subject: [PATCH] LU-5912 libcfs: use vfs api for fsync calls 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 Change-Id: I551215fc340637364fe04f6e3bae963cf983c953 Reviewed-by: Yang Sheng Reviewed-by: Andreas Dilger Reviewed-on: http://review.whamcloud.com/13404 Tested-by: Jenkins Tested-by: Maloo --- libcfs/include/libcfs/linux/linux-fs.h | 20 +++++++------------- libcfs/libcfs/tracefile.c | 2 +- lustre/osd-ldiskfs/osd_handler.c | 10 +++------- 3 files changed, 11 insertions(+), 21 deletions(-) diff --git a/libcfs/include/libcfs/linux/linux-fs.h b/libcfs/include/libcfs/linux/linux-fs.h index fa4e4d4..7b5680b 100644 --- a/libcfs/include/libcfs/linux/linux-fs.h +++ b/libcfs/include/libcfs/linux/linux-fs.h @@ -60,25 +60,19 @@ #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) diff --git a/libcfs/libcfs/tracefile.c b/libcfs/libcfs/tracefile.c index 98c8208..3a1730a 100644 --- a/libcfs/libcfs/tracefile.c +++ b/libcfs/libcfs/tracefile.c @@ -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: diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 717be8c..124e62d 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -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); } -- 1.8.3.1