From 168ec247779f3ab743985bdbad605f8eacd8fc81 Mon Sep 17 00:00:00 2001 From: Mr NeilBrown Date: Fri, 7 Aug 2020 12:05:35 +1000 Subject: [PATCH] LU-9855 lustre: use with_imp_locked() more broadly. Several places in lustre take u.cli.cl_sem to protect access to u.cli.cl_import, and so could use with_imp_locked() achieving cleaner code. Using with_imp_locked() in functions calling ptlrpc_set_import_active() requires care as that function gets a write-lock on ->cl_sem. So they need to use with_imp_locked() only to get a counted reference on the imp, and must drop the lock before calling ptlrpc_set_import_active(). This patch makes those changes and also: - introduces with_imp_locked_nested() for sptlrpc_conf_client_adapt(), - re-indents obd_cleanup_client_import(), which is only tangentially related the the main purpose of this patch, - removes code in ldlm_flock_completion_ast() which takes a copy of cl_import, and doesn't use it. - adds with_imp_locked() to two functions named 'active_store' which weren't using it but should - removes with_imp_locked() from ping_show() and instead includes it in ptlrpc_obd_ping() where 'imp' is actually used. Signed-off-by: Mr NeilBrown Change-Id: I01a713c200a1698af222bc72cf4f955227a98305 Reviewed-on: https://review.whamcloud.com/39595 Reviewed-by: Andreas Dilger Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/include/lprocfs_status.h | 12 +- lustre/include/obd_class.h | 28 ++--- lustre/ldlm/ldlm_flock.c | 5 - lustre/mdc/lproc_mdc.c | 13 ++- lustre/mdc/mdc_request.c | 22 ++-- lustre/mgc/mgc_request.c | 218 ++++++++++++++++++------------------- lustre/osc/lproc_osc.c | 12 +- lustre/osc/osc_request.c | 18 ++- lustre/osp/lproc_osp.c | 27 ++--- lustre/osp/osp_dev.c | 15 ++- lustre/ptlrpc/gss/gss_cli_upcall.c | 22 ++-- lustre/ptlrpc/pinger.c | 21 ++-- lustre/ptlrpc/sec_config.c | 11 +- 13 files changed, 215 insertions(+), 209 deletions(-) diff --git a/lustre/include/lprocfs_status.h b/lustre/include/lprocfs_status.h index 2d23c81..454b487 100644 --- a/lustre/include/lprocfs_status.h +++ b/lustre/include/lprocfs_status.h @@ -648,14 +648,22 @@ extern int lprocfs_seq_release(struct inode *, struct file *); /* You must use these macros when you want to refer to * the import in a client obd_device for a lprocfs entry + * Note that it is not safe to 'goto', 'return' or 'break' + * out of the body of this statement. It *IS* safe to + * 'goto' the a label inside the statement, or to 'continue' + * to get out of the statement. */ -#define with_imp_locked(__obd, __imp, __rc) \ - for (down_read(&(__obd)->u.cli.cl_sem), \ + +#define with_imp_locked_nested(__obd, __imp, __rc, __nest) \ + for (down_read_nested(&(__obd)->u.cli.cl_sem, __nest), \ __imp = (__obd)->u.cli.cl_import, \ __rc = __imp ? 0 : -ENODEV; \ __imp ? 1 : (up_read(&(__obd)->u.cli.cl_sem), 0); \ __imp = NULL) +#define with_imp_locked(__obd, __imp, __rc) \ + with_imp_locked_nested(__obd, __imp, __rc, 0) + /* write the name##_seq_show function, call LDEBUGFS_SEQ_FOPS_RO for read-only * debugfs entries; otherwise, you will define name##_seq_write function also * for a read-write debugfs entry, and then call LDEBUGFS_SEQ_FOPS instead. diff --git a/lustre/include/obd_class.h b/lustre/include/obd_class.h index cdf9e9a..703ffaf 100644 --- a/lustre/include/obd_class.h +++ b/lustre/include/obd_class.h @@ -634,23 +634,25 @@ static inline int obd_cleanup(struct obd_device *obd) static inline void obd_cleanup_client_import(struct obd_device *obd) { - ENTRY; + ENTRY; - /* If we set up but never connected, the - client import will not have been cleaned. */ + /* If we set up but never connected, the client import will not + * have been cleaned. + */ down_write(&obd->u.cli.cl_sem); - if (obd->u.cli.cl_import) { - struct obd_import *imp; - imp = obd->u.cli.cl_import; - CDEBUG(D_CONFIG, "%s: client import never connected\n", - obd->obd_name); - ptlrpc_invalidate_import(imp); - client_destroy_import(imp); - obd->u.cli.cl_import = NULL; - } + if (obd->u.cli.cl_import) { + struct obd_import *imp; + + imp = obd->u.cli.cl_import; + CDEBUG(D_CONFIG, "%s: client import never connected\n", + obd->obd_name); + ptlrpc_invalidate_import(imp); + client_destroy_import(imp); + obd->u.cli.cl_import = NULL; + } up_write(&obd->u.cli.cl_sem); - EXIT; + EXIT; } static inline int obd_process_config(struct obd_device *obd, int datalen, diff --git a/lustre/ldlm/ldlm_flock.c b/lustre/ldlm/ldlm_flock.c index b76f0f1..089dec6 100644 --- a/lustre/ldlm/ldlm_flock.c +++ b/lustre/ldlm/ldlm_flock.c @@ -655,7 +655,6 @@ ldlm_flock_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data) { struct file_lock *getlk = lock->l_ast_data; struct obd_device *obd; - struct obd_import *imp = NULL; enum ldlm_error err; int rc = 0; ENTRY; @@ -688,10 +687,6 @@ ldlm_flock_completion_ast(struct ldlm_lock *lock, __u64 flags, void *data) "client-side enqueue returned a blocked lock, sleeping"); obd = class_exp2obd(lock->l_conn_export); - /* if this is a local lock, there is no import */ - if (obd) - imp = obd->u.cli.cl_import; - /* Go to sleep until the lock is granted. */ rc = l_wait_event_abortable(lock->l_waitq, is_granted_or_cancelled(lock)); diff --git a/lustre/mdc/lproc_mdc.c b/lustre/mdc/lproc_mdc.c index 3498334..d9962b3 100644 --- a/lustre/mdc/lproc_mdc.c +++ b/lustre/mdc/lproc_mdc.c @@ -57,6 +57,7 @@ static ssize_t active_store(struct kobject *kobj, struct attribute *attr, { struct obd_device *obd = container_of(kobj, struct obd_device, obd_kset.kobj); + struct obd_import *imp, *imp0; bool val; int rc; @@ -64,14 +65,18 @@ static ssize_t active_store(struct kobject *kobj, struct attribute *attr, if (rc) return rc; + with_imp_locked(obd, imp0, rc) + imp = class_import_get(imp0); + if (rc) + return rc; /* opposite senses */ - if (obd->u.cli.cl_import->imp_deactive == val) - rc = ptlrpc_set_import_active(obd->u.cli.cl_import, val); + if (imp->imp_deactive == val) + rc = ptlrpc_set_import_active(imp, val); else CDEBUG(D_CONFIG, "activate %u: ignoring repeat request\n", val); - - return count; + class_import_put(imp); + return rc ?: count; } LUSTRE_RW_ATTR(active); diff --git a/lustre/mdc/mdc_request.c b/lustre/mdc/mdc_request.c index 2a5b2c7..c9d99df 100644 --- a/lustre/mdc/mdc_request.c +++ b/lustre/mdc/mdc_request.c @@ -1577,27 +1577,25 @@ static int mdc_statfs_async(struct obd_export *exp, } static int mdc_statfs(const struct lu_env *env, - struct obd_export *exp, struct obd_statfs *osfs, + struct obd_export *exp, struct obd_statfs *osfs, time64_t max_age, __u32 flags) { struct obd_device *obd = class_exp2obd(exp); struct req_format *fmt; struct ptlrpc_request *req; struct obd_statfs *msfs; - struct obd_import *imp = NULL; + struct obd_import *imp, *imp0; int rc; ENTRY; - /* - * Since the request might also come from lprocfs, so we need - * sync this with client_disconnect_export Bug15684 - */ - down_read(&obd->u.cli.cl_sem); - if (obd->u.cli.cl_import) - imp = class_import_get(obd->u.cli.cl_import); - up_read(&obd->u.cli.cl_sem); - if (!imp) - RETURN(-ENODEV); + /* + * Since the request might also come from lprocfs, so we need + * sync this with client_disconnect_export Bug15684 + */ + with_imp_locked(obd, imp0, rc) + imp = class_import_get(imp0); + if (rc) + RETURN(rc); fmt = &RQF_MDS_STATFS; if ((exp_connect_flags2(exp) & OBD_CONNECT2_SUM_STATFS) && diff --git a/lustre/mgc/mgc_request.c b/lustre/mgc/mgc_request.c index dd51f8f..0d06d75 100644 --- a/lustre/mgc/mgc_request.c +++ b/lustre/mgc/mgc_request.c @@ -1426,6 +1426,7 @@ static int mgc_apply_recover_logs(struct obd_device *mgc, int entry_len = sizeof(*entry); int is_ost; struct obd_device *obd; + struct obd_import *imp; char *obdname; char *cname; char *params; @@ -1460,119 +1461,116 @@ static int mgc_apply_recover_logs(struct obd_device *mgc, if (entry->mne_length < entry_len) break; - off += entry->mne_length; - datalen -= entry->mne_length; - if (datalen < 0) - break; - - if (entry->mne_version > max_version) { - CERROR("entry index(%lld) is over max_index(%lld)\n", - entry->mne_version, max_version); - break; - } - - if (prev_version >= entry->mne_version) { - CERROR("index unsorted, prev %lld, now %lld\n", - prev_version, entry->mne_version); - break; - } - prev_version = entry->mne_version; + off += entry->mne_length; + datalen -= entry->mne_length; + if (datalen < 0) + break; - /* - * Write a string with format "nid::instance" to - * lustre//--/import. - */ + if (entry->mne_version > max_version) { + CERROR("entry index(%lld) is over max_index(%lld)\n", + entry->mne_version, max_version); + break; + } - is_ost = entry->mne_type == LDD_F_SV_TYPE_OST; - memset(buf, 0, bufsz); - obdname = buf; - pos = 0; - - /* lustre-OST0001-osc- */ - strcpy(obdname, cld->cld_logname); - cname = strrchr(obdname, '-'); - if (cname == NULL) { - CERROR("mgc %s: invalid logname %s\n", - mgc->obd_name, obdname); - break; - } + if (prev_version >= entry->mne_version) { + CERROR("index unsorted, prev %lld, now %lld\n", + prev_version, entry->mne_version); + break; + } + prev_version = entry->mne_version; - pos = cname - obdname; - obdname[pos] = 0; - pos += sprintf(obdname + pos, "-%s%04x", - is_ost ? "OST" : "MDT", entry->mne_index); + /* + * Write a string with format "nid::instance" to + * lustre//--/import. + */ - cname = is_ost ? "osc" : "mdc", - pos += sprintf(obdname + pos, "-%s-%s", cname, inst); - lustre_cfg_bufs_reset(&bufs, obdname); + is_ost = entry->mne_type == LDD_F_SV_TYPE_OST; + memset(buf, 0, bufsz); + obdname = buf; + pos = 0; + + /* lustre-OST0001-osc- */ + strcpy(obdname, cld->cld_logname); + cname = strrchr(obdname, '-'); + if (cname == NULL) { + CERROR("mgc %s: invalid logname %s\n", + mgc->obd_name, obdname); + break; + } - /* find the obd by obdname */ - obd = class_name2obd(obdname); - if (obd == NULL) { - CDEBUG(D_INFO, "mgc %s: cannot find obdname %s\n", - mgc->obd_name, obdname); - rc = 0; - /* this is a safe race, when the ost is starting up...*/ - continue; - } + pos = cname - obdname; + obdname[pos] = 0; + pos += sprintf(obdname + pos, "-%s%04x", + is_ost ? "OST" : "MDT", entry->mne_index); - /* osc.import = "connection=::" */ - ++pos; - params = buf + pos; - pos += sprintf(params, "%s.import=%s", cname, "connection="); - uuid = buf + pos; + cname = is_ost ? "osc" : "mdc", + pos += sprintf(obdname + pos, "-%s-%s", cname, inst); + lustre_cfg_bufs_reset(&bufs, obdname); - down_read(&obd->u.cli.cl_sem); - if (obd->u.cli.cl_import == NULL) { - /* client does not connect to the OST yet */ - up_read(&obd->u.cli.cl_sem); + /* find the obd by obdname */ + obd = class_name2obd(obdname); + if (obd == NULL) { + CDEBUG(D_INFO, "mgc %s: cannot find obdname %s\n", + mgc->obd_name, obdname); rc = 0; + /* this is a safe race, when the ost is starting up...*/ continue; } - /* iterate all nids to find one */ - /* find uuid by nid */ - /* create import entries if they don't exist */ - rc = -ENOENT; - rc = client_import_add_nids_to_conn(obd->u.cli.cl_import, - entry->u.nids, - entry->mne_nid_count, - (struct obd_uuid *)uuid); - - if (rc == -ENOENT && dynamic_nids) { - /* create a new connection for this import */ - char *primary_nid = libcfs_nid2str(entry->u.nids[0]); - int prim_nid_len = strlen(primary_nid) + 1; - struct obd_uuid server_uuid; - - if (prim_nid_len > UUID_MAX) - goto fail; - strncpy(server_uuid.uuid, primary_nid, prim_nid_len); - - CDEBUG(D_INFO, "Adding a connection for %s\n", - primary_nid); - - rc = client_import_dyn_add_conn(obd->u.cli.cl_import, - &server_uuid, - entry->u.nids[0], 1); - if (rc < 0) { - CERROR("%s: Failed to add new connection with NID '%s' to import: rc = %d\n", - obd->obd_name, primary_nid, rc); - goto fail; - } - rc = client_import_add_nids_to_conn(obd->u.cli.cl_import, - entry->u.nids, - entry->mne_nid_count, - (struct obd_uuid *)uuid); - if (rc < 0) { - CERROR("%s: failed to lookup UUID: rc = %d\n", - obd->obd_name, rc); - goto fail; + /* osc.import = "connection=::" */ + ++pos; + params = buf + pos; + pos += sprintf(params, "%s.import=%s", cname, "connection="); + uuid = buf + pos; + + with_imp_locked(obd, imp, rc) { + /* iterate all nids to find one */ + /* find uuid by nid */ + /* create import entries if they don't exist */ + rc = client_import_add_nids_to_conn( + imp, entry->u.nids, entry->mne_nid_count, + (struct obd_uuid *)uuid); + + if (rc == -ENOENT && dynamic_nids) { + /* create a new connection for this import */ + char *primary_nid = + libcfs_nid2str(entry->u.nids[0]); + int prim_nid_len = strlen(primary_nid) + 1; + struct obd_uuid server_uuid; + + if (prim_nid_len > UUID_MAX) + goto fail; + strncpy(server_uuid.uuid, primary_nid, + prim_nid_len); + + CDEBUG(D_INFO, "Adding a connection for %s\n", + primary_nid); + + rc = client_import_dyn_add_conn( + imp, &server_uuid, entry->u.nids[0], 1); + if (rc < 0) { + CERROR("%s: Failed to add new connection with NID '%s' to import: rc = %d\n", + obd->obd_name, primary_nid, rc); + goto fail; + } + rc = client_import_add_nids_to_conn( + imp, entry->u.nids, + entry->mne_nid_count, + (struct obd_uuid *)uuid); + if (rc < 0) { + CERROR("%s: failed to lookup UUID: rc = %d\n", + obd->obd_name, rc); + goto fail; + } } +fail:; + } + if (rc == -ENODEV) { + /* client does not connect to the OST yet */ + rc = 0; + continue; } -fail: - up_read(&obd->u.cli.cl_sem); if (rc < 0 && rc != -ENOSPC) { CERROR("mgc: cannot find UUID by nid '%s': rc = %d\n", libcfs_nid2str(entry->u.nids[0]), rc); @@ -1582,11 +1580,11 @@ fail: CDEBUG(D_INFO, "Found UUID '%s' by NID '%s'\n", uuid, libcfs_nid2str(entry->u.nids[0])); - pos += strlen(uuid); - pos += sprintf(buf + pos, "::%u", entry->mne_instance); - LASSERT(pos < bufsz); + pos += strlen(uuid); + pos += sprintf(buf + pos, "::%u", entry->mne_instance); + LASSERT(pos < bufsz); - lustre_cfg_bufs_set_string(&bufs, 1, params); + lustre_cfg_bufs_set_string(&bufs, 1, params); OBD_ALLOC(lcfg, lustre_cfg_len(bufs.lcfg_bufcount, bufs.lcfg_buflen)); @@ -1597,17 +1595,17 @@ fail: lustre_cfg_init(lcfg, LCFG_PARAM, &bufs); CDEBUG(D_INFO, "ir apply logs %lld/%lld for %s -> %s\n", - prev_version, max_version, obdname, params); + prev_version, max_version, obdname, params); - rc = class_process_config(lcfg); + rc = class_process_config(lcfg); OBD_FREE(lcfg, lustre_cfg_len(lcfg->lcfg_bufcount, lcfg->lcfg_buflens)); - if (rc) - CDEBUG(D_INFO, "process config for %s error %d\n", - obdname, rc); + if (rc) + CDEBUG(D_INFO, "process config for %s error %d\n", + obdname, rc); - /* continue, even one with error */ - } + /* continue, even one with error */ + } OBD_FREE(inst, PAGE_SIZE); RETURN(rc); diff --git a/lustre/osc/lproc_osc.c b/lustre/osc/lproc_osc.c index 3bd71dd..ab5d2c5 100644 --- a/lustre/osc/lproc_osc.c +++ b/lustre/osc/lproc_osc.c @@ -60,6 +60,7 @@ static ssize_t active_store(struct kobject *kobj, struct attribute *attr, { struct obd_device *obd = container_of(kobj, struct obd_device, obd_kset.kobj); + struct obd_import *imp, *imp0; bool val; int rc; @@ -67,14 +68,19 @@ static ssize_t active_store(struct kobject *kobj, struct attribute *attr, if (rc) return rc; + with_imp_locked(obd, imp0, rc) + imp = class_import_get(imp0); + if (rc) + return rc; /* opposite senses */ - if (obd->u.cli.cl_import->imp_deactive == val) - rc = ptlrpc_set_import_active(obd->u.cli.cl_import, val); + if (imp->imp_deactive == val) + rc = ptlrpc_set_import_active(imp, val); else CDEBUG(D_CONFIG, "activate %u: ignoring repeat request\n", (unsigned int)val); + class_import_put(imp); - return count; + return rc ?: count; } LUSTRE_RW_ATTR(active); diff --git a/lustre/osc/osc_request.c b/lustre/osc/osc_request.c index d6e5718..b548e08 100644 --- a/lustre/osc/osc_request.c +++ b/lustre/osc/osc_request.c @@ -3035,19 +3035,17 @@ static int osc_statfs(const struct lu_env *env, struct obd_export *exp, struct obd_device *obd = class_exp2obd(exp); struct obd_statfs *msfs; struct ptlrpc_request *req; - struct obd_import *imp = NULL; + struct obd_import *imp, *imp0; int rc; ENTRY; - - /*Since the request might also come from lprocfs, so we need - *sync this with client_disconnect_export Bug15684*/ - down_read(&obd->u.cli.cl_sem); - if (obd->u.cli.cl_import) - imp = class_import_get(obd->u.cli.cl_import); - up_read(&obd->u.cli.cl_sem); - if (!imp) - RETURN(-ENODEV); + /*Since the request might also come from lprocfs, so we need + *sync this with client_disconnect_export Bug15684 + */ + with_imp_locked(obd, imp0, rc) + imp = class_import_get(imp0); + if (rc) + RETURN(rc); /* We could possibly pass max_age in the request (as an absolute * timestamp or a "seconds.usec ago") so the target can avoid doing diff --git a/lustre/osp/lproc_osp.c b/lustre/osp/lproc_osp.c index 08ec720..19a3e98 100644 --- a/lustre/osp/lproc_osp.c +++ b/lustre/osp/lproc_osp.c @@ -80,7 +80,7 @@ static ssize_t active_store(struct kobject *kobj, struct attribute *attr, dd_kobj); struct lu_device *lu = dt2lu_dev(dt); struct obd_device *obd = lu->ld_obd; - struct obd_import *imp; + struct obd_import *imp, *imp0; bool val; int rc; @@ -88,15 +88,18 @@ static ssize_t active_store(struct kobject *kobj, struct attribute *attr, if (rc) return rc; - with_imp_locked(obd, imp, rc) { - /* opposite senses */ - if (obd->u.cli.cl_import->imp_deactive == val) - rc = ptlrpc_set_import_active(imp, val); - else - CDEBUG(D_CONFIG, - "activate %u: ignoring repeat request\n", - (unsigned int)val); - } + with_imp_locked(obd, imp0, rc) + imp = class_import_get(imp0); + if (rc) + return rc; + /* opposite senses */ + if (imp->imp_deactive == val) + rc = ptlrpc_set_import_active(imp, val); + else + CDEBUG(D_CONFIG, "activate %u: ignoring repeat request\n", + (unsigned int)val); + + class_import_put(imp); return rc ?: count; } @@ -758,11 +761,9 @@ ssize_t ping_show(struct kobject *kobj, struct attribute *attr, dd_kobj); struct lu_device *lu = dt2lu_dev(dt); struct obd_device *obd = lu->ld_obd; - struct obd_import *imp; int rc; - with_imp_locked(obd, imp, rc) - rc = ptlrpc_obd_ping(obd); + rc = ptlrpc_obd_ping(obd); return rc; } diff --git a/lustre/osp/osp_dev.c b/lustre/osp/osp_dev.c index 0690c30..4f520b7 100644 --- a/lustre/osp/osp_dev.c +++ b/lustre/osp/osp_dev.c @@ -1530,19 +1530,18 @@ static int osp_obd_statfs(const struct lu_env *env, struct obd_export *exp, { struct obd_statfs *msfs; struct ptlrpc_request *req; - struct obd_import *imp = NULL; + struct obd_import *imp = NULL, *imp0; int rc; ENTRY; /* Since the request might also come from lprocfs, so we need - * sync this with client_disconnect_export Bug15684 */ - down_read(&exp->exp_obd->u.cli.cl_sem); - if (exp->exp_obd->u.cli.cl_import) - imp = class_import_get(exp->exp_obd->u.cli.cl_import); - up_read(&exp->exp_obd->u.cli.cl_sem); - if (!imp) - RETURN(-ENODEV); + * sync this with client_disconnect_export Bug15684 + */ + with_imp_locked(exp->exp_obd, imp0, rc) + imp = class_import_get(imp0); + if (rc) + RETURN(rc); req = ptlrpc_request_alloc(imp, &RQF_OST_STATFS); diff --git a/lustre/ptlrpc/gss/gss_cli_upcall.c b/lustre/ptlrpc/gss/gss_cli_upcall.c index 70d4711..9c86e6d 100644 --- a/lustre/ptlrpc/gss/gss_cli_upcall.c +++ b/lustre/ptlrpc/gss/gss_cli_upcall.c @@ -230,13 +230,13 @@ struct lgssd_ioctl_param { int gss_do_ctx_init_rpc(char __user *buffer, unsigned long count) { - struct obd_import *imp; - struct ptlrpc_request *req; - struct lgssd_ioctl_param param; - struct obd_device *obd; - char obdname[64]; - long lsize; - int rc; + struct obd_import *imp, *imp0; + struct ptlrpc_request *req; + struct lgssd_ioctl_param param; + struct obd_device *obd; + char obdname[64]; + long lsize; + int rc; if (count != sizeof(param)) { CERROR("ioctl size %lu, expect %lu, please check lgss_keyring " @@ -289,14 +289,12 @@ int gss_do_ctx_init_rpc(char __user *buffer, unsigned long count) } spin_unlock(&obd->obd_dev_lock); - down_read(&obd->u.cli.cl_sem); - if (obd->u.cli.cl_import == NULL) { + with_imp_locked(obd, imp0, rc) + imp = class_import_get(imp0); + if (rc) { CERROR("obd %s: import has gone\n", obd->obd_name); - up_read(&obd->u.cli.cl_sem); RETURN(-EINVAL); } - imp = class_import_get(obd->u.cli.cl_import); - up_read(&obd->u.cli.cl_sem); if (imp->imp_deactive) { CERROR("import has been deactivated\n"); diff --git a/lustre/ptlrpc/pinger.c b/lustre/ptlrpc/pinger.c index 1c47ab7..2f41fde 100644 --- a/lustre/ptlrpc/pinger.c +++ b/lustre/ptlrpc/pinger.c @@ -74,19 +74,20 @@ int ptlrpc_obd_ping(struct obd_device *obd) { int rc; struct ptlrpc_request *req; + struct obd_import *imp; ENTRY; - req = ptlrpc_prep_ping(obd->u.cli.cl_import); - if (!req) - RETURN(-ENOMEM); - - req->rq_send_state = LUSTRE_IMP_FULL; - - rc = ptlrpc_queue_wait(req); - - ptlrpc_req_finished(req); - + with_imp_locked(obd, imp, rc) { + req = ptlrpc_prep_ping(imp); + if (!req) { + rc = -ENOMEM; + continue; + } + req->rq_send_state = LUSTRE_IMP_FULL; + rc = ptlrpc_queue_wait(req); + ptlrpc_req_finished(req); + } RETURN(rc); } EXPORT_SYMBOL(ptlrpc_obd_ping); diff --git a/lustre/ptlrpc/sec_config.c b/lustre/ptlrpc/sec_config.c index 22a230e..c507ea1 100644 --- a/lustre/ptlrpc/sec_config.c +++ b/lustre/ptlrpc/sec_config.c @@ -895,8 +895,9 @@ void sptlrpc_target_choose_flavor(struct sptlrpc_rule_set *rset, */ void sptlrpc_conf_client_adapt(struct obd_device *obd) { - struct obd_import *imp; - ENTRY; + struct obd_import *imp; + int rc; + ENTRY; LASSERT(strcmp(obd->obd_type->typ_name, LUSTRE_MDC_NAME) == 0 || strcmp(obd->obd_type->typ_name, LUSTRE_OSC_NAME) == 0 || @@ -905,10 +906,7 @@ void sptlrpc_conf_client_adapt(struct obd_device *obd) CDEBUG(D_SEC, "obd %s\n", obd->u.cli.cl_target_uuid.uuid); /* serialize with connect/disconnect import */ - down_read_nested(&obd->u.cli.cl_sem, OBD_CLI_SEM_MDCOSC); - - imp = obd->u.cli.cl_import; - if (imp) { + with_imp_locked_nested(obd, imp, rc, OBD_CLI_SEM_MDCOSC) { write_lock(&imp->imp_sec_lock); if (imp->imp_sec) imp->imp_sec_expire = ktime_get_real_seconds() + @@ -916,7 +914,6 @@ void sptlrpc_conf_client_adapt(struct obd_device *obd) write_unlock(&imp->imp_sec_lock); } - up_read(&obd->u.cli.cl_sem); EXIT; } EXPORT_SYMBOL(sptlrpc_conf_client_adapt); -- 1.8.3.1