All of lore.kernel.org
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: linux-nfs@vger.kernel.org
Subject: Re: [PATCH] Fix race corrupting rpc upcall list
Date: Mon, 13 Sep 2010 13:49:17 -0400	[thread overview]
Message-ID: <20100913174917.GB16253@fieldses.org> (raw)
In-Reply-To: <20100912234748.GC9402@fieldses.org>

On Sun, Sep 12, 2010 at 07:47:48PM -0400, J. Bruce Fields wrote:
> On Sun, Sep 12, 2010 at 05:07:46PM -0400, Trond Myklebust wrote:
> > On Tue, 2010-09-07 at 01:12 -0400, J. Bruce Fields wrote:
> > > From: J. Bruce Fields <bfields@redhat.com>
> > > 
> > > If rpc_queue_upcall() adds a new upcall to the rpci->pipe list just
> > > after rpc_pipe_release calls rpc_purge_list(), but before it calls
> > > gss_pipe_release (as rpci->ops->release_pipe(inode)), then the latter
> > > will free a message without deleting it from the rpci->pipe list.
> > > 
> > > We will be left with a freed object on the rpc->pipe list.  Most
> > > frequent symptoms are kernel crashes in rpc.gssd system calls on the
> > > pipe in question.
> > > 
> > > We could just add a list_del(&gss_msg->msg.list) here.  But I can see no
> > > reason for doing all this cleanup here; the preceding rpc_purge_list()
> > > should have done the job, except possibly for any newly queued upcalls
> > > as above, which can safely be left to wait for another opener.
> > 
> > Hi Bruce,
> > 
> > Looking again at this issue, I think I see why the ->release_pipe() is
> > needed. While the call to rpc_purge_list() does indeed clear the list of
> > all those messages that are waiting for their upcall to complete, it
> > does nothing for the messages that have successfully been read by the
> > daemon, but are now waiting for a reply.
> 
> Doh!
> 
> > How about something like the patch below instead?
> 
> I read it over, and it looks sensible to me.
> 
> It's also survived a few testing iterations.  I'll give it a few more
> just out of paranoia, but would be surprised if they find the problem
> isn't resolved.

Indeed, no surprises; please pass those patches along whenever you're
ready.

--b.

  reply	other threads:[~2010-09-13 17:50 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-28 17:09 krb5 problems in 2.6.36 J. Bruce Fields
2010-08-30 17:57 ` J. Bruce Fields
2010-09-07  5:01   ` [PATCH] Fix null dereference in call_allocate J. Bruce Fields
2010-09-07  5:12     ` [PATCH] Fix race corrupting rpc upcall list J. Bruce Fields
2010-09-07  5:13       ` J. Bruce Fields
2010-09-07 18:23         ` Trond Myklebust
2010-09-08 22:05         ` J. Bruce Fields
2010-09-08 23:07           ` Trond Myklebust
2010-09-09  1:23             ` J. Bruce Fields
2010-09-09 15:58           ` J. Bruce Fields
2010-09-07 17:24       ` J. Bruce Fields
2010-09-12 21:07       ` Trond Myklebust
2010-09-12 23:47         ` J. Bruce Fields
2010-09-13 17:49           ` J. Bruce Fields [this message]
2010-09-07 23:03     ` [PATCH] SUNRPC: cleanup state-machine ordering J. Bruce Fields

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=20100913174917.GB16253@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=Trond.Myklebust@netapp.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.