Whamcloud - gitweb
LU-10321 lfsck: not start lfsck during umount 14/30514/3
authorFan Yong <fan.yong@intel.com>
Wed, 13 Dec 2017 05:50:11 +0000 (13:50 +0800)
committerJohn L. Hammond <john.hammond@intel.com>
Fri, 2 Feb 2018 18:11:58 +0000 (18:11 +0000)
There is race condition bewtween lfsck_start and umount:
the LFSCK may be triggered just after the LFSCK stopped
during umount the target, then nobody will stop the new
started LFSCK, as to the umount may be blocked.

This patch sets flag on the lfsck instance when umount
that will prevent subsequent lfsck_start.

This is a port to b2_10 of
Lustre-change: https://review.whamcloud.com/#/c/30513/
Lustre-commit: 6263064b369dd4fddbb0dfa9ab49013a0d791629

Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: I779f862d4195d4289bb9dd96575cd7746ac4b35b
Reviewed-on: https://review.whamcloud.com/30514
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
lustre/lfsck/lfsck_internal.h
lustre/lfsck/lfsck_lib.c

index fe0f6be..6c3c4f9 100644 (file)
@@ -744,7 +744,8 @@ struct lfsck_instance {
                                  li_drop_dryrun:1, /* Ever dryrun, not now. */
                                  li_master:1, /* Master instance or not. */
                                  li_current_oit_processed:1,
-                                 li_start_unplug:1;
+                                 li_start_unplug:1,
+                                 li_stopping:1;
        struct lfsck_rec_lmv_save li_rec_lmv_save[LFSCK_REC_LMV_MAX_DEPTH];
 };
 
index 8325bc2..29f88a7 100644 (file)
@@ -3088,6 +3088,9 @@ int lfsck_start(const struct lu_env *env, struct dt_device *key,
        if (unlikely(lfsck == NULL))
                RETURN(-ENXIO);
 
+       if (unlikely(lfsck->li_stopping))
+               GOTO(put, rc = -ENXIO);
+
        /* System is not ready, try again later. */
        if (unlikely(lfsck->li_namespace == NULL ||
                     lfsck_dev_site(lfsck)->ss_server_fld == NULL))
@@ -3370,6 +3373,10 @@ int lfsck_stop(const struct lu_env *env, struct dt_device *key,
        }
 
        spin_lock(&lfsck->li_lock);
+       /* The target is umounted */
+       if (stop && stop->ls_status == LS_PAUSED)
+               lfsck->li_stopping = 1;
+
        if (thread_is_init(thread) || thread_is_stopped(thread))
                /* no error if LFSCK stopped already, or not started */
                GOTO(unlock, rc = 0);