- struct ptlrpc_request *req;
- struct lu_seq_range *prange;
- __u32 *op;
- int rc;
- ENTRY;
-
- LASSERT(exp != NULL);
-
- req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp), &RQF_FLD_QUERY,
- LUSTRE_MDS_VERSION, FLD_QUERY);
- if (req == NULL)
- RETURN(-ENOMEM);
-
- op = req_capsule_client_get(&req->rq_pill, &RMF_FLD_OPC);
- *op = fld_op;
-
- prange = req_capsule_client_get(&req->rq_pill, &RMF_FLD_MDFLD);
- *prange = *range;
-
- ptlrpc_request_set_replen(req);
+ struct ptlrpc_request *req = NULL;
+ struct lu_seq_range *prange;
+ __u32 *op;
+ int rc = 0;
+ struct obd_import *imp;
+ ENTRY;
+
+ LASSERT(exp != NULL);
+
+again:
+ imp = class_exp2cliimp(exp);
+ switch (fld_op) {
+ case FLD_QUERY:
+ req = ptlrpc_request_alloc_pack(imp, &RQF_FLD_QUERY,
+ LUSTRE_MDS_VERSION, FLD_QUERY);
+ if (req == NULL)
+ RETURN(-ENOMEM);
+
+ /* XXX: only needed when talking to old server(< 2.6), it should
+ * be removed when < 2.6 server is not supported */
+ op = req_capsule_client_get(&req->rq_pill, &RMF_FLD_OPC);
+ *op = FLD_LOOKUP;
+
+ /* For MDS_MDS seq lookup, it will always use LWP connection,
+ * but LWP will be evicted after restart, so cause the error.
+ * so we will set no_delay for seq lookup request, once the
+ * request fails because of the eviction. always retry here */
+ if (imp->imp_connect_flags_orig & OBD_CONNECT_MDS_MDS) {
+ req->rq_allow_replay = 1;
+ req->rq_no_delay = 1;
+ }
+ break;
+ case FLD_READ:
+ req = ptlrpc_request_alloc_pack(imp, &RQF_FLD_READ,
+ LUSTRE_MDS_VERSION, FLD_READ);
+ if (req == NULL)
+ RETURN(-ENOMEM);
+
+ req_capsule_set_size(&req->rq_pill, &RMF_GENERIC_DATA,
+ RCL_SERVER, PAGE_CACHE_SIZE);
+ break;
+ default:
+ rc = -EINVAL;
+ break;
+ }
+
+ if (rc != 0)
+ RETURN(rc);
+
+ prange = req_capsule_client_get(&req->rq_pill, &RMF_FLD_MDFLD);
+ *prange = *range;
+ ptlrpc_request_set_replen(req);