Whamcloud - gitweb
LU-9855 lustre: use with_imp_locked() more broadly. 95/39595/11
authorMr NeilBrown <neilb@suse.de>
Fri, 7 Aug 2020 02:05:35 +0000 (12:05 +1000)
committerOleg Drokin <green@whamcloud.com>
Wed, 10 Mar 2021 08:03:42 +0000 (08:03 +0000)
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 <neilb@suse.de>
Change-Id: I01a713c200a1698af222bc72cf4f955227a98305
Reviewed-on: https://review.whamcloud.com/39595
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
13 files changed:
lustre/include/lprocfs_status.h
lustre/include/obd_class.h
lustre/ldlm/ldlm_flock.c
lustre/mdc/lproc_mdc.c
lustre/mdc/mdc_request.c
lustre/mgc/mgc_request.c
lustre/osc/lproc_osc.c
lustre/osc/osc_request.c
lustre/osp/lproc_osp.c
lustre/osp/osp_dev.c
lustre/ptlrpc/gss/gss_cli_upcall.c
lustre/ptlrpc/pinger.c
lustre/ptlrpc/sec_config.c

index 2d23c81..454b487 100644 (file)
@@ -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.
index cdf9e9a..703ffaf 100644 (file)
@@ -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,
index b76f0f1..089dec6 100644 (file)
@@ -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));
index 3498334..d9962b3 100644 (file)
@@ -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);
 
index 2a5b2c7..c9d99df 100644 (file)
@@ -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) &&
index dd51f8f..0d06d75 100644 (file)
@@ -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/<osc|mdc>/<target>-<osc|mdc>-<instance>/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-<instance #> */
-                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/<osc|mdc>/<target>-<osc|mdc>-<instance>/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-<instance #> */
+               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=<Conn UUID>::<target instance>" */
-                ++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=<Conn UUID>::<target instance>" */
+               ++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);
index 3bd71dd..ab5d2c5 100644 (file)
@@ -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);
 
index d6e5718..b548e08 100644 (file)
@@ -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
index 08ec720..19a3e98 100644 (file)
@@ -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;
 }
index 0690c30..4f520b7 100644 (file)
@@ -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);
 
index 70d4711..9c86e6d 100644 (file)
@@ -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");
index 1c47ab7..2f41fde 100644 (file)
@@ -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);
index 22a230e..c507ea1 100644 (file)
@@ -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);