* [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[parent not found: <493A8D71.20603-AfCzQyP5zfLQT0dZR+AlfA@public.gmane.org>]
* 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: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 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 [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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox