Whamcloud - gitweb
LU-8900 snapshot: simulate readonly device
[fs/lustre-release.git] / lustre / mdd / mdd_device.c
index 7192e6c..ca63154 100644 (file)
@@ -881,7 +881,11 @@ static void mdd_device_shutdown(const struct lu_env *env, struct mdd_device *m,
        mdd_changelog_fini(env, m);
        orph_index_fini(env, m);
        mdd_dot_lustre_cleanup(env, m);
-       nm_config_file_deregister_tgt(env, mdd2obd_dev(m)->u.obt.obt_nodemap_config_file);
+       if (mdd2obd_dev(m)->u.obt.obt_nodemap_config_file) {
+               nm_config_file_deregister_tgt(env,
+                               mdd2obd_dev(m)->u.obt.obt_nodemap_config_file);
+               mdd2obd_dev(m)->u.obt.obt_nodemap_config_file = NULL;
+       }
        if (m->mdd_los != NULL) {
                local_oid_storage_fini(env, m->mdd_los);
                m->mdd_los = NULL;
@@ -946,7 +950,8 @@ static int mdd_recovery_complete(const struct lu_env *env,
        next = &mdd->mdd_child->dd_lu_dev;
 
         /* XXX: orphans handling. */
-        mdd_orphan_cleanup(env, mdd);
+       if (!mdd->mdd_bottom->dd_rdonly)
+               mdd_orphan_cleanup(env, mdd);
         rc = next->ld_ops->ldo_recovery_complete(env, next);
 
         RETURN(rc);
@@ -999,6 +1004,7 @@ static int mdd_prepare(const struct lu_env *env,
        struct mdd_device *mdd = lu2mdd_dev(cdev);
        struct lu_device *next = &mdd->mdd_child->dd_lu_dev;
        struct nm_config_file *nodemap_config;
+       struct obd_device_target *obt = &mdd2obd_dev(mdd)->u.obt;
        struct lu_fid fid;
        int rc;
 
@@ -1062,10 +1068,13 @@ static int mdd_prepare(const struct lu_env *env,
 
        nodemap_config = nm_config_file_register_tgt(env, mdd->mdd_bottom,
                                                     mdd->mdd_los);
-       if (IS_ERR(nodemap_config))
-               GOTO(out_hsm, rc = PTR_ERR(nodemap_config));
-
-       mdd2obd_dev(mdd)->u.obt.obt_nodemap_config_file = nodemap_config;
+       if (IS_ERR(nodemap_config)) {
+               rc = PTR_ERR(nodemap_config);
+               if (rc != -EROFS)
+                       GOTO(out_hsm, rc);
+       } else {
+               obt->obt_nodemap_config_file = nodemap_config;
+       }
 
        rc = lfsck_register(env, mdd->mdd_bottom, mdd->mdd_child,
                            mdd2obd_dev(mdd), mdd_lfsck_out_notify,
@@ -1088,8 +1097,8 @@ static int mdd_prepare(const struct lu_env *env,
 out_lfsck:
        lfsck_degister(env, mdd->mdd_bottom);
 out_nodemap:
-       nm_config_file_deregister_tgt(env, mdd2obd_dev(mdd)->u.obt.obt_nodemap_config_file);
-       mdd2obd_dev(mdd)->u.obt.obt_nodemap_config_file = NULL;
+       nm_config_file_deregister_tgt(env, obt->obt_nodemap_config_file);
+       obt->obt_nodemap_config_file = NULL;
 out_hsm:
        mdd_hsm_actions_llog_fini(env, mdd);
 out_changelog: