From: Benjamin Kaduk Date: Sun, 1 May 2016 23:48:40 +0000 (-0400) Subject: Linux 4.5: don't access i_mutex directly X-Git-Tag: openafs-stable-1_8_0pre1~78 X-Git-Url: http://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=360f4ef53c454494cd5212a5ea46c658bdb2879c Linux 4.5: don't access i_mutex directly Linux commit 5955102c, in preparation for future work, introduced wrapper functions to lock/unlock inode mutexes. This is to prepare for converting it to a read-write semaphore, so that lookup can be done with only the shared lock held. Adopt the afs_linux_*lock_inode() functions accordingly, and convert afs_linux_fsync() to using those wrappers, since the FOP_FSYNC_TAKES_RANGE case appears to be the current case. Amusingly, afs_linux_*lock_inode() already have a branch to handle the case when inode serialization is protected by a semaphore; it seems that this is going to come full-circle. Change-Id: Ia5a194acc559de21808655ef066151a0a3826364 Reviewed-on: https://gerrit.openafs.org/12268 Tested-by: BuildBot Reviewed-by: Joe Gorse Tested-by: Joe Gorse Reviewed-by: Benjamin Kaduk --- diff --git a/acinclude.m4 b/acinclude.m4 index 44082c2..0a90e16 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1098,6 +1098,9 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) AC_CHECK_LINUX_FUNC([inode_nohighmem], [#include ], [inode_nohighmem(NULL);]) + AC_CHECK_LINUX_FUNC([inode_lock], + [#include ], + [inode_lock(NULL);]) dnl Consequences - things which get set as a result of the dnl above tests diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h index 5b3f12b..9e2e22a 100644 --- a/src/afs/LINUX/osi_compat.h +++ b/src/afs/LINUX/osi_compat.h @@ -445,7 +445,9 @@ afs_init_sb_export_ops(struct super_block *sb) { static inline void afs_linux_lock_inode(struct inode *ip) { -#ifdef STRUCT_INODE_HAS_I_MUTEX +#if defined(HAVE_LINUX_INODE_LOCK) + inode_lock(ip); +#elif defined(STRUCT_INODE_HAS_I_MUTEX) mutex_lock(&ip->i_mutex); #else down(&ip->i_sem); @@ -454,7 +456,9 @@ afs_linux_lock_inode(struct inode *ip) { static inline void afs_linux_unlock_inode(struct inode *ip) { -#ifdef STRUCT_INODE_HAS_I_MUTEX +#if defined(HAVE_LINUX_INODE_LOCK) + inode_unlock(ip); +#elif defined(STRUCT_INODE_HAS_I_MUTEX) mutex_unlock(&ip->i_mutex); #else up(&ip->i_sem); diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index a82464c..bcdfbde 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -583,13 +583,13 @@ afs_linux_fsync(struct file *fp, int datasync) cred_t *credp = crref(); #if defined(FOP_FSYNC_TAKES_RANGE) - mutex_lock(&ip->i_mutex); + afs_linux_lock_inode(ip); #endif AFS_GLOCK(); code = afs_fsync(VTOAFS(ip), credp); AFS_GUNLOCK(); #if defined(FOP_FSYNC_TAKES_RANGE) - mutex_unlock(&ip->i_mutex); + afs_linux_unlock_inode(ip); #endif crfree(credp); return afs_convert_code(code);