Whamcloud - gitweb
LU-13468 fld: repeat rpc in fld_client_rpc after EAGAIN
[fs/lustre-release.git] / lustre / fld / fld_request.c
index 08387ee..3be93c2 100644 (file)
@@ -40,6 +40,7 @@
 #include <libcfs/libcfs.h>
 #include <linux/module.h>
 #include <linux/math64.h>
+#include <linux/delay.h>
 
 #include <obd.h>
 #include <obd_class.h>
@@ -333,6 +334,7 @@ int fld_client_rpc(struct obd_export *exp,
        LASSERT(exp != NULL);
 
        imp = class_exp2cliimp(exp);
+again:
        switch (fld_op) {
        case FLD_QUERY:
                req = ptlrpc_request_alloc_pack(imp, &RQF_FLD_QUERY,
@@ -382,7 +384,7 @@ int fld_client_rpc(struct obd_export *exp,
        req->rq_reply_portal = MDC_REPLY_PORTAL;
        ptlrpc_at_set_req_timeout(req);
 
-       if (OBD_FAIL_CHECK(OBD_FAIL_FLD_QUERY_REQ && req->rq_no_delay)) {
+       if (OBD_FAIL_CHECK(OBD_FAIL_FLD_QUERY_REQ) && req->rq_no_delay) {
                /* the same error returned by ptlrpc_import_delay_req */
                rc = -EAGAIN;
                req->rq_status = rc;
@@ -403,12 +405,16 @@ int fld_client_rpc(struct obd_export *exp,
                    imp->imp_connect_flags_orig & OBD_CONNECT_MDS_MDS &&
                    OCD_HAS_FLAG(&imp->imp_connect_data, LIGHTWEIGHT) &&
                    rc != -ENOTSUPP) {
-                       /*
-                        * Since LWP is not replayable, so notify the caller
-                        * to retry if needed after a while.
-                        */
+                       /* LWP is not replayable, retry after a while */
                        rc = -EAGAIN;
                }
+               if (rc == -EAGAIN) {
+                       ptlrpc_req_finished(req);
+                       if (msleep_interruptible(2 * MSEC_PER_SEC))
+                               GOTO(out_req, rc = -EINTR);
+                       rc = 0;
+                       goto again;
+               }
                GOTO(out_req, rc);
        }