Whamcloud - gitweb
LU-4456 osp: extra check for opd_pre
[fs/lustre-release.git] / lustre / osp / osp_dev.c
index e41133f..5828d88 100644 (file)
@@ -352,12 +352,12 @@ static int osp_shutdown(const struct lu_env *env, struct osp_device *d)
        rc = osp_disconnect(d);
 
        if (!d->opd_connect_mdt) {
-               /* stop precreate thread */
-               osp_precreate_fini(d);
-
                /* stop sync thread */
                osp_sync_fini(d);
 
+               /* stop precreate thread */
+               osp_precreate_fini(d);
+
                /* release last_used file */
                osp_last_used_fini(env, d);
        }
@@ -371,7 +371,7 @@ static int osp_process_config(const struct lu_env *env,
                              struct lu_device *dev, struct lustre_cfg *lcfg)
 {
        struct osp_device               *d = lu2osp_dev(dev);
-       struct obd_device               *obd = d->opd_obd;
+       struct lprocfs_static_vars       lvars = { 0 };
        int                              rc;
 
        ENTRY;
@@ -385,9 +385,11 @@ static int osp_process_config(const struct lu_env *env,
                rc = osp_shutdown(env, d);
                break;
        case LCFG_PARAM:
-               LASSERT(obd);
-               rc = class_process_proc_seq_param(PARAM_OSC, obd->obd_vars,
-                                                 lcfg, obd);
+               lprocfs_osp_init_vars(&lvars);
+
+               LASSERT(d->opd_obd);
+               rc = class_process_proc_param(PARAM_OSC, lvars.obd_vars,
+                                             lcfg, d->opd_obd);
                if (rc > 0)
                        rc = 0;
                if (rc == -ENOSYS) {
@@ -840,9 +842,6 @@ static struct lu_device *osp_device_fini(const struct lu_env *env,
                        OBD_FREE_PTR(cli->cl_rpc_lock);
                        cli->cl_rpc_lock = NULL;
                }
-       } else {
-               if (m->opd_obd->obd_proc_private != NULL)
-                       lprocfs_remove((struct proc_dir_entry **)&m->opd_obd->obd_proc_private);
        }
 
        rc = client_obd_cleanup(m->opd_obd);
@@ -864,8 +863,6 @@ static int osp_reconnect(const struct lu_env *env,
 
 static int osp_prepare_fid_client(struct osp_device *osp)
 {
-       int rc;
-
        LASSERT(osp->opd_obd->u.cli.cl_seq != NULL);
        if (osp->opd_obd->u.cli.cl_seq->lcs_exp != NULL)
                return 0;
@@ -873,19 +870,6 @@ static int osp_prepare_fid_client(struct osp_device *osp)
        LASSERT(osp->opd_exp != NULL);
        osp->opd_obd->u.cli.cl_seq->lcs_exp =
                                class_export_get(osp->opd_exp);
-       if (osp->opd_pre == NULL)
-               return 0;
-
-       /* Init fid for osp_precreate if necessary */
-       rc = osp_init_pre_fid(osp);
-       if (rc != 0) {
-               class_export_put(osp->opd_exp);
-               osp->opd_obd->u.cli.cl_seq->lcs_exp = NULL;
-               CERROR("%s: init pre fid error: rc = %d\n",
-                      osp->opd_obd->obd_name, rc);
-               return rc;
-       }
-
        return 0;
 }
 
@@ -1236,25 +1220,33 @@ struct llog_operations osp_mds_ost_orig_logops;
 
 static int __init osp_mod_init(void)
 {
-       int rc;
+       struct lprocfs_static_vars       lvars;
+       cfs_proc_dir_entry_t            *osc_proc_dir;
+       int                              rc;
 
        rc = lu_kmem_init(osp_caches);
        if (rc)
                return rc;
 
+       lprocfs_osp_init_vars(&lvars);
+
        rc = class_register_type(&osp_obd_device_ops, NULL, NULL,
 #ifndef HAVE_ONLY_PROCFS_SEQ
-                               NULL,
+                               lvars.module_vars,
 #endif
                                LUSTRE_OSP_NAME, &osp_device_type);
+
+       /* create "osc" entry in procfs for compatibility purposes */
        if (rc != 0) {
                lu_kmem_fini(osp_caches);
                return rc;
        }
 
+       lprocfs_lwp_init_vars(&lvars);
+
        rc = class_register_type(&lwp_obd_device_ops, NULL, NULL,
 #ifndef HAVE_ONLY_PROCFS_SEQ
-                               NULL,
+                               lvars.module_vars,
 #endif
                                LUSTRE_LWP_NAME, &lwp_device_type);
        if (rc != 0) {
@@ -1267,11 +1259,22 @@ static int __init osp_mod_init(void)
        osp_mds_ost_orig_logops = llog_osd_ops;
        osp_mds_ost_orig_logops.lop_add = llog_cat_add_rec;
        osp_mds_ost_orig_logops.lop_declare_add = llog_cat_declare_add_rec;
+
+       osc_proc_dir = lprocfs_srch(proc_lustre_root, "osc");
+       if (osc_proc_dir == NULL) {
+               osc_proc_dir = lprocfs_register("osc", proc_lustre_root, NULL,
+                                               NULL);
+               if (IS_ERR(osc_proc_dir))
+                       CERROR("osp: can't create compat entry \"osc\": %d\n",
+                              (int) PTR_ERR(osc_proc_dir));
+       }
        return rc;
 }
 
 static void __exit osp_mod_exit(void)
 {
+       lprocfs_try_remove_proc_entry("osc", proc_lustre_root);
+
        class_unregister_type(LUSTRE_LWP_NAME);
        class_unregister_type(LUSTRE_OSP_NAME);
        lu_kmem_fini(osp_caches);