knfsd: add svc_sock_get
Subsystems (3)
RFC PATCH 12/14 knfsd: add svc_sock_get
Add inline svc_sock_get() so that service transport code will not need to manipulate sk_inuse directly. Also, make svc_sock_put() available so that transport code outside svcsock.c can use it.
Signed-off-by Greg Banks <[email protected]>
---
include/linux/sunrpc/svcsock.h | 15 +++++++++++++++ net/sunrpc/sunrpc_syms.c | 1 + net/sunrpc/svcsock.c | 28 +++++++++++++--------------- 3 files changed, 29 insertions(+), 15 deletions(-)
include/linux/sunrpc/svcsock.h +15 -0
@@ -121,6 +121,7 @@ int svc_addsock(struct svc_serv *serv, int *proto);void svc_sock_enqueue (struct svc_sock *svsk);void svc_sock_received (struct svc_sock *svsk); +void __svc_sock_put (struct svc_sock *svsk);/* * svc_makesock socket characteristics
@@ -194,4 +195,18 @@ static inline void svc_sock_set_data_rea set_bit(SK_DATA, &svsk->sk_flags); } +/* +* Take and drop a temporary reference count on the svc_sock. +*/ +static inline void svc_sock_get (struct svc_sock *svsk) +{ +atomic_inc (&svsk->sk_inuse); +} + +static inline void svc_sock_put (struct svc_sock *svsk) +{ +if (atomic_dec_and_test (&svsk->sk_inuse)) +__svc_sock_put (svsk); +} +#endif /* SUNRPC_SVCSOCK_H */
net/sunrpc/svcsock.c +13 -15
@@ -274,7 +274,7 @@ svc_sock_enqueue(struct svc_sock *svsk)"svc_sock_enqueue: server %p, rq_sock=%p!\n" , rqstp, rqstp->rq_sock); rqstp->rq_sock = svsk; -atomic_inc (&svsk->sk_inuse); +svc_sock_get (svsk); rqstp->rq_reserved = serv->sv_max_mesg;atomic_add (rqstp->rq_reserved, &svsk->sk_reserved);BUG_ON (svsk->sk_pool != pool);
@@ -351,16 +351,14 @@ void svc_reserve(struct svc_rqst *rqstp,/* * Release a socket after use. */ -static inline void -svc_sock_put (struct svc_sock *svsk) +void +__svc_sock_put (struct svc_sock *svsk) { -if (atomic_dec_and_test (&svsk->sk_inuse)) { -BUG_ON (!test_bit (SK_DEAD , &svsk->sk_flags)); +BUG_ON (!test_bit (SK_DEAD , &svsk->sk_flags)); -if (svsk->sk_info_authunix !=NULL ) -svcauth_unix_info_release (svsk->sk_info_authunix); - svsk->sk_ops->sko_free (svsk); - } +if (svsk->sk_info_authunix !=NULL ) +svcauth_unix_info_release (svsk->sk_info_authunix); + svsk->sk_ops->sko_free (svsk); } static void
@@ -1134,7 +1132,7 @@ svc_tcp_accept(struct svc_sock *svsk) svsk =list_entry (serv->sv_tempsocks.prev, struct svc_sock, sk_list); -atomic_inc (&svsk->sk_inuse); +svc_sock_get (svsk); }spin_unlock_bh (&serv->sv_lock);
@@ -1512,7 +1510,7 @@ svc_recv(struct svc_rqst *rqstp, long tispin_lock_bh (&pool->sp_lock);if ((svsk =svc_sock_dequeue (pool)) !=NULL ) { rqstp->rq_sock = svsk; -atomic_inc (&svsk->sk_inuse); +svc_sock_get (svsk); rqstp->rq_reserved = serv->sv_max_mesg;atomic_add (rqstp->rq_reserved, &svsk->sk_reserved); }else {
@@ -1651,7 +1649,7 @@ svc_age_temp_sockets(unsigned long closucontinue ;if (atomic_read (&svsk->sk_inuse) ||test_bit (SK_BUSY , &svsk->sk_flags))continue ; -atomic_inc (&svsk->sk_inuse); +svc_sock_get (svsk);list_move (le, &to_be_aged);svc_sock_set_close (svsk);set_bit (SK_DETACHED , &svsk->sk_flags);
@@ -1899,7 +1897,7 @@ svc_delete_socket(struct svc_sock *svsk)*/ if (!test_and_set_bit (SK_DEAD , &svsk->sk_flags)) {BUG_ON (atomic_read (&svsk->sk_inuse)<2 ); -atomic_dec (&svsk->sk_inuse); +svc_sock_put (svsk);if (test_bit (SK_TEMP , &svsk->sk_flags)) serv->sv_tmpcnt--; }
@@ -1914,7 +1912,7 @@ static void svc_close_socket(struct svc_/* someone else will have to effect the close */ return ; -atomic_inc (&svsk->sk_inuse); +svc_sock_get (svsk);svc_delete_socket (svsk);clear_bit (SK_BUSY , &svsk->sk_flags);svc_sock_put (svsk);
@@ -2007,7 +2005,7 @@ svc_defer(struct cache_req *req) dr->argslen = rqstp->rq_arg.len >>2 ;memcpy (dr->args, rqstp->rq_arg.head[0 ].iov_base-skip, dr->argslen<<2 ); } -atomic_inc (&rqstp->rq_sock->sk_inuse); +svc_sock_get (rqstp->rq_sock); dr->svsk = rqstp->rq_sock; dr->handle.revisit = svc_revisit;
net/sunrpc/sunrpc_syms.c +1 -0
@@ -80,6 +80,7 @@ EXPORT_SYMBOL(svc_makesock);EXPORT_SYMBOL_GPL (svc_sock_enqueue);EXPORT_SYMBOL_GPL (svc_sock_received);EXPORT_SYMBOL (svc_reserve); +EXPORT_SYMBOL (__svc_sock_put);EXPORT_SYMBOL (svc_auth_register);EXPORT_SYMBOL (auth_domain_lookup);EXPORT_SYMBOL (svc_authenticate);
Signature · 12 lines
Greg Banks, R&D Software Engineer, SGI Australian Software Group. Apparently, I'm Bedevere. Which MPHG character are you? I don't speak for SGI. ------------------------------------------------------------------------- This SF.net email is sponsored by DB2 Express Download DB2 Express C - the FREE version of DB2 express and take control of your XML. No limits. Just data. Click to get it now. http://sourceforge.net/powerbar/db2/ _______________________________________________ NFS maillist - [email protected] https://lists.sourceforge.net/lists/listinfo/nfs