All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] statd: not unlinking host files
@ 2008-12-06 14:34 Steve Dickson
       [not found] ` <493A8D71.20603-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 6+ messages in thread
From: Steve Dickson @ 2008-12-06 14:34 UTC (permalink / raw)
  To: Linux NFS Mailing list

Again working with the state file code, I notice that statd was
not unlinking hosts files when the kernel sent up the 
sm_unmon messages. This following patch address the reason why... 

Comments?

steved.

commit f8536d0e210a8151900f8c68185927790239eb62
Author: Steve Dickson <steved@redhat.com>
Date:   Sat Dec 6 09:30:43 2008 -0500

    statd: not unlinking host files
    
    Statd is not unlinking host files during SM_UNMON and
    SM_UNMON_ALL calls because the given host is still on the run-time
    notify list (rtnl) and the check flag is set when xunlink() is
    called. But the next thing the caller of xunlink() does is
    remove the host from the rtnl list which means the
    unlink will never happen.
    
    So in cases where xunlink() is immediately follow by a call
    to nlist_free() (which removes the host from the list) the
    check flag to xunlink() is not set.
    
    Signed-off-by: Steve Dickson <steved@redhat.com>

diff --git a/utils/statd/monitor.c b/utils/statd/monitor.c
index a6a1d9c..7d6e4da 100644
--- a/utils/statd/monitor.c
+++ b/utils/statd/monitor.c
@@ -352,7 +352,7 @@ sm_unmon_1_svc(struct mon_id *argp, struct svc_req *rqstp)
 			/* PRC: do the HA callout: */
 			ha_callout("del-client", mon_name, my_name, -1);
 
-			xunlink(SM_DIR, clnt->dns_name, 1);
+			xunlink(SM_DIR, clnt->dns_name, 0);
 			nlist_free(&rtnl, clnt);
 
 			return (&result);
@@ -404,7 +404,7 @@ sm_unmon_all_1_svc(struct my_id *argp, struct svc_req *rqstp)
 			temp = NL_NEXT(clnt);
 			/* PRC: do the HA callout: */
 			ha_callout("del-client", mon_name, my_name, -1);
-			xunlink(SM_DIR, clnt->dns_name, 1);
+			xunlink(SM_DIR, clnt->dns_name, 0);
 			nlist_free(&rtnl, clnt);
 			++count;
 			clnt = temp;

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] statd: not unlinking host files
       [not found] ` <493A8D71.20603-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
@ 2008-12-08 23:33   ` J. Bruce Fields
  2008-12-08 23:48     ` Chuck Lever
  2008-12-09  0:40     ` Steve Dickson
  2008-12-17 21:48   ` Steve Dickson
  1 sibling, 2 replies; 6+ messages in thread
From: J. Bruce Fields @ 2008-12-08 23:33 UTC (permalink / raw)
  To: Steve Dickson; +Cc: Linux NFS Mailing list

On Sat, Dec 06, 2008 at 09:34:25AM -0500, Steve Dickson wrote:
> Again working with the state file code, I notice that statd was
> not unlinking hosts files when the kernel sent up the 
> sm_unmon messages. This following patch address the reason why... 
> 
> Comments?

Bizarre--thanks for catching that.

But it looks like these are actually the only two callers to xunlink?
In which case, we should just ditch the "check" parameter entirely and
avoid some confusion....

(I wonder how it ever got this way in the first case?)

--b.

> 
> steved.
> 
> commit f8536d0e210a8151900f8c68185927790239eb62
> Author: Steve Dickson <steved@redhat.com>
> Date:   Sat Dec 6 09:30:43 2008 -0500
> 
>     statd: not unlinking host files
>     
>     Statd is not unlinking host files during SM_UNMON and
>     SM_UNMON_ALL calls because the given host is still on the run-time
>     notify list (rtnl) and the check flag is set when xunlink() is
>     called. But the next thing the caller of xunlink() does is
>     remove the host from the rtnl list which means the
>     unlink will never happen.
>     
>     So in cases where xunlink() is immediately follow by a call
>     to nlist_free() (which removes the host from the list) the
>     check flag to xunlink() is not set.
>     
>     Signed-off-by: Steve Dickson <steved@redhat.com>
> 
> diff --git a/utils/statd/monitor.c b/utils/statd/monitor.c
> index a6a1d9c..7d6e4da 100644
> --- a/utils/statd/monitor.c
> +++ b/utils/statd/monitor.c
> @@ -352,7 +352,7 @@ sm_unmon_1_svc(struct mon_id *argp, struct svc_req *rqstp)
>  			/* PRC: do the HA callout: */
>  			ha_callout("del-client", mon_name, my_name, -1);
>  
> -			xunlink(SM_DIR, clnt->dns_name, 1);
> +			xunlink(SM_DIR, clnt->dns_name, 0);
>  			nlist_free(&rtnl, clnt);
>  
>  			return (&result);
> @@ -404,7 +404,7 @@ sm_unmon_all_1_svc(struct my_id *argp, struct svc_req *rqstp)
>  			temp = NL_NEXT(clnt);
>  			/* PRC: do the HA callout: */
>  			ha_callout("del-client", mon_name, my_name, -1);
> -			xunlink(SM_DIR, clnt->dns_name, 1);
> +			xunlink(SM_DIR, clnt->dns_name, 0);
>  			nlist_free(&rtnl, clnt);
>  			++count;
>  			clnt = temp;
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] statd: not unlinking host files
  2008-12-08 23:33   ` J. Bruce Fields
@ 2008-12-08 23:48     ` Chuck Lever
  2008-12-09  0:40       ` Steve Dickson
  2008-12-09  0:40     ` Steve Dickson
  1 sibling, 1 reply; 6+ messages in thread
From: Chuck Lever @ 2008-12-08 23:48 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: Steve Dickson, Linux NFS Mailing list

On Dec 8, 2008, at Dec 8, 2008, 6:33 PM, J. Bruce Fields wrote:
> On Sat, Dec 06, 2008 at 09:34:25AM -0500, Steve Dickson wrote:
>> Again working with the state file code, I notice that statd was
>> not unlinking hosts files when the kernel sent up the
>> sm_unmon messages. This following patch address the reason why...
>>
>> Comments?
>
> Bizarre--thanks for catching that.
>
> But it looks like these are actually the only two callers to xunlink?
> In which case, we should just ditch the "check" parameter entirely and
> avoid some confusion....

It looks like xunlink() doesn't check error returns properly either.   
alloca() is a convenience, but the price is a SIGSEGV if the stack  
frame can't be extended.

For a system-level daemon like rpc.statd, I would rather see a proper  
implementation of this using malloc(3) or automatic storage, and  
ensuring that sprintf doesn't overrun its buffer.  This also makes it  
possible to track the buffer allocation here using valgrind.  alloca()  
is a completely inline implementation, according to its man page.

I'm not sure why statd has it's own implementation of xstrdup and  
xmalloc here as well; support/nfs/* already has both of these.  It  
would be worth getting rid of these too.

> (I wonder how it ever got this way in the first case?)

Likely that rpc.statd was integrated into nfs-utils a long time ago  
from somewhere else that needed the switch argument.

>
>
> --b.
>
>>
>> steved.
>>
>> commit f8536d0e210a8151900f8c68185927790239eb62
>> Author: Steve Dickson <steved@redhat.com>
>> Date:   Sat Dec 6 09:30:43 2008 -0500
>>
>>    statd: not unlinking host files
>>
>>    Statd is not unlinking host files during SM_UNMON and
>>    SM_UNMON_ALL calls because the given host is still on the run-time
>>    notify list (rtnl) and the check flag is set when xunlink() is
>>    called. But the next thing the caller of xunlink() does is
>>    remove the host from the rtnl list which means the
>>    unlink will never happen.
>>
>>    So in cases where xunlink() is immediately follow by a call
>>    to nlist_free() (which removes the host from the list) the
>>    check flag to xunlink() is not set.
>>
>>    Signed-off-by: Steve Dickson <steved@redhat.com>
>>
>> diff --git a/utils/statd/monitor.c b/utils/statd/monitor.c
>> index a6a1d9c..7d6e4da 100644
>> --- a/utils/statd/monitor.c
>> +++ b/utils/statd/monitor.c
>> @@ -352,7 +352,7 @@ sm_unmon_1_svc(struct mon_id *argp, struct  
>> svc_req *rqstp)
>> 			/* PRC: do the HA callout: */
>> 			ha_callout("del-client", mon_name, my_name, -1);
>>
>> -			xunlink(SM_DIR, clnt->dns_name, 1);
>> +			xunlink(SM_DIR, clnt->dns_name, 0);
>> 			nlist_free(&rtnl, clnt);
>>
>> 			return (&result);
>> @@ -404,7 +404,7 @@ sm_unmon_all_1_svc(struct my_id *argp, struct  
>> svc_req *rqstp)
>> 			temp = NL_NEXT(clnt);
>> 			/* PRC: do the HA callout: */
>> 			ha_callout("del-client", mon_name, my_name, -1);
>> -			xunlink(SM_DIR, clnt->dns_name, 1);
>> +			xunlink(SM_DIR, clnt->dns_name, 0);
>> 			nlist_free(&rtnl, clnt);
>> 			++count;
>> 			clnt = temp;
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux- 
>> nfs" in
>> the body of a message to majordomo@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs"  
> in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Chuck Lever
chuck[dot]lever[at]oracle[dot]com





^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] statd: not unlinking host files
  2008-12-08 23:33   ` J. Bruce Fields
  2008-12-08 23:48     ` Chuck Lever
@ 2008-12-09  0:40     ` Steve Dickson
  1 sibling, 0 replies; 6+ messages in thread
From: Steve Dickson @ 2008-12-09  0:40 UTC (permalink / raw)
  To: J. Bruce Fields; +Cc: Linux NFS Mailing list



J. Bruce Fields wrote:
> On Sat, Dec 06, 2008 at 09:34:25AM -0500, Steve Dickson wrote:
>> Again working with the state file code, I notice that statd was
>> not unlinking hosts files when the kernel sent up the 
>> sm_unmon messages. This following patch address the reason why... 
>>
>> Comments?
> 
> Bizarre--thanks for catching that.
> 
> But it looks like these are actually the only two callers to xunlink?
> In which case, we should just ditch the "check" parameter entirely and
> avoid some confusion....
I thought of that... I wanted to get the patch out and I wanted
to get some context from the list as to why the check was there... 
I'll clean it up...

steved.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] statd: not unlinking host files
  2008-12-08 23:48     ` Chuck Lever
@ 2008-12-09  0:40       ` Steve Dickson
  0 siblings, 0 replies; 6+ messages in thread
From: Steve Dickson @ 2008-12-09  0:40 UTC (permalink / raw)
  To: Chuck Lever; +Cc: J. Bruce Fields, Linux NFS Mailing list



Chuck Lever wrote:
> On Dec 8, 2008, at Dec 8, 2008, 6:33 PM, J. Bruce Fields wrote:
>> On Sat, Dec 06, 2008 at 09:34:25AM -0500, Steve Dickson wrote:
>>> Again working with the state file code, I notice that statd was
>>> not unlinking hosts files when the kernel sent up the
>>> sm_unmon messages. This following patch address the reason why...
>>>
>>> Comments?
>>
>> Bizarre--thanks for catching that.
>>
>> But it looks like these are actually the only two callers to xunlink?
>> In which case, we should just ditch the "check" parameter entirely and
>> avoid some confusion....
> 
> It looks like xunlink() doesn't check error returns properly either. 
> alloca() is a convenience, but the price is a SIGSEGV if the stack frame
> can't be extended.
> 
> For a system-level daemon like rpc.statd, I would rather see a proper
> implementation of this using malloc(3) or automatic storage, and
> ensuring that sprintf doesn't overrun its buffer.  This also makes it
> possible to track the buffer allocation here using valgrind.  alloca()
> is a completely inline implementation, according to its man page.
> 
> I'm not sure why statd has it's own implementation of xstrdup and
> xmalloc here as well; support/nfs/* already has both of these.  It would
> be worth getting rid of these too.
Added to the TODO list... 

steved.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] statd: not unlinking host files
       [not found] ` <493A8D71.20603-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
  2008-12-08 23:33   ` J. Bruce Fields
@ 2008-12-17 21:48   ` Steve Dickson
  1 sibling, 0 replies; 6+ messages in thread
From: Steve Dickson @ 2008-12-17 21:48 UTC (permalink / raw)
  To: Linux NFS Mailing list

This is the patch I committed....

steved.

commit bc870150cc2116584aee288d15ac2b9a2f825ff5
Author: Steve Dickson <steved@redhat.com>
Date:   Wed Dec 17 16:41:35 2008 -0500

    statd: not unlinking host files
    
    Statd is not unlinking host files during SM_UNMON and
    SM_UNMON_ALL calls because the given host is still on the run-time
    notify list (rtnl) and the check flag is set when xunlink() is
    called. But the next thing the caller of xunlink() does is
    remove the host from the rtnl list which means the
    unlink will never happen.
    
    So this patch removes the check flag from xunlink() since
    its not needed and correctly allocates and frees memory
    used by xunlink().
    
    Signed-off-by: Steve Dickson <steved@redhat.com>

diff --git a/utils/statd/misc.c b/utils/statd/misc.c
index fd201b4..7256291 100644
--- a/utils/statd/misc.c
+++ b/utils/statd/misc.c
@@ -53,23 +53,25 @@ xstrdup (const char *string)
 
 
 /*
- * Call with check=1 to verify that this host is not still on the rtnl
- * before unlinking file.
+ * Unlinking a file.
  */
 void
-xunlink (char *path, char *host, short int check)
+xunlink (char *path, char *host)
 {
-  char *tozap;
+	char *tozap;
 
-  tozap=alloca (strlen(path)+strlen(host)+2);
-  sprintf (tozap, "%s/%s", path, host);
+	tozap = malloc(strlen(path)+strlen(host)+2);
+	if (tozap == NULL) {
+		note(N_ERROR, "xunlink: malloc failed: errno %d (%s)", 
+			errno, strerror(errno));
+		return;
+	}
+	sprintf (tozap, "%s/%s", path, host);
 
-  if (!check || !nlist_gethost(rtnl, host, 0)) {
-    if (unlink (tozap) == -1)
-      note (N_ERROR, "unlink (%s): %s", tozap, strerror (errno));
-    else
-      dprintf (N_DEBUG, "Unlinked %s", tozap);
-  }
-  else
-    dprintf (N_DEBUG, "Not unlinking %s--host still monitored.", tozap);
+	if (unlink (tozap) == -1)
+		note(N_ERROR, "unlink (%s): %s", tozap, strerror (errno));
+	else
+		dprintf (N_DEBUG, "Unlinked %s", tozap);
+
+	free(tozap);
 }
diff --git a/utils/statd/monitor.c b/utils/statd/monitor.c
index a6a1d9c..24c2531 100644
--- a/utils/statd/monitor.c
+++ b/utils/statd/monitor.c
@@ -352,7 +352,7 @@ sm_unmon_1_svc(struct mon_id *argp, struct svc_req *rqstp)
 			/* PRC: do the HA callout: */
 			ha_callout("del-client", mon_name, my_name, -1);
 
-			xunlink(SM_DIR, clnt->dns_name, 1);
+			xunlink(SM_DIR, clnt->dns_name);
 			nlist_free(&rtnl, clnt);
 
 			return (&result);
@@ -404,7 +404,7 @@ sm_unmon_all_1_svc(struct my_id *argp, struct svc_req *rqstp)
 			temp = NL_NEXT(clnt);
 			/* PRC: do the HA callout: */
 			ha_callout("del-client", mon_name, my_name, -1);
-			xunlink(SM_DIR, clnt->dns_name, 1);
+			xunlink(SM_DIR, clnt->dns_name);
 			nlist_free(&rtnl, clnt);
 			++count;
 			clnt = temp;
diff --git a/utils/statd/statd.h b/utils/statd/statd.h
index 5a6e289..88ba208 100644
--- a/utils/statd/statd.h
+++ b/utils/statd/statd.h
@@ -53,7 +53,7 @@ extern int	process_notify_list(void);
 extern int	process_reply(FD_SET_TYPE *);
 extern char *	xstrdup(const char *);
 extern void *	xmalloc(size_t);
-extern void	xunlink (char *, char *, short int);
+extern void	xunlink (char *, char *);
 extern void	load_state(void);
 
 /*

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-12-17 21:50 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-12-06 14:34 [PATCH] statd: not unlinking host files Steve Dickson
     [not found] ` <493A8D71.20603-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>
2008-12-08 23:33   ` J. Bruce Fields
2008-12-08 23:48     ` Chuck Lever
2008-12-09  0:40       ` Steve Dickson
2008-12-09  0:40     ` Steve Dickson
2008-12-17 21:48   ` Steve Dickson

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.