Hi Simon,
I've stared at this for some time now, and I'm having trouble seeing
what could be going wrong. Can you therefore please apply the following
patch, and see if you can reproduce the problem?
Cheers
Trond
8<-------------------------------------------------------------------------
From 7030a57b25ce1647cb8489851cff3419e8856189 Mon Sep 17 00:00:00 2001
From: Trond Myklebust <Trond.M...@netapp.com>
Date: Fri, 9 Sep 2011 19:14:36 -0400
Subject: [PATCH] NFS: debugging
Signed-off-by: Trond Myklebust <Trond.M...@netapp.com>
---
net/sunrpc/clnt.c | 10 ++++++++++
net/sunrpc/xprt.c | 8 ++++----
2 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index c5347d2..3e32cfc 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -1867,6 +1867,16 @@ void rpc_show_tasks(void)
rpc_show_task(clnt, task);
}
spin_unlock(&clnt->cl_lock);
+ task = ACCESS_ONCE(clnt->cl_xprt->snd_task);
+ if (task)
+ printk("SUNRPC: xprt(%p) state=%lu, snd_task->tk_pid=%u\n",
+ clnt->cl_xprt,
+ clnt->cl_xprt->state,
+ task->tk_pid);
+ else
+ printk("SUNRPC: xprt(%p) state=%lu, snd_task=0\n",
+ clnt->cl_xprt,
+ clnt->cl_xprt->state);
}
spin_unlock(&rpc_client_lock);
}
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
index f4385e4..9f5f0e1 100644
--- a/net/sunrpc/xprt.c
+++ b/net/sunrpc/xprt.c
@@ -235,7 +235,7 @@ static void xprt_clear_locked(struct rpc_xprt *xprt)
clear_bit(XPRT_LOCKED, &xprt->state);
smp_mb__after_clear_bit();
} else
- queue_work(rpciod_workqueue, &xprt->task_cleanup);
+ BUG_ON(!queue_work(rpciod_workqueue, &xprt->task_cleanup));
}
/*
@@ -636,7 +636,7 @@ void xprt_force_disconnect(struct rpc_xprt *xprt)
set_bit(XPRT_CLOSE_WAIT, &xprt->state);
/* Try to schedule an autoclose RPC call */
if (test_and_set_bit(XPRT_LOCKED, &xprt->state) == 0)
- queue_work(rpciod_workqueue, &xprt->task_cleanup);
+ BUG_ON(!queue_work(rpciod_workqueue, &xprt->task_cleanup));
xprt_wake_pending_tasks(xprt, -EAGAIN);
spin_unlock_bh(&xprt->transport_lock);
}
@@ -663,7 +663,7 @@ void xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie)
set_bit(XPRT_CLOSE_WAIT, &xprt->state);
/* Try to schedule an autoclose RPC call */
if (test_and_set_bit(XPRT_LOCKED, &xprt->state) == 0)
- queue_work(rpciod_workqueue, &xprt->task_cleanup);
+ BUG_ON(!queue_work(rpciod_workqueue, &xprt->task_cleanup));
xprt_wake_pending_tasks(xprt, -EAGAIN);
out:
spin_unlock_bh(&xprt->transport_lock);
@@ -681,7 +681,7 @@ xprt_init_autodisconnect(unsigned long data)
goto out_abort;
spin_unlock(&xprt->transport_lock);
set_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
- queue_work(rpciod_workqueue, &xprt->task_cleanup);
+ BUG_ON(!queue_work(rpciod_workqueue, &xprt->task_cleanup));
return;
out_abort:
spin_unlock(&xprt->transport_lock);
--
1.7.6
--
Trond Myklebust
Linux NFS client maintainer
NetApp
Trond.M...@netapp.com
www.netapp.com