From b2d8a68a697e77023848ea90e78ae426b0d736d1 Mon Sep 17 00:00:00 2001 From: Lai Siyao Date: Sun, 11 Aug 2019 14:34:04 +0800 Subject: [PATCH] LU-12719 obdclass: serialize lwp list access lustre_sb_info.lsi_lwp_list should be acessed with lock, and some place may sleep, change lsi_lwp_lock from spinlock to mutex. Lustre-change: https://review.whamcloud.com/36003 Lustre-commit: 875252d59924ad09db8de9f0fbb611788a0b9c78 Signed-off-by: Lai Siyao Change-Id: Ifc3622eb28cd6cf49661b14fc10e98aa689a58dc Reviewed-by: Wang Shilong Reviewed-by: Li Xi Signed-off-by: Minh Diep Reviewed-on: https://review.whamcloud.com/36349 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/include/lustre_disk.h | 3 ++- lustre/obdclass/obd_mount.c | 2 +- lustre/obdclass/obd_mount_server.c | 21 +++++++++++++++------ 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lustre/include/lustre_disk.h b/lustre/include/lustre_disk.h index 82a8afc..c121ab1 100644 --- a/lustre/include/lustre_disk.h +++ b/lustre/include/lustre_disk.h @@ -131,8 +131,9 @@ struct lustre_sb_info { char lsi_fstype[16]; struct backing_dev_info lsi_bdi; /* each client mountpoint needs own backing_dev_info */ + /* protect lsi_lwp_list */ + struct mutex lsi_lwp_mutex; struct list_head lsi_lwp_list; - spinlock_t lsi_lwp_lock; unsigned long lsi_lwp_started:1; }; diff --git a/lustre/obdclass/obd_mount.c b/lustre/obdclass/obd_mount.c index b027a8e..7b051a2 100644 --- a/lustre/obdclass/obd_mount.c +++ b/lustre/obdclass/obd_mount.c @@ -591,7 +591,7 @@ static struct lustre_sb_info *lustre_init_lsi(struct super_block *sb) /* Default umount style */ lsi->lsi_flags = LSI_UMOUNT_FAILOVER; INIT_LIST_HEAD(&lsi->lsi_lwp_list); - spin_lock_init(&lsi->lsi_lwp_lock); + mutex_init(&lsi->lsi_lwp_mutex); RETURN(lsi); } diff --git a/lustre/obdclass/obd_mount_server.c b/lustre/obdclass/obd_mount_server.c index 42af490..06575dd 100644 --- a/lustre/obdclass/obd_mount_server.c +++ b/lustre/obdclass/obd_mount_server.c @@ -506,7 +506,7 @@ struct obd_export *lustre_find_lwp_by_index(const char *dev, __u32 idx) } snprintf(lwp_name, sizeof(lwp_name), "%s-MDT%04x", fsname, idx); - spin_lock(&lsi->lsi_lwp_lock); + mutex_lock(&lsi->lsi_lwp_mutex); list_for_each_entry(lwp, &lsi->lsi_lwp_list, obd_lwp_list) { char *ptr = strstr(lwp->obd_name, lwp_name); @@ -515,7 +515,7 @@ struct obd_export *lustre_find_lwp_by_index(const char *dev, __u32 idx) break; } } - spin_unlock(&lsi->lsi_lwp_lock); + mutex_unlock(&lsi->lsi_lwp_mutex); err_lmi: server_put_mount(dev, false); @@ -676,9 +676,9 @@ static int lustre_lwp_setup(struct lustre_cfg *lcfg, struct lustre_sb_info *lsi, rc = lustre_lwp_connect(obd, strstr(lsi->lsi_svname, "-MDT") != NULL); if (rc == 0) { obd->u.cli.cl_max_mds_easize = MAX_MD_SIZE; - spin_lock(&lsi->lsi_lwp_lock); + mutex_lock(&lsi->lsi_lwp_mutex); list_add_tail(&obd->obd_lwp_list, &lsi->lsi_lwp_list); - spin_unlock(&lsi->lsi_lwp_lock); + mutex_unlock(&lsi->lsi_lwp_mutex); } else { CERROR("%s: connect failed: rc = %d\n", lwpname, rc); } @@ -946,6 +946,7 @@ static int lustre_disconnect_lwp(struct super_block *sb) if (bufs == NULL) GOTO(out, rc = -ENOMEM); + mutex_lock(&lsi->lsi_lwp_mutex); list_for_each_entry(lwp, &lsi->lsi_lwp_list, obd_lwp_list) { struct lustre_cfg *lcfg; @@ -958,8 +959,10 @@ static int lustre_disconnect_lwp(struct super_block *sb) lustre_cfg_bufs_set_string(bufs, 1, NULL); OBD_ALLOC(lcfg, lustre_cfg_len(bufs->lcfg_bufcount, bufs->lcfg_buflen)); - if (!lcfg) - GOTO(out, rc = -ENOMEM); + if (!lcfg) { + rc = -ENOMEM; + break; + } lustre_cfg_init(lcfg, LCFG_CLEANUP, bufs); /* Disconnect import first. NULL is passed for the '@env', @@ -974,6 +977,7 @@ static int lustre_disconnect_lwp(struct super_block *sb) rc1 = rc; } } + mutex_unlock(&lsi->lsi_lwp_mutex); GOTO(out, rc); @@ -999,18 +1003,23 @@ static int lustre_stop_lwp(struct super_block *sb) int rc1 = 0; ENTRY; + mutex_lock(&lsi->lsi_lwp_mutex); while (!list_empty(&lsi->lsi_lwp_list)) { lwp = list_entry(lsi->lsi_lwp_list.next, struct obd_device, obd_lwp_list); list_del_init(&lwp->obd_lwp_list); lwp->obd_force = 1; + mutex_unlock(&lsi->lsi_lwp_mutex); + rc = class_manual_cleanup(lwp); if (rc != 0) { CERROR("%s: fail to stop LWP: rc = %d\n", lwp->obd_name, rc); rc1 = rc; } + mutex_lock(&lsi->lsi_lwp_mutex); } + mutex_unlock(&lsi->lsi_lwp_mutex); RETURN(rc1 != 0 ? rc1 : rc); } -- 1.8.3.1