diff options
author | J. Bruce Fields <bfields@citi.umich.edu> | 2010-03-22 15:37:17 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2010-10-01 19:29:44 -0400 |
commit | edc7a894034acb4c7ff8305716ca5df8aaf8e642 (patch) | |
tree | 7db61c8c76fc3e58e499989665f2f26987c058a1 /net/sunrpc/svc_xprt.c | |
parent | c7662518c781edc8059cd9737d18168154bf7510 (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.c | 15 |
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 | ||
885 | static 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 | ||