From d028f1ffec76cc3c7449b1cc2634f2f04609dfaf Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Mon, 25 Oct 2021 20:27:15 +0300 Subject: [PATCH] LU-15162 osd: improve OI lookup concurrency replace inode->i_mutex with i_rwsem in osd_obj_map_lookup() Signed-off-by: Alex Zhuravlev Change-Id: Id8df20e00ae254ea4dcf4b10415e1927fac6bd44 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/45353 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Artem Blagodarenko Reviewed-by: Oleg Drokin Reviewed-by: Andreas Dilger --- config/lustre-build-ldiskfs.m4 | 17 +++++++++++++++++ lustre/osd-ldiskfs/osd_compat.c | 9 +++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/config/lustre-build-ldiskfs.m4 b/config/lustre-build-ldiskfs.m4 index 029af81..8871eb5 100644 --- a/config/lustre-build-ldiskfs.m4 +++ b/config/lustre-build-ldiskfs.m4 @@ -553,6 +553,22 @@ ext4_journal_get_write_access, [ EXTRA_KCFLAGS="$tmp_flags" ]) # LB_EXT4_JOURNAL_GET_WRITE_ACCESS_4A +# LB_HAVE_INODE_LOCK_SHARED +# +AC_DEFUN([LB_HAVE_INODE_LOCK_SHARED], [ +LB_CHECK_COMPILE([if inode_lock_shared() defined], +inode_lock_shared, [ + #include +],[ + struct inode i; + + inode_lock_shared(&i); +],[ + AC_DEFINE(HAVE_INODE_LOCK_SHARED, 1, + [inode_lock_shared() defined]) +]) +]) # LB_HAVE_INODE_LOCK_SHARED + # # LB_CONFIG_LDISKFS # @@ -609,6 +625,7 @@ AS_IF([test x$enable_ldiskfs != xno],[ LB_EXT4_INC_DEC_COUNT_2ARGS LB_JBD2_JOURNAL_GET_MAX_TXN_BUFS LB_EXT4_JOURNAL_GET_WRITE_ACCESS_4A + LB_HAVE_INODE_LOCK_SHARED AC_DEFINE(CONFIG_LDISKFS_FS_POSIX_ACL, 1, [posix acls for ldiskfs]) AC_DEFINE(CONFIG_LDISKFS_FS_SECURITY, 1, [fs security for ldiskfs]) AC_DEFINE(CONFIG_LDISKFS_FS_XATTR, 1, [extened attributes for ldiskfs]) diff --git a/lustre/osd-ldiskfs/osd_compat.c b/lustre/osd-ldiskfs/osd_compat.c index a67533e..eb94da2 100644 --- a/lustre/osd-ldiskfs/osd_compat.c +++ b/lustre/osd-ldiskfs/osd_compat.c @@ -51,6 +51,11 @@ #include "osd_internal.h" #include "osd_oi.h" +#ifndef HAVE_INODE_LOCK_SHARED +#define inode_lock_shared(dir) inode_lock(dir) +#define inode_unlock_shared(dir) inode_unlock(dir) +#endif + static void osd_push_ctxt(const struct osd_device *dev, struct lvfs_run_ctxt *newctxt, struct lvfs_run_ctxt *save) @@ -1087,9 +1092,9 @@ int osd_obj_map_lookup(struct osd_thread_info *info, struct osd_device *dev, child->d_name.len = strlen(name); dir = d_seq->d_inode; - inode_lock(dir); + inode_lock_shared(dir); bh = osd_ldiskfs_find_entry(dir, &child->d_name, &de, NULL, NULL); - inode_unlock(dir); + inode_unlock_shared(dir); if (IS_ERR(bh)) RETURN(PTR_ERR(bh)); -- 1.8.3.1