From: Neil Brown Date: Thu, 11 Jan 2007 01:51:29 +0000 (+1100) Subject: Ensure 'showmount -e' gets current information. X-Git-Tag: nfs-utils-1-0-11~31 X-Git-Url: https://git.decadent.org.uk/gitweb/?a=commitdiff_plain;h=dbeba43bd33ce41bc3c5c95615176e59eb76f00c;p=nfs-utils.git Ensure 'showmount -e' gets current information. If auth_reload has been called by someone else, get_exportlist can incorrectly return old data. So track modify times better and only use cached data if the modify time matches. --- diff --git a/utils/mountd/auth.c b/utils/mountd/auth.c index 4f803d7..183c9ea 100644 --- a/utils/mountd/auth.c +++ b/utils/mountd/auth.c @@ -46,7 +46,7 @@ auth_init(char *exports) xtab_mount_write(); } -int +time_t auth_reload() { struct stat stb; @@ -55,7 +55,7 @@ auth_reload() if (stat(_PATH_ETAB, &stb) < 0) xlog(L_FATAL, "couldn't stat %s", _PATH_ETAB); if (stb.st_mtime == last_modified) - return 0; + return last_modified; last_modified = stb.st_mtime; export_freeall(); @@ -63,7 +63,7 @@ auth_reload() // export_read(export_file); xtab_export_read(); - return 1; + return last_modified; } static nfs_export * diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c index 72332ce..5204faa 100644 --- a/utils/mountd/mountd.c +++ b/utils/mountd/mountd.c @@ -463,14 +463,19 @@ static exports get_exportlist(void) { static exports elist = NULL; + static time_t etime = 0; + time_t atime; struct exportnode *e, *ne; struct groupnode *g, *ng, *c, **cp; nfs_export *exp; int i; - if (!auth_reload() && elist) + atime = auth_reload(); + if (elist && atime == etime) return elist; + etime = atime; + for (e = elist; e != NULL; e = ne) { ne = e->ex_next; for (g = e->ex_groups; g != NULL; g = ng) { diff --git a/utils/mountd/mountd.h b/utils/mountd/mountd.h index d64c171..b539278 100644 --- a/utils/mountd/mountd.h +++ b/utils/mountd/mountd.h @@ -40,7 +40,7 @@ bool_t mount_mnt_3_svc(struct svc_req *, dirpath *, mountres3 *); void mount_dispatch(struct svc_req *, SVCXPRT *); void auth_init(char *export_file); -int auth_reload(void); +time_t auth_reload(void); nfs_export * auth_authenticate(char *what, struct sockaddr_in *sin, char *path); void auth_export(nfs_export *exp);