lustre_sb_info.lsi_lwp_list should be acessed with lock, and
some place may sleep, change lsi_lwp_lock from spinlock to mutex.
Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: Ifc3622eb28cd6cf49661b14fc10e98aa689a58dc
Reviewed-on: https://review.whamcloud.com/36003
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Wang Shilong <wshilong@ddn.com>
Reviewed-by: Li Xi <lixi@ddn.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
char lsi_fstype[16];
struct backing_dev_info lsi_bdi; /* each client mountpoint needs
own backing_dev_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;
struct list_head lsi_lwp_list;
- spinlock_t lsi_lwp_lock;
unsigned long lsi_lwp_started:1,
lsi_server_started:1;
};
unsigned long lsi_lwp_started:1,
lsi_server_started:1;
};
/* Default umount style */
lsi->lsi_flags = LSI_UMOUNT_FAILOVER;
INIT_LIST_HEAD(&lsi->lsi_lwp_list);
/* 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);
}
snprintf(lwp_name, sizeof(lwp_name), "%s-MDT%04x", fsname, 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);
list_for_each_entry(lwp, &lsi->lsi_lwp_list, obd_lwp_list) {
char *ptr = strstr(lwp->obd_name, lwp_name);
- spin_unlock(&lsi->lsi_lwp_lock);
+ mutex_unlock(&lsi->lsi_lwp_mutex);
err_lmi:
server_put_mount(dev, false);
err_lmi:
server_put_mount(dev, false);
rc = lustre_lwp_connect(obd, strstr(lsi->lsi_svname, "-MDT") != NULL);
if (rc == 0) {
obd->u.cli.cl_max_mds_easize = MAX_MD_SIZE;
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);
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);
}
} else {
CERROR("%s: connect failed: rc = %d\n", lwpname, rc);
}
if (bufs == NULL)
GOTO(out, rc = -ENOMEM);
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;
list_for_each_entry(lwp, &lsi->lsi_lwp_list, obd_lwp_list) {
struct lustre_cfg *lcfg;
lustre_cfg_bufs_set_string(bufs, 1, NULL);
OBD_ALLOC(lcfg, lustre_cfg_len(bufs->lcfg_bufcount,
bufs->lcfg_buflen));
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',
lustre_cfg_init(lcfg, LCFG_CLEANUP, bufs);
/* Disconnect import first. NULL is passed for the '@env',
+ mutex_unlock(&lsi->lsi_lwp_mutex);
+ 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;
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;
}
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);
}
RETURN(rc1 != 0 ? rc1 : rc);
}