All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stanislav Kinsbursky <skinsbursky@parallels.com>
To: "J. Bruce Fields" <bfields@fieldses.org>
Cc: "Trond.Myklebust@netapp.com" <Trond.Myklebust@netapp.com>,
	"linux-nfs@vger.kernel.org" <linux-nfs@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"devel@openvz.org" <devel@openvz.org>
Subject: Re: [PATCH 2/3] SUNRPC: check rpcbind clients usage counter before decrement
Date: Tue, 1 May 2012 12:20:29 +0400	[thread overview]
Message-ID: <4F9F9CCD.6060008@parallels.com> (raw)
In-Reply-To: <20120430214504.GD22323@fieldses.org>

01.05.2012 01:45, J. Bruce Fields написал:
> On Fri, Apr 27, 2012 at 06:08:13PM +0400, Stanislav Kinsbursky wrote:
>> On 27.04.2012 17:55, J. Bruce Fields wrote:
>>> On Wed, Apr 25, 2012 at 05:37:49PM +0400, Stanislav Kinsbursky wrote:
>>>> Registering service with svc_bind() can fail. In this case service will be
>>>> destroyed and during destruction it will try to unregister itself from rpcbind.
>>>> In this case unregister have to be skipped.
>>> Isn't this a preexisting bug, in which case perhaps Trond should at it
>>> to his list of bugs to submit now?
>>>
>> Not it's not.
>>
>> Previously, in case of bind operations failure, rpcb_put_local()
>> wasn't called, but service data was destroyed instead:
>>
>> -	if (svc_uses_rpcbind(serv)) {
>> -		if (svc_rpcb_setup(serv, current->nsproxy->net_ns)<  0) {
>> -			kfree(serv->sv_pools);
>> -			kfree(serv);
>> -			return NULL;
>> -		}
>> -		if (!serv->sv_shutdown)
>> -			serv->sv_shutdown = svc_rpcb_cleanup;
>> -	}
>>
>> Now (with svc_bind() introduction) service can be created, but
>> svc_bind() could fail. And thus svc_destroy() have to be called.
>> Which will call rpcb_put_local().
>>
>> And the problem here that svc_bind() can fail before incrementing of
>> rpcb usage counter.
> OK, but then you're fixing a bug that you just introduced with the
> previous patch.
>
> So this should be combined with the previous patch.
>
> --b.

You, probably, right. I'll do this.
Thanks.

>>>> Signed-off-by: Stanislav Kinsbursky<skinsbursky@parallels.com>
>>>>
>>>> ---
>>>>   net/sunrpc/rpcb_clnt.c |   12 +++++++-----
>>>>   1 files changed, 7 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c
>>>> index 78ac39f..4c38b33 100644
>>>> --- a/net/sunrpc/rpcb_clnt.c
>>>> +++ b/net/sunrpc/rpcb_clnt.c
>>>> @@ -180,14 +180,16 @@ void rpcb_put_local(struct net *net)
>>>>   	struct sunrpc_net *sn = net_generic(net, sunrpc_net_id);
>>>>   	struct rpc_clnt *clnt = sn->rpcb_local_clnt;
>>>>   	struct rpc_clnt *clnt4 = sn->rpcb_local_clnt4;
>>>> -	int shutdown;
>>>> +	int shutdown = 0;
>>>>
>>>>   	spin_lock(&sn->rpcb_clnt_lock);
>>>> -	if (--sn->rpcb_users == 0) {
>>>> -		sn->rpcb_local_clnt = NULL;
>>>> -		sn->rpcb_local_clnt4 = NULL;
>>>> +	if (sn->rpcb_users) {
>>>> +		if (--sn->rpcb_users == 0) {
>>>> +			sn->rpcb_local_clnt = NULL;
>>>> +			sn->rpcb_local_clnt4 = NULL;
>>>> +		}
>>>> +		shutdown = !sn->rpcb_users;
>>>>   	}
>>>> -	shutdown = !sn->rpcb_users;
>>>>   	spin_unlock(&sn->rpcb_clnt_lock);
>>>>
>>>>   	if (shutdown) {
>>>>
>>
>> -- 
>> Best regards,
>> Stanislav Kinsbursky


  reply	other threads:[~2012-05-01  8:20 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-04-25 13:37 [PATCH 0/3] SUNRPC: separate per-net data creation from service creation Stanislav Kinsbursky
2012-04-25 13:37 ` [PATCH 1/3] SUNRPC: new svc_bind() routine introduced Stanislav Kinsbursky
2012-04-25 13:37 ` [PATCH 2/3] SUNRPC: check rpcbind clients usage counter before decrement Stanislav Kinsbursky
2012-04-27 13:55   ` J. Bruce Fields
2012-04-27 14:08     ` Stanislav Kinsbursky
2012-04-30 21:45       ` J. Bruce Fields
2012-05-01  8:20         ` Stanislav Kinsbursky [this message]
2012-04-25 13:37 ` [PATCH 3/3] SUNRPC: move per-net operations from svc_destroy() Stanislav Kinsbursky
2012-04-25 14:00   ` [PATCH v2 " Stanislav Kinsbursky

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=4F9F9CCD.6060008@parallels.com \
    --to=skinsbursky@parallels.com \
    --cc=Trond.Myklebust@netapp.com \
    --cc=bfields@fieldses.org \
    --cc=devel@openvz.org \
    --cc=linux-kernel@vger.kernel.org \
    --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.