瀏覽代碼

NLM/lockd: Add a reference counter to struct nlm_rqst

When we replace the existing synchronous RPC calls with asynchronous calls,
the reference count will be needed in order to allow us to examine the
result of the RPC call.

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Trond Myklebust 17 年之前
父節點
當前提交
5e7f37a76f
共有 2 個文件被更改,包括 4 次插入0 次删除
  1. 3 0
      fs/lockd/clntproc.c
  2. 1 0
      include/linux/lockd/lockd.h

+ 3 - 0
fs/lockd/clntproc.c

@@ -221,6 +221,7 @@ struct nlm_rqst *nlm_alloc_call(struct nlm_host *host)
 	for(;;) {
 	for(;;) {
 		call = kzalloc(sizeof(*call), GFP_KERNEL);
 		call = kzalloc(sizeof(*call), GFP_KERNEL);
 		if (call != NULL) {
 		if (call != NULL) {
+			atomic_set(&call->a_count, 1);
 			locks_init_lock(&call->a_args.lock.fl);
 			locks_init_lock(&call->a_args.lock.fl);
 			locks_init_lock(&call->a_res.lock.fl);
 			locks_init_lock(&call->a_res.lock.fl);
 			call->a_host = host;
 			call->a_host = host;
@@ -237,6 +238,8 @@ struct nlm_rqst *nlm_alloc_call(struct nlm_host *host)
 
 
 void nlm_release_call(struct nlm_rqst *call)
 void nlm_release_call(struct nlm_rqst *call)
 {
 {
+	if (!atomic_dec_and_test(&call->a_count))
+		return;
 	nlm_release_host(call->a_host);
 	nlm_release_host(call->a_host);
 	nlmclnt_release_lockargs(call);
 	nlmclnt_release_lockargs(call);
 	kfree(call);
 	kfree(call);

+ 1 - 0
include/linux/lockd/lockd.h

@@ -91,6 +91,7 @@ struct nlm_wait;
  */
  */
 #define NLMCLNT_OHSIZE		((__NEW_UTS_LEN) + 10u)
 #define NLMCLNT_OHSIZE		((__NEW_UTS_LEN) + 10u)
 struct nlm_rqst {
 struct nlm_rqst {
+	atomic_t		a_count;
 	unsigned int		a_flags;	/* initial RPC task flags */
 	unsigned int		a_flags;	/* initial RPC task flags */
 	struct nlm_host *	a_host;		/* host handle */
 	struct nlm_host *	a_host;		/* host handle */
 	struct nlm_args		a_args;		/* arguments */
 	struct nlm_args		a_args;		/* arguments */