Whamcloud - gitweb
b=2950
authoralex <alex>
Tue, 25 May 2004 10:22:10 +0000 (10:22 +0000)
committeralex <alex>
Tue, 25 May 2004 10:22:10 +0000 (10:22 +0000)
landed on HEAD

lustre/include/linux/lustre_net.h
lustre/ptlrpc/client.c
lustre/ptlrpc/events.c
lustre/ptlrpc/niobuf.c

index 8c5e54d..d7d1bea 100644 (file)
@@ -271,7 +271,7 @@ struct ptlrpc_request {
         unsigned int rq_intr:1, rq_replied:1, rq_err:1,
                 rq_timedout:1, rq_resend:1, rq_restart:1, rq_replay:1,
                 rq_no_resend:1, rq_waiting:1, rq_receiving_reply:1,
-                rq_no_delay:1;
+                rq_no_delay:1, rq_net_err:1;
         int rq_phase;
         /* client-side refcount for SENT race */
         atomic_t rq_refcount;
index 04ff0e9..fce6f39 100644 (file)
@@ -400,6 +400,13 @@ static int ptlrpc_check_reply(struct ptlrpc_request *req)
                 DEBUG_REQ(D_NET, req, "REPLIED:");
                 GOTO(out, rc = 1);
         }
+        
+        if (req->rq_net_err && !req->rq_timedout) {
+                spin_unlock_irqrestore (&req->rq_lock, flags);
+                rc = ptlrpc_expire_one_request(req); 
+                spin_lock_irqsave (&req->rq_lock, flags);
+                GOTO(out, rc);
+        }
 
         if (req->rq_err) {
                 DEBUG_REQ(D_ERROR, req, "ABORTED:");
@@ -570,7 +577,7 @@ static int ptlrpc_send_new_req(struct ptlrpc_request *req)
         rc = ptl_send_rpc(req);
         if (rc) {
                 DEBUG_REQ(D_HA, req, "send failed (%d); expect timeout", rc);
-                req->rq_timeout = 1;
+                req->rq_net_err = 1;
                 RETURN(rc);
         }
         RETURN(0);
@@ -611,6 +618,9 @@ int ptlrpc_check_set(struct ptlrpc_request_set *set)
                 if (req->rq_phase == RQ_PHASE_INTERPRET)
                         GOTO(interpret, req->rq_status);
 
+                if (req->rq_net_err && !req->rq_timedout)
+                        ptlrpc_expire_one_request(req); 
+
                 if (req->rq_err) {
                         ptlrpc_unregister_reply(req);
                         if (req->rq_status == 0)
@@ -698,7 +708,7 @@ int ptlrpc_check_set(struct ptlrpc_request_set *set)
                                         DEBUG_REQ(D_HA, req, "send failed (%d)",
                                                   rc);
                                         force_timer_recalc = 1;
-                                        req->rq_timeout = 0;
+                                        req->rq_net_err = 1;
                                 }
                                 /* need to reset the timeout */
                                 force_timer_recalc = 1;
@@ -1191,6 +1201,7 @@ void ptlrpc_resend_req(struct ptlrpc_request *req)
 
         spin_lock_irqsave (&req->rq_lock, flags);
         req->rq_resend = 1;
+        req->rq_net_err = 0;
         req->rq_timedout = 0;
         if (req->rq_bulk) {
                 __u64 old_xid = req->rq_xid;
index 6e61236..77334a2 100644 (file)
@@ -58,7 +58,7 @@ void request_out_callback(ptl_event_t *ev)
                  * like failing sends in client.c does currently...  */
 
                 spin_lock_irqsave(&req->rq_lock, flags);
-                req->rq_timeout = 0;
+                req->rq_net_err = 1;
                 spin_unlock_irqrestore(&req->rq_lock, flags);
                 
                 ptlrpc_wake_client_req(req);
index c22e668..d6a9ae8 100644 (file)
@@ -471,6 +471,7 @@ int ptl_send_rpc(struct ptlrpc_request *request)
         request->rq_replied = 0;
         request->rq_err = 0;
         request->rq_timedout = 0;
+        request->rq_net_err = 0;
         request->rq_resend = 0;
         request->rq_restart = 0;
         spin_unlock_irqrestore (&request->rq_lock, flags);