From: Bob Glossman Date: Fri, 14 Nov 2014 22:26:30 +0000 (-0800) Subject: LU-5912 libcfs: use vfs api for fsync calls X-Git-Tag: 2.6.91~24 X-Git-Url: https://git.whamcloud.com/?a=commitdiff_plain;h=a1f7493109cc995f43204d9a0f19a229ec5edef6;p=fs%2Flustre-release.git 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. Signed-off-by: Bob Glossman Change-Id: I551215fc340637364fe04f6e3bae963cf983c953 Reviewed-on: http://review.whamcloud.com/12731 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Yang Sheng Reviewed-by: Andreas Dilger --- diff --git a/libcfs/include/libcfs/linux/linux-fs.h b/libcfs/include/libcfs/linux/linux-fs.h index 8d0f6a0..ff1b4bb 100644 --- a/libcfs/include/libcfs/linux/linux-fs.h +++ b/libcfs/include/libcfs/linux/linux-fs.h @@ -67,11 +67,11 @@ ((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) diff --git a/libcfs/libcfs/tracefile.c b/libcfs/libcfs/tracefile.c index 6090fdf..c544e43 100644 --- a/libcfs/libcfs/tracefile.c +++ b/libcfs/libcfs/tracefile.c @@ -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: diff --git a/lustre/osd-ldiskfs/osd_handler.c b/lustre/osd-ldiskfs/osd_handler.c index 3eb178b..80d1e67 100644 --- a/lustre/osd-ldiskfs/osd_handler.c +++ b/lustre/osd-ldiskfs/osd_handler.c @@ -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); }