From: "J. Bruce Fields" <bfields@fieldses.org>
To: Jeff Layton <jlayton@redhat.com>
Cc: Trond.Myklebust@netapp.com, linux-nfs@vger.kernel.org
Subject: Re: [PATCH 2/4] lockd: eliminate duplicate nlmsvc_lookup_host call from nlmsvc_testlock
Date: Tue, 15 Jul 2008 15:41:16 -0400 [thread overview]
Message-ID: <20080715194116.GI21590@fieldses.org> (raw)
In-Reply-To: <20080715153222.1a894180-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
On Tue, Jul 15, 2008 at 03:32:22PM -0400, Jeff Layton wrote:
> On Tue, 15 Jul 2008 15:09:02 -0400
> "J. Bruce Fields" <bfields@fieldses.org> wrote:
>
> > On Tue, Jul 15, 2008 at 02:48:11PM -0400, J. Bruce Fields wrote:
> > > From: Jeff Layton <jlayton@redhat.com>
> > >
> > > nlmsvc_testlock calls nlmsvc_lookup_host to find a nlm_host struct. The
> > > callers of this functions, however, call nlmsvc_retrieve_args or
> > > nlm4svc_retrieve_args, which also return a nlm_host struct.
> > >
> > > Change nlmsvc_testlock to take a host arg instead of calling
> > > nlmsvc_lookup_host itself and change the callers to pass a pointer to
> > > the nlm_host they've already found.
> > >
> > > We take a reference to host in the place where nlmsvc_testlock()
> > > previous did a new lookup, so the reference counting is unchanged from
> > > before.
> > >
> > > Signed-off-by: Jeff Layton <jlayton@redhat.com>
> > > Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
> > > ---
> > > fs/lockd/svc4proc.c | 2 +-
> > > fs/lockd/svclock.c | 12 +++---------
> > > fs/lockd/svcproc.c | 2 +-
> > > include/linux/lockd/lockd.h | 3 ++-
> > > 4 files changed, 7 insertions(+), 12 deletions(-)
> > >
> > > diff --git a/fs/lockd/svc4proc.c b/fs/lockd/svc4proc.c
> > > index 006a832..8cfb9da 100644
> > > --- a/fs/lockd/svc4proc.c
> > > +++ b/fs/lockd/svc4proc.c
> > > @@ -99,7 +99,7 @@ nlm4svc_proc_test(struct svc_rqst *rqstp, struct nlm_args *argp,
> > > return resp->status == nlm_drop_reply ? rpc_drop_reply :rpc_success;
> > >
> > > /* Now check for conflicting locks */
> > > - resp->status = nlmsvc_testlock(rqstp, file, &argp->lock, &resp->lock, &resp->cookie);
> > > + resp->status = nlmsvc_testlock(rqstp, file, host, &argp->lock, &resp->lock, &resp->cookie);
> > > if (resp->status == nlm_drop_reply)
> > > rc = rpc_drop_reply;
> > > else
> > > diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
> > > index 81aca85..f40afb3 100644
> > > --- a/fs/lockd/svclock.c
> > > +++ b/fs/lockd/svclock.c
> > > @@ -460,8 +460,8 @@ out:
> > > */
> > > __be32
> > > nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file,
> > > - struct nlm_lock *lock, struct nlm_lock *conflock,
> > > - struct nlm_cookie *cookie)
> > > + struct nlm_host *host, struct nlm_lock *lock,
> > > + struct nlm_lock *conflock, struct nlm_cookie *cookie)
> > > {
> > > struct nlm_block *block = NULL;
> > > int error;
> > > @@ -479,16 +479,10 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file,
> > >
> > > if (block == NULL) {
> > > struct file_lock *conf = kzalloc(sizeof(*conf), GFP_KERNEL);
> > > - struct nlm_host *host;
> > >
> > > if (conf == NULL)
> > > return nlm_granted;
> > > - /* Create host handle for callback */
> > > - host = nlmsvc_lookup_host(rqstp, lock->caller, lock->len);
> > > - if (host == NULL) {
> > > - kfree(conf);
> > > - return nlm_lck_denied_nolocks;
> > > - }
> > > + nlm_get_host(host);
> > > block = nlmsvc_create_block(rqstp, host, file, lock, cookie);
> > > if (block == NULL) {
> > > kfree(conf);
> >
> > By the way, it'd seem clearer if nlmsvc_create_block() did the job of
> > taking whatever reference it needed on "host" itself.
> >
>
> That does seem like the best thing to do here...
>
> > Seems like you could do the same for nlm_alloc_host() as well.
> >
> > --b.
> >
> > commit cc8c1b0a6514c670b1ab568241210bbdbece7923
> > Author: J. Bruce Fields <bfields@citi.umich.edu>
> > Date: Tue Jul 15 15:05:45 2008 -0400
> >
> > lockd: get host reference in nlmsvc_create_block() instead of callers
> >
> > As it is it looks like there's an obvious reference count leak until you
> > track down the definition of nlm_alloc_host() and see that it's
> > guaranteed to consume a reference, success or failure.
> >
>
> I'm not sure I follow this. I don't see an nlm_alloc_host(). Do you mean
> nlm_alloc_call()?
Whoops, yes.
> If so, then it looks like it should only consume a
> reference on failure (when signaled).
It only has an explicit nlm_release_host() in that case, but in the
other case it exits having stored a pointer in a_host which will
eventually have nlm_release_host() called on it.
So I'd say it has "consumed" (either stored, or thrown away) one
reference in either case.
--b.
>
> > Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
> >
> > diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
> > index 92c49d7..80d4f2e 100644
> > --- a/fs/lockd/svclock.c
> > +++ b/fs/lockd/svclock.c
> > @@ -180,6 +180,7 @@ nlmsvc_create_block(struct svc_rqst *rqstp, struct nlm_host *host,
> > struct nlm_block *block;
> > struct nlm_rqst *call = NULL;
> >
> > + nlm_get_host(host);
> > call = nlm_alloc_call(host);
> > if (call == NULL)
> > return NULL;
> > @@ -380,8 +381,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
> > */
> > block = nlmsvc_lookup_block(file, lock);
> > if (block == NULL) {
> > - block = nlmsvc_create_block(rqstp, nlm_get_host(host), file,
> > - lock, cookie);
> > + block = nlmsvc_create_block(rqstp, host, file, lock, cookie);
> > ret = nlm_lck_denied_nolocks;
> > if (block == NULL)
> > goto out;
> > @@ -476,7 +476,6 @@ nlmsvc_testlock(struct svc_rqst *rqstp, struct nlm_file *file,
> >
> > if (conf == NULL)
> > return nlm_granted;
> > - nlm_get_host(host);
> > block = nlmsvc_create_block(rqstp, host, file, lock, cookie);
> > if (block == NULL) {
> > kfree(conf);
>
>
> --
> Jeff Layton <jlayton@redhat.com>
next prev parent reply other threads:[~2008-07-15 19:41 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-12 13:17 [PATCH] lockd: eliminate duplicate calls to nlmsvc_lookup_host in nlmsvc_lock and nlmsvc_testlock Jeff Layton
2008-07-15 18:45 ` J. Bruce Fields
2008-07-15 18:48 ` [PATCH 1/4] lockd: nlm_release_host() checks for NULL, caller needn't J. Bruce Fields
2008-07-15 18:48 ` [PATCH 2/4] lockd: eliminate duplicate nlmsvc_lookup_host call from nlmsvc_testlock J. Bruce Fields
2008-07-15 18:48 ` [PATCH 3/4] lockd: eliminate duplicate nlmsvc_lookup_host call from nlmsvc_lock J. Bruce Fields
2008-07-15 18:48 ` [PATCH 4/4] lockd: minor svclock.c style fixes J. Bruce Fields
2008-07-15 18:56 ` [PATCH 3/4] lockd: eliminate duplicate nlmsvc_lookup_host call from nlmsvc_lock J. Bruce Fields
2008-07-15 19:09 ` [PATCH 2/4] lockd: eliminate duplicate nlmsvc_lookup_host call from nlmsvc_testlock J. Bruce Fields
2008-07-15 19:32 ` Jeff Layton
[not found] ` <20080715153222.1a894180-RtJpwOs3+0O+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2008-07-15 19:41 ` J. Bruce Fields [this message]
2008-07-15 19:13 ` [PATCH] lockd: eliminate duplicate calls to nlmsvc_lookup_host in nlmsvc_lock and nlmsvc_testlock Jeff Layton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080715194116.GI21590@fieldses.org \
--to=bfields@fieldses.org \
--cc=Trond.Myklebust@netapp.com \
--cc=jlayton@redhat.com \
--cc=linux-nfs@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.