diff options
author | Paul Mundt <lethal@linux-sh.org> | 2010-11-30 14:55:11 +0900 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2010-11-30 14:55:11 +0900 |
commit | 7d0dbea312a6508389241b4fb6cda1c4d1e32d6e (patch) | |
tree | f23b591e8c6f921c91fce00a6453d4087ec3c071 /include/linux/sunrpc | |
parent | 5c4986b8a9ddd9cf649abe38a102866f7809b1d2 (diff) | |
parent | 193006f7e3b1abd42d7a3677b54fa2996461a842 (diff) |
Merge branch 'sh/urgent' into sh-latest
Diffstat (limited to 'include/linux/sunrpc')
-rw-r--r-- | include/linux/sunrpc/svc_xprt.h | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h index bbdb680ffbe..aea0d438e3c 100644 --- a/include/linux/sunrpc/svc_xprt.h +++ b/include/linux/sunrpc/svc_xprt.h @@ -82,18 +82,28 @@ struct svc_xprt { struct net *xpt_net; }; -static inline void register_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u) +static inline void unregister_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u) { spin_lock(&xpt->xpt_lock); - list_add(&u->list, &xpt->xpt_users); + list_del_init(&u->list); spin_unlock(&xpt->xpt_lock); } -static inline void unregister_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u) +static inline int register_xpt_user(struct svc_xprt *xpt, struct svc_xpt_user *u) { spin_lock(&xpt->xpt_lock); - list_del_init(&u->list); + if (test_bit(XPT_CLOSE, &xpt->xpt_flags)) { + /* + * The connection is about to be deleted soon (or, + * worse, may already be deleted--in which case we've + * already notified the xpt_users). + */ + spin_unlock(&xpt->xpt_lock); + return -ENOTCONN; + } + list_add(&u->list, &xpt->xpt_users); spin_unlock(&xpt->xpt_lock); + return 0; } int svc_reg_xprt_class(struct svc_xprt_class *); |