summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
9c9a05f)
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.
Signed-off-by: Fan Yong <fan.yong@intel.com>
Change-Id: I779f862d4195d4289bb9dd96575cd7746ac4b35b
Reviewed-on: https://review.whamcloud.com/30513
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Lai Siyao <lai.siyao@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
li_drop_dryrun:1, /* Ever dryrun, not now. */
li_master:1, /* Master instance or not. */
li_current_oit_processed:1,
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_stopping:1;
struct lfsck_rec_lmv_save li_rec_lmv_save[LFSCK_REC_LMV_MAX_DEPTH];
};
struct lfsck_rec_lmv_save li_rec_lmv_save[LFSCK_REC_LMV_MAX_DEPTH];
};
if (unlikely(lfsck == NULL))
RETURN(-ENXIO);
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))
/* System is not ready, try again later. */
if (unlikely(lfsck->li_namespace == NULL ||
lfsck_dev_site(lfsck)->ss_server_fld == NULL))
}
spin_lock(&lfsck->li_lock);
}
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);
if (thread_is_init(thread) || thread_is_stopped(thread))
/* no error if LFSCK stopped already, or not started */
GOTO(unlock, rc = 0);