aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/svc_xprt.c
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@citi.umich.edu>2010-03-22 15:37:17 -0400
committerJ. Bruce Fields <bfields@redhat.com>2010-10-01 19:29:44 -0400
commitedc7a894034acb4c7ff8305716ca5df8aaf8e642 (patch)
tree7db61c8c76fc3e58e499989665f2f26987c058a1 /net/sunrpc/svc_xprt.c
parentc7662518c781edc8059cd9737d18168154bf7510 (diff)
nfsd: provide callbacks on svc_xprt deletion
NFSv4.1 needs warning when a client tcp connection goes down, if that connection is being used as a backchannel, so that it can warn the client that it has lost the backchannel connection. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'net/sunrpc/svc_xprt.c')
-rw-r--r--net/sunrpc/svc_xprt.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index 678b6ee4da7b..12025eedc781 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -156,6 +156,7 @@ void svc_xprt_init(struct svc_xprt_class *xcl, struct svc_xprt *xprt,
156 INIT_LIST_HEAD(&xprt->xpt_list); 156 INIT_LIST_HEAD(&xprt->xpt_list);
157 INIT_LIST_HEAD(&xprt->xpt_ready); 157 INIT_LIST_HEAD(&xprt->xpt_ready);
158 INIT_LIST_HEAD(&xprt->xpt_deferred); 158 INIT_LIST_HEAD(&xprt->xpt_deferred);
159 INIT_LIST_HEAD(&xprt->xpt_users);
159 mutex_init(&xprt->xpt_mutex); 160 mutex_init(&xprt->xpt_mutex);
160 spin_lock_init(&xprt->xpt_lock); 161 spin_lock_init(&xprt->xpt_lock);
161 set_bit(XPT_BUSY, &xprt->xpt_flags); 162 set_bit(XPT_BUSY, &xprt->xpt_flags);
@@ -881,6 +882,19 @@ static void svc_age_temp_xprts(unsigned long closure)
881 mod_timer(&serv->sv_temptimer, jiffies + svc_conn_age_period * HZ); 882 mod_timer(&serv->sv_temptimer, jiffies + svc_conn_age_period * HZ);
882} 883}
883 884
885static void call_xpt_users(struct svc_xprt *xprt)
886{
887 struct svc_xpt_user *u;
888
889 spin_lock(&xprt->xpt_lock);
890 while (!list_empty(&xprt->xpt_users)) {
891 u = list_first_entry(&xprt->xpt_users, struct svc_xpt_user, list);
892 list_del(&u->list);
893 u->callback(u);
894 }
895 spin_unlock(&xprt->xpt_lock);
896}
897
884/* 898/*
885 * Remove a dead transport 899 * Remove a dead transport
886 */ 900 */
@@ -913,6 +927,7 @@ void svc_delete_xprt(struct svc_xprt *xprt)
913 while ((dr = svc_deferred_dequeue(xprt)) != NULL) 927 while ((dr = svc_deferred_dequeue(xprt)) != NULL)
914 kfree(dr); 928 kfree(dr);
915 929
930 call_xpt_users(xprt);
916 svc_xprt_put(xprt); 931 svc_xprt_put(xprt);
917} 932}
918 933