This patch initializes the paths in idmap_client structure used by the server side which avoid the problem of this structure not being initialized when a SIGHUP comes in. This also changes nfsdreopen_one() to delete old events and register new ones when its called with an event already registered. Signed-off by: Steve Dickson ------------------------ --- nfs-utils-1.0.7/utils/idmapd/idmapd.c.orig 2005-10-24 10:29:08.000000000 -0400 +++ nfs-utils-1.0.7/utils/idmapd/idmapd.c 2005-10-24 10:32:13.000000000 -0400 @@ -94,18 +94,28 @@ } while (0) #define IC_IDNAME 0 +#define IC_IDNAME_CHAN NFSD_DIR "/nfs4.idtoname/channel" +#define IC_IDNAME_FLUSH NFSD_DIR "/nfs4.idtoname/flush" + #define IC_NAMEID 1 +#define IC_NAMEID_CHAN NFSD_DIR "/nfs4.nametoid/channel" +#define IC_NAMEID_FLUSH NFSD_DIR "/nfs4.nametoid/flush" + struct idmap_client { - int ic_fd; - int ic_dirfd; + short ic_which; char ic_clid[30]; + char *ic_id; char ic_path[PATH_MAX]; + int ic_fd; + int ic_dirfd; int ic_scanned; struct event ic_event; - char *ic_id; - short ic_which; TAILQ_ENTRY(idmap_client) ic_next; }; +static struct idmap_client nfsd_ic[2] = { +{IC_IDNAME, "Server", "", IC_IDNAME_CHAN, -1, -1, 0}, +{IC_NAMEID, "Server", "", IC_NAMEID_CHAN, -1, -1, 0}, +}; TAILQ_HEAD(idmap_clientq, idmap_client); @@ -138,7 +148,6 @@ static char pipefsdir[PATH_MAX]; static char *nobodyuser, *nobodygroup; static uid_t nobodyuid; static gid_t nobodygid; -static struct idmap_client nfsd_ic[2]; /* Used by cfg.c */ char *conf_path; @@ -164,10 +173,10 @@ flush_nfsd_idmap_cache(void) time_t now = time(NULL); int ret; - ret = flush_nfsd_cache("/proc/net/rpc/nfs4.idtoname/flush", now); + ret = flush_nfsd_cache(IC_IDNAME_FLUSH, now); if (ret) return ret; - ret = flush_nfsd_cache("/proc/net/rpc/nfs4.nametoid/flush", now); + ret = flush_nfsd_cache(IC_NAMEID_FLUSH, now); return ret; } @@ -675,9 +684,13 @@ nfsdreopen_one(struct idmap_client *ic) if (verbose > 0) idmapd_warnx("ReOpening %s", ic->ic_path); + if ((fd = open(ic->ic_path, O_RDWR, 0)) != -1) { if (ic->ic_fd != -1) close(ic->ic_fd); + if ((ic->ic_event.ev_flags & EVLIST_INIT)) + event_del(&ic->ic_event); + ic->ic_event.ev_fd = ic->ic_fd = fd; event_set(&ic->ic_event, ic->ic_fd, EV_READ, nfsdcb, ic); event_add(&ic->ic_event, NULL); @@ -687,9 +700,6 @@ nfsdreopen_one(struct idmap_client *ic) } } -/* - * Note: nfsdreopen assumes nfsdopen has already been called - */ static void nfsdreopen() { @@ -710,9 +720,6 @@ nfsdopenone(struct idmap_client *ic, sho { char *whichstr; - whichstr = which == IC_IDNAME ? "idtoname" : "nametoid"; - snprintf(ic->ic_path, sizeof(ic->ic_path), - "%s/nfs4.%s/channel", path, whichstr); if ((ic->ic_fd = open(ic->ic_path, O_RDWR, 0)) == -1) { if (verbose > 0) idmapd_warnx("Opening %s failed: errno %d (%s)", @@ -723,10 +730,6 @@ nfsdopenone(struct idmap_client *ic, sho event_set(&ic->ic_event, ic->ic_fd, EV_READ, nfsdcb, ic); event_add(&ic->ic_event, NULL); - ic->ic_which = which; - ic->ic_id = "Server"; - strlcpy(ic->ic_clid, "Server", strlen("Server")); - if (verbose > 0) idmapd_warnx("Opened %s", ic->ic_path);