133 lines
3.8 KiB
Diff
133 lines
3.8 KiB
Diff
commit ec08843916d07c28045398e5b17e7347a8fa0135
|
|
Author: Steve Dickson <steved@redhat.com>
|
|
Date: Fri May 11 12:13:06 2007 -0400
|
|
|
|
nfs-utils: have mountd hold open etab file to force inode number to change
|
|
|
|
This patch changes mountd to hold the etab file open so that when it's
|
|
changed by exportfs, the inode number should change. We then change
|
|
auth_reload to reload the file based on whether st_ino is different
|
|
from the last time it was checked. It also changes auth_reload to
|
|
maintain a static counter value and return it instead of a timestamp
|
|
and fixes up get_exportlist accordingly. Finally, it adds some
|
|
comments to xtab_write to warn people about editing the etab in place.
|
|
|
|
Signed-off-by: Jeff Layton <jlayton@redhat.com>
|
|
|
|
Signed-off-by: Steve Dickson <steved@redhat.com>
|
|
|
|
diff --git a/support/export/xtab.c b/support/export/xtab.c
|
|
index 0ddb251..292087b 100644
|
|
--- a/support/export/xtab.c
|
|
+++ b/support/export/xtab.c
|
|
@@ -80,6 +80,12 @@ xtab_export_read(void)
|
|
return xtab_read(_PATH_ETAB, 1);
|
|
}
|
|
|
|
+/*
|
|
+ * mountd now keeps an open fd for the etab at all times to make sure that the
|
|
+ * inode number changes when the xtab_export_write is done. If you change the
|
|
+ * routine below such that the files are edited in place, then you'll need to
|
|
+ * fix the auth_reload logic as well...
|
|
+ */
|
|
static int
|
|
xtab_write(char *xtab, char *xtabtmp, int is_export)
|
|
{
|
|
diff --git a/utils/mountd/auth.c b/utils/mountd/auth.c
|
|
index 183c9ea..f7fe23d 100644
|
|
--- a/utils/mountd/auth.c
|
|
+++ b/utils/mountd/auth.c
|
|
@@ -14,6 +14,7 @@
|
|
#include <netinet/in.h>
|
|
#include <arpa/inet.h>
|
|
#include <errno.h>
|
|
+#include <unistd.h>
|
|
#include "misc.h"
|
|
#include "nfslib.h"
|
|
#include "exportfs.h"
|
|
@@ -46,24 +47,34 @@ auth_init(char *exports)
|
|
xtab_mount_write();
|
|
}
|
|
|
|
-time_t
|
|
+unsigned int
|
|
auth_reload()
|
|
{
|
|
struct stat stb;
|
|
- static time_t last_modified = 0;
|
|
-
|
|
- if (stat(_PATH_ETAB, &stb) < 0)
|
|
+ static ino_t last_inode;
|
|
+ static int last_fd;
|
|
+ static unsigned int counter;
|
|
+ int fd;
|
|
+
|
|
+ if ((fd = open(_PATH_ETAB, O_RDONLY)) < 0) {
|
|
+ xlog(L_FATAL, "couldn't open %s", _PATH_ETAB);
|
|
+ } else if (fstat(fd, &stb) < 0) {
|
|
xlog(L_FATAL, "couldn't stat %s", _PATH_ETAB);
|
|
- if (stb.st_mtime == last_modified)
|
|
- return last_modified;
|
|
- last_modified = stb.st_mtime;
|
|
+ } else if (stb.st_ino == last_inode) {
|
|
+ close(fd);
|
|
+ return counter;
|
|
+ } else {
|
|
+ close(last_fd);
|
|
+ last_fd = fd;
|
|
+ last_inode = stb.st_ino;
|
|
+ }
|
|
|
|
export_freeall();
|
|
memset(&my_client, 0, sizeof(my_client));
|
|
- // export_read(export_file);
|
|
xtab_export_read();
|
|
+ ++counter;
|
|
|
|
- return last_modified;
|
|
+ return counter;
|
|
}
|
|
|
|
static nfs_export *
|
|
diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
|
|
index fc9a73c..09cab84 100644
|
|
--- a/utils/mountd/mountd.c
|
|
+++ b/utils/mountd/mountd.c
|
|
@@ -465,18 +465,18 @@ 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;
|
|
+ static unsigned int ecounter;
|
|
+ unsigned int acounter;
|
|
|
|
- atime = auth_reload();
|
|
- if (elist && atime == etime)
|
|
+ acounter = auth_reload();
|
|
+ if (elist && acounter == ecounter)
|
|
return elist;
|
|
|
|
- etime = atime;
|
|
+ ecounter = acounter;
|
|
|
|
for (e = elist; e != NULL; e = ne) {
|
|
ne = e->ex_next;
|
|
diff --git a/utils/mountd/mountd.h b/utils/mountd/mountd.h
|
|
index b539278..31bacb5 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);
|
|
-time_t auth_reload(void);
|
|
+unsigned int auth_reload(void);
|
|
nfs_export * auth_authenticate(char *what, struct sockaddr_in *sin,
|
|
char *path);
|
|
void auth_export(nfs_export *exp);
|