]> err.no Git - linux-2.6/blobdiff - net/sunrpc/xprt.c
[NetLabel]: correct improper handling of non-NetLabel peer contexts
[linux-2.6] / net / sunrpc / xprt.c
index e4f64fb58ff27bc246930c142586c2e4d535b278..1f786f68729d465c8bc7f3fb51b45465a4c89aa2 100644 (file)
@@ -585,13 +585,6 @@ static void xprt_connect_status(struct rpc_task *task)
                                task->tk_pid, -task->tk_status, task->tk_client->cl_server);
                xprt_release_write(xprt, task);
                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_xid     = xprt_alloc_xid(xprt);
        req->rq_release_snd_buf = NULL;
+       xprt_reset_majortimeo(req);
        dprintk("RPC: %4d reserved req %p xid %08x\n", task->tk_pid,
                        req, ntohl(req->rq_xid));
 }
@@ -932,6 +926,7 @@ struct rpc_xprt *xprt_create_transport(int proto, struct sockaddr *ap, size_t si
                return ERR_PTR(result);
        }
 
+       kref_init(&xprt->kref);
        spin_lock_init(&xprt->transport_lock);
        spin_lock_init(&xprt->reserve_lock);
 
@@ -964,16 +959,37 @@ struct rpc_xprt *xprt_create_transport(int proto, struct sockaddr *ap, size_t si
 
 /**
  * xprt_destroy - destroy an RPC transport, killing off all requests.
- * @xprt: transport to destroy
+ * @kref: kref for the transport to destroy
  *
  */
-int xprt_destroy(struct rpc_xprt *xprt)
+static void xprt_destroy(struct kref *kref)
 {
+       struct rpc_xprt *xprt = container_of(kref, struct rpc_xprt, kref);
+
        dprintk("RPC:      destroying transport %p\n", xprt);
        xprt->shutdown = 1;
        del_timer_sync(&xprt->timer);
        xprt->ops->destroy(xprt);
        kfree(xprt);
+}
 
-       return 0;
+/**
+ * xprt_put - release a reference to an RPC transport.
+ * @xprt: pointer to the transport
+ *
+ */
+void xprt_put(struct rpc_xprt *xprt)
+{
+       kref_put(&xprt->kref, xprt_destroy);
+}
+
+/**
+ * xprt_get - return a reference to an RPC transport.
+ * @xprt: pointer to the transport
+ *
+ */
+struct rpc_xprt *xprt_get(struct rpc_xprt *xprt)
+{
+       kref_get(&xprt->kref);
+       return xprt;
 }