Whamcloud - gitweb
LU-2844 mdd: mdt prepare failure should not oops
authorLai Siyao <lai.siyao@intel.com>
Fri, 22 Feb 2013 14:35:29 +0000 (22:35 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Wed, 27 Feb 2013 05:53:32 +0000 (00:53 -0500)
If mdd prepare fails, lfsck data may not be initialized, mdd
lfsck stop should check this flag.

Add one test to fail mdt prepare, and system should not oops
upon this failure.

Signed-off-by: Lai Siyao <lai.siyao@intel.com>
Change-Id: Ie3e81a2a18aedaa47965800881292c122937506a
Reviewed-on: http://review.whamcloud.com/5519
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Ned Bass <bass6@llnl.gov>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/include/obd_support.h
lustre/mdd/mdd_device.c
lustre/mdd/mdd_lfsck.c
lustre/obdclass/obd_mount.c
lustre/tests/recovery-small.sh

index e8c8b09..eeef78b 100644 (file)
@@ -241,6 +241,7 @@ int obd_alloc_fail(const void *ptr, const char *name, const char *type,
 #define OBD_FAIL_MDS_HSM_CT_UNREGISTER_NET     0x14e
 #define OBD_FAIL_MDS_SWAP_LAYOUTS_NET          0x14f
 #define OBD_FAIL_MDS_HSM_ACTION_NET            0x150
 #define OBD_FAIL_MDS_HSM_CT_UNREGISTER_NET     0x14e
 #define OBD_FAIL_MDS_SWAP_LAYOUTS_NET          0x14f
 #define OBD_FAIL_MDS_HSM_ACTION_NET            0x150
+#define OBD_FAIL_MDS_CHANGELOG_INIT            0x151
 
 /* layout lock */
 #define OBD_FAIL_MDS_NO_LL_GETATTR      0x170
 
 /* layout lock */
 #define OBD_FAIL_MDS_NO_LL_GETATTR      0x170
index 639b688..06db993 100644 (file)
@@ -293,6 +293,12 @@ static int mdd_changelog_llog_init(const struct lu_env *env,
        struct llog_ctxt        *ctxt = NULL, *uctxt = NULL;
        int                      rc;
 
        struct llog_ctxt        *ctxt = NULL, *uctxt = NULL;
        int                      rc;
 
+       ENTRY;
+
+       /* LU-2844 mdd setup failure should not cause umount oops */
+       if (OBD_FAIL_CHECK(OBD_FAIL_MDS_CHANGELOG_INIT))
+               RETURN(-EIO);
+
        OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
        obd->obd_lvfs_ctxt.dt = mdd->mdd_bottom;
        rc = llog_setup(env, obd, &obd->obd_olg, LLOG_CHANGELOG_ORIG_CTXT,
        OBD_SET_CTXT_MAGIC(&obd->obd_lvfs_ctxt);
        obd->obd_lvfs_ctxt.dt = mdd->mdd_bottom;
        rc = llog_setup(env, obd, &obd->obd_olg, LLOG_CHANGELOG_ORIG_CTXT,
index c31f3ad..152a2d4 100644 (file)
@@ -2893,6 +2893,9 @@ int mdd_lfsck_stop(const struct lu_env *env, struct md_lfsck *lfsck,
        struct l_wait_info    lwi    = { 0 };
        ENTRY;
 
        struct l_wait_info    lwi    = { 0 };
        ENTRY;
 
+       if (!lfsck->ml_initialized)
+               RETURN(0);
+
        mutex_lock(&lfsck->ml_mutex);
        spin_lock(&lfsck->ml_lock);
        if (thread_is_init(thread) || thread_is_stopped(thread)) {
        mutex_lock(&lfsck->ml_mutex);
        spin_lock(&lfsck->ml_lock);
        if (thread_is_init(thread) || thread_is_stopped(thread)) {
index 83bb072..55096da 100644 (file)
@@ -1888,7 +1888,7 @@ static int server_start_targets(struct super_block *sb, struct vfsmount *mnt)
                        lu_context_enter(&session_ctx);
                        env.le_ses = &session_ctx;
 
                        lu_context_enter(&session_ctx);
                        env.le_ses = &session_ctx;
 
-                       dev->ld_ops->ldo_prepare(&env, NULL, dev);
+                       rc = dev->ld_ops->ldo_prepare(&env, NULL, dev);
 
                        lu_env_fini(&env);
                        lu_context_exit(&session_ctx);
 
                        lu_env_fini(&env);
                        lu_context_exit(&session_ctx);
index 3f4a5cb..c2cbac1 100755 (executable)
@@ -1761,6 +1761,18 @@ test_110f () {
 }
 run_test 110f "remove remote directory: drop slave rep"
 
 }
 run_test 110f "remove remote directory: drop slave rep"
 
+# LU-2844 mdt prepare fail should not cause umount oops
+test_111 () {
+       local mdsdev=$(mdsdevname ${SINGLEMDS//mds/})
+#define OBD_FAIL_MDS_CHANGELOG_INIT 0x151
+       do_facet $SINGLEMDS lctl set_param fail_loc=0x151
+       stop $SINGLEMDS || error "stop MDS failed"
+       start $SINGLEMDS $mdsdev && error "start MDS should fail"
+       do_facet $SINGLEMDS lctl set_param fail_loc=0
+       start $SINGLEMDS $mdsdev || error "start MDS failed"
+}
+run_test 111 "mdd setup fail should not cause umount oops"
+
 complete $SECONDS
 check_and_cleanup_lustre
 exit_status
 complete $SECONDS
 check_and_cleanup_lustre
 exit_status