Browse Source

SUNRPC: Clean up soft task error handling

- Ensure that the task aborts the RPC call only when it has actually timed out.
 - Ensure that req->rq_majortimeo is initialised correctly.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Trond Myklebust 18 years ago
parent
commit
da45828e28
2 changed files with 15 additions and 27 deletions
  1. 14 20
      net/sunrpc/clnt.c
  2. 1 7
      net/sunrpc/xprt.c

+ 14 - 20
net/sunrpc/clnt.c

@@ -863,15 +863,11 @@ call_bind_status(struct rpc_task *task)
 		dprintk("RPC: %4d remote rpcbind: RPC program/version unavailable\n",
 		dprintk("RPC: %4d remote rpcbind: RPC program/version unavailable\n",
 				task->tk_pid);
 				task->tk_pid);
 		rpc_delay(task, 3*HZ);
 		rpc_delay(task, 3*HZ);
-		goto retry_bind;
+		goto retry_timeout;
 	case -ETIMEDOUT:
 	case -ETIMEDOUT:
 		dprintk("RPC: %4d rpcbind request timed out\n",
 		dprintk("RPC: %4d rpcbind request timed out\n",
 				task->tk_pid);
 				task->tk_pid);
-		if (RPC_IS_SOFT(task)) {
-			status = -EIO;
-			break;
-		}
-		goto retry_bind;
+		goto retry_timeout;
 	case -EPFNOSUPPORT:
 	case -EPFNOSUPPORT:
 		dprintk("RPC: %4d remote rpcbind service unavailable\n",
 		dprintk("RPC: %4d remote rpcbind service unavailable\n",
 				task->tk_pid);
 				task->tk_pid);
@@ -884,16 +880,13 @@ call_bind_status(struct rpc_task *task)
 		dprintk("RPC: %4d unrecognized rpcbind error (%d)\n",
 		dprintk("RPC: %4d unrecognized rpcbind error (%d)\n",
 				task->tk_pid, -task->tk_status);
 				task->tk_pid, -task->tk_status);
 		status = -EIO;
 		status = -EIO;
-		break;
 	}
 	}
 
 
 	rpc_exit(task, status);
 	rpc_exit(task, status);
 	return;
 	return;
 
 
-retry_bind:
-	task->tk_status = 0;
-	task->tk_action = call_bind;
-	return;
+retry_timeout:
+	task->tk_action = call_timeout;
 }
 }
 
 
 /*
 /*
@@ -941,14 +934,16 @@ call_connect_status(struct rpc_task *task)
 
 
 	switch (status) {
 	switch (status) {
 	case -ENOTCONN:
 	case -ENOTCONN:
-	case -ETIMEDOUT:
 	case -EAGAIN:
 	case -EAGAIN:
 		task->tk_action = call_bind;
 		task->tk_action = call_bind;
-		break;
-	default:
-		rpc_exit(task, -EIO);
-		break;
+		if (!RPC_IS_SOFT(task))
+			return;
+		/* if soft mounted, test if we've timed out */
+	case -ETIMEDOUT:
+		task->tk_action = call_timeout;
+		return;
 	}
 	}
+	rpc_exit(task, -EIO);
 }
 }
 
 
 /*
 /*
@@ -1057,7 +1052,6 @@ call_status(struct rpc_task *task)
 		printk("%s: RPC call returned error %d\n",
 		printk("%s: RPC call returned error %d\n",
 			       clnt->cl_protname, -status);
 			       clnt->cl_protname, -status);
 		rpc_exit(task, status);
 		rpc_exit(task, status);
-		break;
 	}
 	}
 }
 }
 
 
@@ -1125,10 +1119,10 @@ call_decode(struct rpc_task *task)
 			clnt->cl_stats->rpcretrans++;
 			clnt->cl_stats->rpcretrans++;
 			goto out_retry;
 			goto out_retry;
 		}
 		}
-		printk(KERN_WARNING "%s: too small RPC reply size (%d bytes)\n",
+		dprintk("%s: too small RPC reply size (%d bytes)\n",
 			clnt->cl_protname, task->tk_status);
 			clnt->cl_protname, task->tk_status);
-		rpc_exit(task, -EIO);
-		return;
+		task->tk_action = call_timeout;
+		goto out_retry;
 	}
 	}
 
 
 	/*
 	/*

+ 1 - 7
net/sunrpc/xprt.c

@@ -585,13 +585,6 @@ static void xprt_connect_status(struct rpc_task *task)
 				task->tk_pid, -task->tk_status, task->tk_client->cl_server);
 				task->tk_pid, -task->tk_status, task->tk_client->cl_server);
 		xprt_release_write(xprt, task);
 		xprt_release_write(xprt, task);
 		task->tk_status = -EIO;
 		task->tk_status = -EIO;
-		return;
-	}
-
-	/* if soft mounted, just cause this RPC to fail */
-	if (RPC_IS_SOFT(task)) {
-		xprt_release_write(xprt, task);
-		task->tk_status = -EIO;
 	}
 	}
 }
 }
 
 
@@ -829,6 +822,7 @@ static void xprt_request_init(struct rpc_task *task, struct rpc_xprt *xprt)
 	req->rq_bufsize = 0;
 	req->rq_bufsize = 0;
 	req->rq_xid     = xprt_alloc_xid(xprt);
 	req->rq_xid     = xprt_alloc_xid(xprt);
 	req->rq_release_snd_buf = NULL;
 	req->rq_release_snd_buf = NULL;
+	xprt_reset_majortimeo(req);
 	dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid,
 	dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid,
 			req, ntohl(req->rq_xid));
 			req, ntohl(req->rq_xid));
 }
 }