@@ -367,7 +367,7 @@ int fld_client_rpc(struct obd_export *exp,
rc = ptlrpc_queue_wait(req);
obd_put_request_slot(&exp->exp_obd->u.cli);
if (rc != 0) {
- if (imp->imp_state != LUSTRE_IMP_CLOSED) {
+ if (imp->imp_state != LUSTRE_IMP_CLOSED && !imp->imp_deactive) {
/* Since LWP is not replayable, so it will keep
* trying unless umount happens, otherwise it would
* cause unnecessary failure of the application.
@@ -404,6 +404,7 @@ int fld_client_lookup(struct lu_client_fld *fld, u64 seq, u32 *mds,
{
struct lu_seq_range res = { 0 };
struct lu_fld_target *target;
+ struct lu_fld_target *origin;
int rc;
rc = fld_cache_lookup(fld->lcf_cache, seq, &res);
@@ -415,7 +416,8 @@ int fld_client_lookup(struct lu_client_fld *fld, u64 seq, u32 *mds,
/* Can not find it in the cache */
target = fld_client_get_target(fld, seq);
LASSERT(target);
-
+ origin = target;
+again:
CDEBUG(D_INFO,
"%s: Lookup fld entry (seq: %#llx) on target %s (idx %llu)\n",
fld->lcf_name, seq, fld_target_name(target), target->ft_idx);
@@ -424,6 +426,23 @@ int fld_client_lookup(struct lu_client_fld *fld, u64 seq, u32 *mds,
fld_range_set_type(&res, flags);
rc = fld_client_rpc(target->ft_exp, &res, FLD_QUERY, NULL);
+ if (rc == -ESHUTDOWN) {
+ /* If fld lookup failed because the target has been shutdown,
+ * then try next target in the list, until trying all targets
+ * or fld lookup succeeds
+ */
+ spin_lock(&fld->lcf_lock);
+ if (target->ft_chain.next == fld->lcf_targets.prev)
+ target = list_entry(fld->lcf_targets.next,
+ struct lu_fld_target, ft_chain);
+ else
+ target = list_entry(target->ft_chain.next,
+ struct lu_fld_target,
+ ft_chain);
+ spin_unlock(&fld->lcf_lock);
+ if (target != origin)
+ goto again;
+ }
if (rc == 0) {
*mds = res.lsr_index;