int fld_client_rpc(struct obd_export *exp,
struct lu_seq_range *range, __u32 fld_op)
{
- struct ptlrpc_request *req;
- struct lu_seq_range *prange;
- __u32 *op;
- int rc;
- ENTRY;
+ struct ptlrpc_request *req;
+ struct lu_seq_range *prange;
+ __u32 *op;
+ int rc;
+ struct obd_import *imp;
+ ENTRY;
- LASSERT(exp != NULL);
+ LASSERT(exp != NULL);
- req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp), &RQF_FLD_QUERY,
- LUSTRE_MDS_VERSION, FLD_QUERY);
+ imp = class_exp2cliimp(exp);
+ req = ptlrpc_request_alloc_pack(imp, &RQF_FLD_QUERY, LUSTRE_MDS_VERSION,
+ FLD_QUERY);
if (req == NULL)
RETURN(-ENOMEM);
req->rq_request_portal = FLD_REQUEST_PORTAL;
ptlrpc_at_set_req_timeout(req);
+ if (fld_op == FLD_LOOKUP &&
+ imp->imp_connect_flags_orig & OBD_CONNECT_MDS_MDS)
+ req->rq_allow_replay = 1;
+
if (fld_op != FLD_LOOKUP)
mdc_get_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);
fld_enter_request(&exp->exp_obd->u.cli);
rq_invalid_rqset:1,
rq_generation_set:1,
/* do not resend request on -EINPROGRESS */
- rq_no_retry_einprogress:1;
+ rq_no_retry_einprogress:1,
+ /* allow the req to be sent if the import is in recovery
+ * status */
+ rq_allow_replay:1;
unsigned int rq_nr_resend;
*status = -EIO;
} else if (imp->imp_dlm_fake || req->rq_no_delay) {
*status = -EWOULDBLOCK;
- } else {
- delay = 1;
- }
- }
+ } else if (req->rq_allow_replay &&
+ (imp->imp_state == LUSTRE_IMP_REPLAY ||
+ imp->imp_state == LUSTRE_IMP_REPLAY_LOCKS ||
+ imp->imp_state == LUSTRE_IMP_REPLAY_WAIT ||
+ imp->imp_state == LUSTRE_IMP_RECOVER)) {
+ DEBUG_REQ(D_HA, req, "allow during recovery.\n");
+ } else {
+ delay = 1;
+ }
+ }
- RETURN(delay);
+ RETURN(delay);
}
/**