Updated to latest upstream version: 1.1.4

This commit is contained in:
Steve Dickson 2008-10-18 14:01:23 +00:00
parent 8ce9ec1067
commit 6785cb4c34
16 changed files with 16 additions and 1009 deletions

View File

@ -13,3 +13,4 @@ nfs-utils-1.1.0.tar.bz2
nfs-utils-1.1.1.tar.bz2
nfs-utils-1.1.2.tar.bz2
nfs-utils-1.1.3.tar.bz2
nfs-utils-1.1.4.tar.bz2

View File

@ -1,9 +1,9 @@
diff -up nfs-utils-1.1.3/utils/statd/sm-notify.c.orig nfs-utils-1.1.3/utils/statd/sm-notify.c
--- nfs-utils-1.1.3/utils/statd/sm-notify.c.orig 2008-07-27 17:01:45.000000000 -0400
+++ nfs-utils-1.1.3/utils/statd/sm-notify.c 2008-07-28 04:30:37.000000000 -0400
@@ -26,11 +26,13 @@
#include "config.h"
diff -up nfs-utils-1.1.4/utils/statd/sm-notify.c.orig nfs-utils-1.1.4/utils/statd/sm-notify.c
--- nfs-utils-1.1.4/utils/statd/sm-notify.c.orig 2008-10-17 10:20:09.000000000 -0400
+++ nfs-utils-1.1.4/utils/statd/sm-notify.c 2008-10-17 11:22:01.000000000 -0400
@@ -28,11 +28,13 @@
#include <errno.h>
#include <grp.h>
+#define STATD_PATH_XTN "statd/"
+
@ -17,9 +17,9 @@ diff -up nfs-utils-1.1.3/utils/statd/sm-notify.c.orig nfs-utils-1.1.3/utils/stat
# endif
#endif
diff -up nfs-utils-1.1.3/utils/statd/sm-notify.man.orig nfs-utils-1.1.3/utils/statd/sm-notify.man
--- nfs-utils-1.1.3/utils/statd/sm-notify.man.orig 2008-07-27 17:01:45.000000000 -0400
+++ nfs-utils-1.1.3/utils/statd/sm-notify.man 2008-07-28 04:30:37.000000000 -0400
diff -up nfs-utils-1.1.4/utils/statd/sm-notify.man.orig nfs-utils-1.1.4/utils/statd/sm-notify.man
--- nfs-utils-1.1.4/utils/statd/sm-notify.man.orig 2008-10-17 10:20:09.000000000 -0400
+++ nfs-utils-1.1.4/utils/statd/sm-notify.man 2008-10-17 11:22:01.000000000 -0400
@@ -33,7 +33,7 @@ but this is configurable.
For each NFS client or server machine to be monitored,
.B rpc.statd

View File

@ -1,44 +0,0 @@
commit ec16220910f0bf1bf2b8e1d50e78df7da11d8b1e
Author: David Woodhouse <David.Woodhouse@intel.com>
Date: Thu Aug 28 11:07:53 2008 -0400
Stop exportfs warning about needing fsid, when we actually have one
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/utils/exportfs/exportfs.c b/utils/exportfs/exportfs.c
index 18dfe5a..fec2571 100644
--- a/utils/exportfs/exportfs.c
+++ b/utils/exportfs/exportfs.c
@@ -12,6 +12,7 @@
#include <config.h>
#endif
+#include <sys/vfs.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
@@ -388,6 +389,8 @@ validate_export(nfs_export *exp)
*/
struct stat stb;
char *path = exp->m_export.e_path;
+ struct statfs64 stf;
+ int fs_has_fsid = 0;
if (stat(path, &stb) < 0) {
fprintf(stderr, "exportfs: Warning: %s does not exist\n",
@@ -403,7 +406,12 @@ validate_export(nfs_export *exp)
if (!can_test())
return;
- if ((exp->m_export.e_flags & NFSEXP_FSID) || exp->m_export.e_uuid) {
+ if (!statfs64(path, &stf) &&
+ (stf.f_fsid.__val[0] || stf.f_fsid.__val[1]))
+ fs_has_fsid = 1;
+
+ if ((exp->m_export.e_flags & NFSEXP_FSID) || exp->m_export.e_uuid ||
+ fs_has_fsid) {
if ( !test_export(path, 1)) {
fprintf(stderr, "exportfs: Warning: %s does not "
"support NFS export.\n",

View File

@ -1,49 +0,0 @@
commit 2d173a587a7dbee81ffaf246d044f384fb6487c8
Author: Chuck Lever <chuck.lever@oracle.com>
Date: Thu Jul 31 05:24:18 2008 -0400
mount.nfs command: old glibc missing some flags
Old versions of glibc (< 2.4) have a getaddrinfo(3) implementation, but
do not include public definitions of the AI_V4MAPPED, AI_ALL, and
AI_ADDRCONFIG flags because it was believed that these flags were not
standardized. However, these flags have standard definitions both in
POSIX 1003 and in RFCs, and were thus included in later releases of
glibc.
To allow the mount.nfs command to build on systems with these older
versions of glibc, add conditional definitions for these flags in
utils/mount/network.c.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/utils/mount/network.c b/utils/mount/network.c
index 75354a7..0023769 100644
--- a/utils/mount/network.c
+++ b/utils/mount/network.c
@@ -48,6 +48,24 @@
#include "mount_constants.h"
#include "network.h"
+/*
+ * Earlier versions of glibc's /usr/include/netdb.h exclude these
+ * definitions because it was thought they were not part of a stable
+ * POSIX standard. However, they are defined by RFC 2553 and 3493
+ * and in POSIX 1003.1-2001, so these definitions were added in later
+ * versions of netdb.h.
+ */
+#ifndef AI_V4MAPPED
+#define AI_V4MAPPED 0x0008 /* IPv4-mapped addresses are acceptable. */
+#endif /* AI_V4MAPPED */
+#ifndef AI_ALL
+#define AI_ALL 0x0010 /* Return both IPv4 and IPv6 addresses. */
+#endif /* AI_ALL */
+#ifndef AI_ADDRCONFIG
+#define AI_ADDRCONFIG 0x0020 /* Use configuration of this host to choose \
+ returned address type. */
+#endif /* AI_ADDRCONFIG */
+
#define PMAP_TIMEOUT (10)
#define CONNECT_TIMEOUT (20)
#define MOUNT_TIMEOUT (30)

View File

@ -1,28 +0,0 @@
commit 83a8da644b553680e9d578843a6fa0fc9347af0e
Author: J. Bruce Fields <bfields@citi.umich.edu>
Date: Thu Aug 28 11:25:29 2008 -0400
Remove idmapd.conf
The example idmapd.conf file is kept in libnfsidmap now, which is what's
responsible for parsing it anyway.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/utils/idmapd/idmapd.conf b/utils/idmapd/idmapd.conf
deleted file mode 100644
index acafd4b..0000000
--- a/utils/idmapd/idmapd.conf
+++ /dev/null
@@ -1,10 +0,0 @@
-[General]
-
-Verbosity = 0
-Pipefs-Directory = /var/lib/nfs/rpc_pipefs
-Domain = localdomain
-
-[Mapping]
-
-Nobody-User = nobody
-Nobody-Group = nobody

View File

@ -1,192 +0,0 @@
commit 60107345a32982bb0ff9eb8a17f8f0edf0276a98
Author: J. Bruce Fields <bfields@citi.umich.edu>
Date: Thu Aug 28 11:20:58 2008 -0400
Minor mountd.c cleanup
I find it more readable to have the normal (non-error) case unindented,
and to keep conditionals relatively simple, as is the usual kernel
style. Fix some inconsistent indentation while we're there.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
index 0facf89..d5b8c0d 100644
--- a/utils/mountd/mountd.c
+++ b/utils/mountd/mountd.c
@@ -175,9 +175,9 @@ killer (int sig)
static void
sig_hup (int sig)
{
- /* don't exit on SIGHUP */
- xlog (L_NOTICE, "Received SIGHUP... Ignoring.\n", sig);
- return;
+ /* don't exit on SIGHUP */
+ xlog (L_NOTICE, "Received SIGHUP... Ignoring.\n", sig);
+ return;
}
bool_t
@@ -192,7 +192,8 @@ mount_mnt_1_svc(struct svc_req *rqstp, dirpath *path, fhstatus *res)
struct nfs_fh_len *fh;
xlog(D_CALL, "MNT1(%s) called", *path);
- if ((fh = get_rootfh(rqstp, path, &res->fhs_status, 0)) != NULL)
+ fh = get_rootfh(rqstp, path, &res->fhs_status, 0);
+ if (fh)
memcpy(&res->fhstatus_u.fhs_fhandle, fh->fh_handle, 32);
return 1;
}
@@ -304,7 +305,8 @@ mount_pathconf_2_svc(struct svc_req *rqstp, dirpath *path, ppathcnf *res)
}
/* Now authenticate the intruder... */
- if (!(exp = auth_authenticate("pathconf", sin, p))) {
+ exp = auth_authenticate("pathconf", sin, p);
+ if (!exp) {
return 1;
} else if (stat(p, &stb) < 0) {
xlog(L_WARNING, "can't stat exported dir %s: %s",
@@ -344,18 +346,18 @@ mount_mnt_3_svc(struct svc_req *rqstp, dirpath *path, mountres3 *res)
* issue with older Linux clients, who inspect the list in reversed
* order.
*/
+ struct mountres3_ok *ok = &res->mountres3_u.mountinfo;
struct nfs_fh_len *fh;
xlog(D_CALL, "MNT3(%s) called", *path);
- if ((fh = get_rootfh(rqstp, path, &res->fhs_status, 1)) != NULL) {
- struct mountres3_ok *ok = &res->mountres3_u.mountinfo;
-
- ok->fhandle.fhandle3_len = fh->fh_size;
- ok->fhandle.fhandle3_val = (char *)fh->fh_handle;
- ok->auth_flavors.auth_flavors_len
- = sizeof(flavors)/sizeof(flavors[0]);
- ok->auth_flavors.auth_flavors_val = flavors;
- }
+ fh = get_rootfh(rqstp, path, &res->fhs_status, 1);
+ if (!fh)
+ return 1;
+
+ ok->fhandle.fhandle3_len = fh->fh_size;
+ ok->fhandle.fhandle3_val = (char *)fh->fh_handle;
+ ok->auth_flavors.auth_flavors_len = sizeof(flavors)/sizeof(flavors[0]);
+ ok->auth_flavors.auth_flavors_val = flavors;
return 1;
}
@@ -366,6 +368,7 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, mountstat3 *error, int v3)
(struct sockaddr_in *) svc_getcaller(rqstp->rq_xprt);
struct stat stb, estb;
nfs_export *exp;
+ struct nfs_fh_len *fh;
char rpath[MAXPATHLEN+1];
char *p = *path;
@@ -382,57 +385,65 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, mountstat3 *error, int v3)
}
/* Now authenticate the intruder... */
- if (!(exp = auth_authenticate("mount", sin, p))) {
+ exp = auth_authenticate("mount", sin, p);
+ if (!exp) {
*error = NFSERR_ACCES;
- } else if (stat(p, &stb) < 0) {
+ return NULL;
+ }
+ if (stat(p, &stb) < 0) {
xlog(L_WARNING, "can't stat exported dir %s: %s",
p, strerror(errno));
if (errno == ENOENT)
*error = NFSERR_NOENT;
else
*error = NFSERR_ACCES;
- } else if (!S_ISDIR(stb.st_mode) && !S_ISREG(stb.st_mode)) {
+ return NULL;
+ }
+ if (!S_ISDIR(stb.st_mode) && !S_ISREG(stb.st_mode)) {
xlog(L_WARNING, "%s is not a directory or regular file", p);
*error = NFSERR_NOTDIR;
- } else if (stat(exp->m_export.e_path, &estb) < 0) {
+ return NULL;
+ }
+ if (stat(exp->m_export.e_path, &estb) < 0) {
xlog(L_WARNING, "can't stat export point %s: %s",
p, strerror(errno));
*error = NFSERR_NOENT;
- } else if (estb.st_dev != stb.st_dev
- && (!new_cache || !(exp->m_export.e_flags & NFSEXP_CROSSMOUNT))
- ) {
+ return NULL;
+ }
+ if (estb.st_dev != stb.st_dev
+ && (!new_cache
+ || !(exp->m_export.e_flags & NFSEXP_CROSSMOUNT))) {
xlog(L_WARNING, "request to export directory %s below nearest filesystem %s",
p, exp->m_export.e_path);
*error = NFSERR_ACCES;
- } else if (exp->m_export.e_mountpoint &&
+ return NULL;
+ }
+ if (exp->m_export.e_mountpoint &&
!is_mountpoint(exp->m_export.e_mountpoint[0]?
exp->m_export.e_mountpoint:
exp->m_export.e_path)) {
xlog(L_WARNING, "request to export an unmounted filesystem: %s",
p);
*error = NFSERR_NOENT;
- } else if (new_cache) {
+ return NULL;
+ }
+
+ if (new_cache) {
/* This will be a static private nfs_export with just one
* address. We feed it to kernel then extract the filehandle,
*
*/
- struct nfs_fh_len *fh;
if (cache_export(exp, p)) {
*error = NFSERR_ACCES;
return NULL;
}
fh = cache_get_filehandle(exp, v3?64:32, p);
- if (fh == NULL)
+ if (fh == NULL) {
*error = NFSERR_ACCES;
- else {
- *error = NFS_OK;
- mountlist_add(inet_ntoa(sin->sin_addr), p);
+ return NULL;
}
- return fh;
} else {
- struct nfs_fh_len *fh;
-
if (exp->m_exported<1)
export_export(exp);
if (!exp->m_xtabent)
@@ -448,15 +459,15 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, mountstat3 *error, int v3)
fh = getfh_old ((struct sockaddr *) sin,
stb.st_dev, stb.st_ino);
}
- if (fh != NULL) {
- mountlist_add(inet_ntoa(sin->sin_addr), p);
- *error = NFS_OK;
- return fh;
+ if (fh == NULL) {
+ xlog(L_WARNING, "getfh failed: %s", strerror(errno));
+ *error = NFSERR_ACCES;
+ return NULL;
}
- xlog(L_WARNING, "getfh failed: %s", strerror(errno));
- *error = NFSERR_ACCES;
}
- return NULL;
+ *error = NFS_OK;
+ mountlist_add(inet_ntoa(sin->sin_addr), p);
+ return fh;
}
static exports

View File

@ -1,29 +0,0 @@
commit 86c3a79a108091fe08869a887438cc2d4e1126ed
Author: Neil Brown <neilb@suse.de>
Date: Wed Aug 27 16:30:19 2008 -0400
mount issue with Mac OSX and --manage-gids, client hangs
Make sure are zero len group list is sent down to the
kernel when the gids do not exist on the server.
Tested-by: Alex Samad <alex@samad.com.au>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index f555dcc..609c6e3 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -158,8 +158,10 @@ void auth_unix_gid(FILE *f)
qword_printint(f, ngroups);
for (i=0; i<ngroups; i++)
qword_printint(f, groups[i]);
- }
+ } else
+ qword_printint(f, 0);
qword_eol(f);
+
if (groups != glist)
free(groups);
}

View File

@ -1,124 +0,0 @@
commit 603017f2c1587d760e2649b889b581ca267ffee7
Author: J. Bruce Fields <bfields@citi.umich.edu>
Date: Thu Aug 28 11:23:05 2008 -0400
Determine supported pseudoflavors from export
Instead of using a static list of supported flavors, we should be taking
the list from the export.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
index d5b8c0d..6adb68f 100644
--- a/utils/mountd/mountd.c
+++ b/utils/mountd/mountd.c
@@ -26,6 +26,7 @@
#include "misc.h"
#include "mountd.h"
#include "rpcmisc.h"
+#include "pseudoflavors.h"
extern void cache_open(void);
extern struct nfs_fh_len *cache_get_filehandle(nfs_export *exp, int len, char *p);
@@ -35,7 +36,7 @@ extern void my_svc_run(void);
static void usage(const char *, int exitcode);
static exports get_exportlist(void);
-static struct nfs_fh_len *get_rootfh(struct svc_req *, dirpath *, mountstat3 *, int v3);
+static struct nfs_fh_len *get_rootfh(struct svc_req *, dirpath *, nfs_export **, mountstat3 *, int v3);
int reverse_resolve = 0;
int new_cache = 0;
@@ -192,7 +193,7 @@ mount_mnt_1_svc(struct svc_req *rqstp, dirpath *path, fhstatus *res)
struct nfs_fh_len *fh;
xlog(D_CALL, "MNT1(%s) called", *path);
- fh = get_rootfh(rqstp, path, &res->fhs_status, 0);
+ fh = get_rootfh(rqstp, path, NULL, &res->fhs_status, 0);
if (fh)
memcpy(&res->fhstatus_u.fhs_fhandle, fh->fh_handle, 32);
return 1;
@@ -330,39 +331,57 @@ mount_pathconf_2_svc(struct svc_req *rqstp, dirpath *path, ppathcnf *res)
}
/*
+ * We should advertise the preferred flavours first. (See RFC 2623
+ * section 2.7.) We leave that to the administrator, by advertising
+ * flavours in the order they were listed in /etc/exports. AUTH_NULL is
+ * dropped from the list to avoid backward compatibility issue with
+ * older Linux clients, who inspect the list in reversed order.
+ *
+ * XXX: It might be more helpful to rearrange these so that flavors
+ * giving more access (as determined from readonly and id-squashing
+ * options) come first. (If we decide to do that we should probably do
+ * that when reading the exports rather than here.)
+ */
+static void set_authflavors(struct mountres3_ok *ok, nfs_export *exp)
+{
+ struct sec_entry *s;
+ static int flavors[SECFLAVOR_COUNT];
+ int i = 0;
+
+ for (s = exp->m_export.e_secinfo; s->flav; s++) {
+ if (s->flav->fnum == AUTH_NULL)
+ continue;
+ flavors[i] = s->flav->fnum;
+ i++;
+ }
+ ok->auth_flavors.auth_flavors_val = flavors;
+ ok->auth_flavors.auth_flavors_len = i;
+}
+
+/*
* NFSv3 MOUNT procedure
*/
bool_t
mount_mnt_3_svc(struct svc_req *rqstp, dirpath *path, mountres3 *res)
{
-#define AUTH_GSS_KRB5 390003
-#define AUTH_GSS_KRB5I 390004
-#define AUTH_GSS_KRB5P 390005
- static int flavors[] = { AUTH_UNIX, AUTH_GSS_KRB5, AUTH_GSS_KRB5I, AUTH_GSS_KRB5P};
- /*
- * We should advertise the preferred flavours first. (See RFC 2623
- * section 2.7.) AUTH_UNIX is arbitrarily ranked over the GSS's.
- * AUTH_NULL is dropped from the list to avoid backward compatibility
- * issue with older Linux clients, who inspect the list in reversed
- * order.
- */
struct mountres3_ok *ok = &res->mountres3_u.mountinfo;
+ nfs_export *exp;
struct nfs_fh_len *fh;
xlog(D_CALL, "MNT3(%s) called", *path);
- fh = get_rootfh(rqstp, path, &res->fhs_status, 1);
+ fh = get_rootfh(rqstp, path, &exp, &res->fhs_status, 1);
if (!fh)
return 1;
ok->fhandle.fhandle3_len = fh->fh_size;
ok->fhandle.fhandle3_val = (char *)fh->fh_handle;
- ok->auth_flavors.auth_flavors_len = sizeof(flavors)/sizeof(flavors[0]);
- ok->auth_flavors.auth_flavors_val = flavors;
+ set_authflavors(ok, exp);
return 1;
}
static struct nfs_fh_len *
-get_rootfh(struct svc_req *rqstp, dirpath *path, mountstat3 *error, int v3)
+get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret,
+ mountstat3 *error, int v3)
{
struct sockaddr_in *sin =
(struct sockaddr_in *) svc_getcaller(rqstp->rq_xprt);
@@ -467,6 +486,8 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, mountstat3 *error, int v3)
}
*error = NFS_OK;
mountlist_add(inet_ntoa(sin->sin_addr), p);
+ if (expret)
+ *expret = exp;
return fh;
}

View File

@ -1,184 +0,0 @@
commit 124b74413e943ab9c02cdff2832d1d81dc9fda87
Author: J. Bruce Fields <bfields@citi.umich.edu>
Date: Thu Aug 28 11:17:34 2008 -0400
Remove redundant m_path field
Contrary to the comment above its definition, the field m_path always
has the same value as e_path: the *only* modifications of m_path are all
of the form:
strncpy(exp->m_export.m_path, exp->m_export.e_path,
sizeof (exp->m_export.m_path) - 1);
exp->m_export.m_path[sizeof (exp->m_export.m_path) - 1] = '\0';
So m_path is always just a copy of e_path. In places where we need to
store a path to a submount of a CROSSMNT-exported filesystem, as in
cache.c, we just use a local variable.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/support/export/export.c b/support/export/export.c
index 93c58b6..14af112 100644
--- a/support/export/export.c
+++ b/support/export/export.c
@@ -255,15 +255,3 @@ export_freeall(void)
}
client_freeall();
}
-
-void
-export_reset(nfs_export *exp)
-{
- if (!exp)
- return;
-
- /* Restore m_path. */
- strncpy(exp->m_export.m_path, exp->m_export.e_path,
- sizeof (exp->m_export.m_path) - 1);
- exp->m_export.m_path[sizeof (exp->m_export.m_path) - 1] = '\0';
-}
diff --git a/support/export/nfsctl.c b/support/export/nfsctl.c
index 32d92bd..e2877b9 100644
--- a/support/export/nfsctl.c
+++ b/support/export/nfsctl.c
@@ -89,11 +89,11 @@ expsetup(struct nfsctl_export *exparg, nfs_export *exp, int unexport)
nfs_client *clp = exp->m_client;
struct stat stb;
- if (stat(exp->m_export.m_path, &stb) < 0)
+ if (stat(exp->m_export.e_path, &stb) < 0)
return 0;
memset(exparg, 0, sizeof(*exparg));
- strncpy(exparg->ex_path, exp->m_export.m_path,
+ strncpy(exparg->ex_path, exp->m_export.e_path,
sizeof (exparg->ex_path) - 1);
strncpy(exparg->ex_client, clp->m_hostname,
sizeof (exparg->ex_client) - 1);
diff --git a/support/include/nfslib.h b/support/include/nfslib.h
index 422b012..a51d79d 100644
--- a/support/include/nfslib.h
+++ b/support/include/nfslib.h
@@ -67,11 +67,6 @@ struct sec_entry {
struct exportent {
char * e_hostname;
char e_path[NFS_MAXPATHLEN+1];
- /* The mount path may be different from the exported path due
- to submount. It may change for every mount. The idea is we
- set m_path every time when we process a mount. We should not
- use it for anything else. */
- char m_path[NFS_MAXPATHLEN+1];
int e_flags;
int e_anonuid;
int e_anongid;
diff --git a/support/nfs/exports.c b/support/nfs/exports.c
index 334c08e..1aaebf4 100644
--- a/support/nfs/exports.c
+++ b/support/nfs/exports.c
@@ -127,8 +127,6 @@ getexportent(int fromkernel, int fromexports)
if (ok <= 0)
return NULL;
- strncpy (def_ee.m_path, def_ee.e_path, sizeof (def_ee.m_path) - 1);
- def_ee.m_path [sizeof (def_ee.m_path) - 1] = '\0';
ok = getexport(exp, sizeof(exp));
}
if (ok < 0) {
@@ -187,8 +185,6 @@ getexportent(int fromkernel, int fromexports)
rpath[sizeof (rpath) - 1] = '\0';
strncpy(ee.e_path, rpath, sizeof (ee.e_path) - 1);
ee.e_path[sizeof (ee.e_path) - 1] = '\0';
- strncpy (ee.m_path, ee.e_path, sizeof (ee.m_path) - 1);
- ee.m_path [sizeof (ee.m_path) - 1] = '\0';
}
return &ee;
@@ -360,8 +356,6 @@ mkexportent(char *hname, char *path, char *options)
}
strncpy(ee.e_path, path, sizeof (ee.e_path));
ee.e_path[sizeof (ee.e_path) - 1] = '\0';
- strncpy (ee.m_path, ee.e_path, sizeof (ee.m_path) - 1);
- ee.m_path [sizeof (ee.m_path) - 1] = '\0';
if (parseopts(options, &ee, 0, NULL) < 0)
return NULL;
return &ee;
diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c
index 8137f7f..0facf89 100644
--- a/utils/mountd/mountd.c
+++ b/utils/mountd/mountd.c
@@ -230,9 +230,6 @@ mount_umnt_1_svc(struct svc_req *rqstp, dirpath *argp, void *resp)
return 1;
}
- if (!new_cache)
- export_reset (exp);
-
mountlist_del(inet_ntoa(sin->sin_addr), p);
return 1;
}
@@ -312,7 +309,6 @@ mount_pathconf_2_svc(struct svc_req *rqstp, dirpath *path, ppathcnf *res)
} else if (stat(p, &stb) < 0) {
xlog(L_WARNING, "can't stat exported dir %s: %s",
p, strerror(errno));
- export_reset (exp);
return 1;
}
@@ -328,8 +324,6 @@ mount_pathconf_2_svc(struct svc_req *rqstp, dirpath *path, ppathcnf *res)
res->pc_mask[0] = 0;
res->pc_mask[1] = 0;
- export_reset (exp);
-
return 1;
}
@@ -457,13 +451,11 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, mountstat3 *error, int v3)
if (fh != NULL) {
mountlist_add(inet_ntoa(sin->sin_addr), p);
*error = NFS_OK;
- export_reset (exp);
return fh;
}
xlog(L_WARNING, "getfh failed: %s", strerror(errno));
*error = NFSERR_ACCES;
}
- export_reset (exp);
return NULL;
}
@@ -499,14 +491,14 @@ get_exportlist(void)
for (i = 0; i < MCL_MAXTYPES; i++) {
for (exp = exportlist[i]; exp; exp = exp->m_next) {
for (e = elist; e != NULL; e = e->ex_next) {
- if (!strcmp(exp->m_export.m_path, e->ex_dir))
+ if (!strcmp(exp->m_export.e_path, e->ex_dir))
break;
}
if (!e) {
e = (struct exportnode *) xmalloc(sizeof(*e));
e->ex_next = elist;
e->ex_groups = NULL;
- e->ex_dir = xstrdup(exp->m_export.m_path);
+ e->ex_dir = xstrdup(exp->m_export.e_path);
elist = e;
}
diff --git a/utils/mountd/rmtab.c b/utils/mountd/rmtab.c
index e8aff5a..5787ed6 100644
--- a/utils/mountd/rmtab.c
+++ b/utils/mountd/rmtab.c
@@ -162,10 +162,8 @@ mountlist_del_all(struct sockaddr_in *sin)
}
while ((rep = getrmtabent(1, NULL)) != NULL) {
if (strcmp(rep->r_client, hp->h_name) == 0 &&
- (exp = auth_authenticate("umountall", sin, rep->r_path))) {
- export_reset(exp);
+ (exp = auth_authenticate("umountall", sin, rep->r_path)))
continue;
- }
fputrmtabent(fp, rep, NULL);
}
if (slink_safe_rename(_PATH_RMTABTMP, _PATH_RMTAB) < 0) {

View File

@ -1,44 +0,0 @@
commit 0ae97c5b87a56870e74a74ae50aeb2ae0e496907
Author: David Woodhouse <David.Woodhouse@intel.com>
Date: Thu Aug 28 10:29:54 2008 -0400
Fix handling of explicit uuid
Fix a couple of bugs which show up if you try to explicitly set a
16-byte UUID when exporting a file system. First, exportfs cuts the
first two bytes off the UUID and writes something invalid to etab.
Second, mountd writes the _ascii_ form of the UUID to the kernel,
instead of converting it to hex.
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/support/nfs/exports.c b/support/nfs/exports.c
index 525e5b1..334c08e 100644
--- a/support/nfs/exports.c
+++ b/support/nfs/exports.c
@@ -595,7 +595,7 @@ bad_option:
if (opt[5]!='\0' && *oe == '\0')
ep->e_flags |= NFSEXP_FSID;
else if (valid_uuid(opt+5))
- ep->e_uuid = strdup(opt+7);
+ ep->e_uuid = strdup(opt+5);
else {
xlog(L_ERROR, "%s: %d: bad fsid \"%s\"\n",
flname, flline, opt);
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index 609c6e3..2ebdd45 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -592,8 +592,10 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
qword_printhex(f, u, 16);
}
} else {
+ char u[16];
+ get_uuid(NULL, exp->e_uuid, 16, u);
qword_print(f, "uuid");
- qword_printhex(f, exp->e_uuid, 16);
+ qword_printhex(f, u, 16);
}
#endif
}

View File

@ -1,149 +0,0 @@
commit 8d52fc2691783dc9ef5bd9d9a1fa4c0ec33b20bc
Author: David Woodhouse <David.Woodhouse@intel.com>
Date: Thu Aug 28 10:56:57 2008 -0400
Explicit UUID handling doesn't require blkid; factor out get_uuid_blkdev()
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index 2ebdd45..23e2344 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -14,6 +14,7 @@
#include <sys/types.h>
#include <sys/select.h>
#include <sys/stat.h>
+#include <sys/vfs.h>
#include <time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
@@ -167,6 +168,41 @@ void auth_unix_gid(FILE *f)
}
#if USE_BLKID
+static const char *get_uuid_blkdev(char *path)
+{
+ static blkid_cache cache = NULL;
+ struct stat stb;
+ char *devname;
+ blkid_tag_iterate iter;
+ blkid_dev dev;
+ const char *type;
+ const char *val = NULL;
+
+ if (cache == NULL)
+ blkid_get_cache(&cache, NULL);
+
+ if (stat(path, &stb) != 0)
+ return NULL;
+ devname = blkid_devno_to_devname(stb.st_dev);
+ if (!devname)
+ return NULL;
+ dev = blkid_get_dev(cache, devname, BLKID_DEV_NORMAL);
+ free(devname);
+ if (!dev)
+ return NULL;
+ iter = blkid_tag_iterate_begin(dev);
+ if (!iter)
+ return NULL;
+ while (blkid_tag_next(iter, &type, &val) == 0)
+ if (strcmp(type, "UUID") == 0)
+ break;
+ blkid_tag_iterate_end(iter);
+ return val;
+}
+#else
+#define get_uuid_blkdev(path) (NULL)
+#endif
+
int get_uuid(char *path, char *uuid, int uuidlen, char *u)
{
/* extract hex digits from uuidstr and compose a uuid
@@ -174,35 +210,12 @@ int get_uuid(char *path, char *uuid, int uuidlen, char *u)
* a smaller uuid. Then compare with uuid
*/
int i = 0;
- const char *val;
+ const char *val = NULL;
+ char fsid_val[17];
if (path) {
- static blkid_cache cache = NULL;
- struct stat stb;
- char *devname;
- blkid_tag_iterate iter;
- blkid_dev dev;
- const char *type;
- if (cache == NULL)
- blkid_get_cache(&cache, NULL);
-
- if (stat(path, &stb) != 0)
- return 0;
- devname = blkid_devno_to_devname(stb.st_dev);
- if (!devname)
- return 0;
- dev = blkid_get_dev(cache, devname, BLKID_DEV_NORMAL);
- free(devname);
- if (!dev)
- return 0;
- iter = blkid_tag_iterate_begin(dev);
- if (!iter)
- return 0;
- while (blkid_tag_next(iter, &type, &val) == 0)
- if (strcmp(type, "UUID") == 0)
- break;
- blkid_tag_iterate_end(iter);
- if (!type)
+ val = get_uuid_blkdev(path);
+ if (!val)
return 0;
} else {
val = uuid;
@@ -229,7 +242,6 @@ int get_uuid(char *path, char *uuid, int uuidlen, char *u)
}
return 1;
}
-#endif
/* Iterate through /etc/mtab, finding mountpoints
* at or below a given path
@@ -439,20 +451,15 @@ void nfsd_fh(FILE *f)
if (!is_mountpoint(path))
continue;
check_uuid:
-#if USE_BLKID
if (exp->m_export.e_uuid)
get_uuid(NULL, exp->m_export.e_uuid,
uuidlen, u);
- else if (get_uuid(path, NULL,
- uuidlen, u) == 0)
+ else if (get_uuid(path, NULL, uuidlen, u) == 0)
continue;
if (memcmp(u, fhuuid, uuidlen) != 0)
continue;
break;
-#else
- continue;
-#endif
}
if (use_ipaddr) {
if (he == NULL) {
@@ -584,7 +591,6 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
qword_printint(f, exp->e_fsid);
write_fsloc(f, exp, path);
write_secinfo(f, exp);
-#if USE_BLKID
if (exp->e_uuid == NULL || different_fs) {
char u[16];
if (get_uuid(path, NULL, 16, u)) {
@@ -597,7 +603,6 @@ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *ex
qword_print(f, "uuid");
qword_printhex(f, u, 16);
}
-#endif
}
return qword_eol(f);
}

View File

@ -1,33 +0,0 @@
commit 3a340251597a5b0c579c31d8caf9aa3b53a77016
Author: David Woodhouse <David.Woodhouse@intel.com>
Date: Thu Aug 28 11:05:17 2008 -0400
Use fsid from statfs for UUID if blkid can't cope (or not used)
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
index 23e2344..fa15472 100644
--- a/utils/mountd/cache.c
+++ b/utils/mountd/cache.c
@@ -215,8 +215,17 @@ int get_uuid(char *path, char *uuid, int uuidlen, char *u)
if (path) {
val = get_uuid_blkdev(path);
- if (!val)
- return 0;
+ if (!val) {
+ struct statfs64 st;
+
+ if (statfs64(path, &st))
+ return 0;
+ if (!st.f_fsid.__val[0] && !st.f_fsid.__val[1])
+ return 0;
+ snprintf(fsid_val, 17, "%08x%08x",
+ st.f_fsid.__val[0], st.f_fsid.__val[1]);
+ val = fsid_val;
+ }
} else {
val = uuid;
}

View File

@ -1,45 +0,0 @@
commit 92e4d5c342f15940362fc2b2df19df0893f0dd13
Author: Neil Brown <neilb@suse.de>
Date: Thu Aug 28 11:32:33 2008 -0400
mount: enable retry for nfs23 to set the correct protocol for mount.
Use a connected port when talking to portmap via UDP.
This allows us to get ICMP errors reported back so we can avoid
timeouts. Also catch the error (RPC_CANTRECV) properly in getport.
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Steve Dickson <steved@redhat.com>
diff --git a/utils/mount/network.c b/utils/mount/network.c
index 0023769..2db694d 100644
--- a/utils/mount/network.c
+++ b/utils/mount/network.c
@@ -465,7 +465,7 @@ static unsigned short getport(struct sockaddr_in *saddr,
bind_saddr = *saddr;
bind_saddr.sin_port = htons(PMAPPORT);
- socket = get_socket(&bind_saddr, proto, PMAP_TIMEOUT, FALSE, FALSE);
+ socket = get_socket(&bind_saddr, proto, PMAP_TIMEOUT, FALSE, TRUE);
if (socket == RPC_ANYSOCK) {
if (proto == IPPROTO_TCP &&
rpc_createerr.cf_error.re_errno == ETIMEDOUT)
@@ -554,6 +554,7 @@ static int probe_port(clnt_addr_t *server, const unsigned long *versions,
}
if (rpc_createerr.cf_stat != RPC_PROGNOTREGISTERED &&
rpc_createerr.cf_stat != RPC_TIMEDOUT &&
+ rpc_createerr.cf_stat != RPC_CANTRECV &&
rpc_createerr.cf_stat != RPC_PROGVERSMISMATCH)
goto out_bad;
@@ -562,7 +563,8 @@ static int probe_port(clnt_addr_t *server, const unsigned long *versions,
continue;
p_prot = protos;
}
- if (rpc_createerr.cf_stat == RPC_TIMEDOUT)
+ if (rpc_createerr.cf_stat == RPC_TIMEDOUT ||
+ rpc_createerr.cf_stat == RPC_CANTRECV)
goto out_bad;
if (vers || !*++p_vers)

View File

@ -1,50 +0,0 @@
commit c8d18e26d2a53d9036a32c2dafebccaf4ce1634d
Author: Phil Endecott <phil_bnaqb_endecott@chezphil.org>
Date: Tue Oct 14 14:36:58 2008 -0400
sm-notify should exit as soon as its determined
there are no hosts to notify. This also decreases
start up time by a few seconds.
Signed-off-by: Steve Dickson <steved@redhat.com>
diff -up nfs-utils-1.1.3/utils/statd/sm-notify.c.orig nfs-utils-1.1.3/utils/statd/sm-notify.c
--- nfs-utils-1.1.3/utils/statd/sm-notify.c.orig 2008-10-14 14:51:49.000000000 -0400
+++ nfs-utils-1.1.3/utils/statd/sm-notify.c 2008-10-14 14:52:58.000000000 -0400
@@ -154,9 +154,13 @@ usage: fprintf(stderr,
return 1;
}
+ log_syslog = 1;
+ openlog("sm-notify", LOG_PID, LOG_DAEMON);
+
if (strcmp(_SM_BASE_PATH, BASEDIR) == 0) {
if (record_pid() == 0 && force == 0 && opt_update_state == 1)
/* already run, don't try again */
+ nsm_log(LOG_NOTICE, "Already notifying clients; Exiting!");
exit(0);
}
@@ -171,6 +175,12 @@ usage: fprintf(stderr,
backup_hosts(_SM_DIR_PATH, _SM_BAK_PATH);
get_hosts(_SM_BAK_PATH);
+ /* If there are not hosts to notify, just exit */
+ if (!hosts) {
+ nsm_log(LOG_DEBUG, "No hosts to notify; exiting");
+ return 0;
+ }
+
/* Get and update the NSM state. This will call sync() */
nsm_state = nsm_get_state(opt_update_state);
set_kernel_nsm_state(nsm_state);
@@ -179,9 +189,6 @@ usage: fprintf(stderr,
if (!opt_quiet)
printf("Backgrounding to notify hosts...\n");
- openlog("sm-notify", LOG_PID, LOG_DAEMON);
- log_syslog = 1;
-
if (daemon(0, 0) < 0) {
nsm_log(LOG_WARNING, "unable to background: %s",
strerror(errno));

View File

@ -1,8 +1,8 @@
Summary: NFS utilities and supporting clients and daemons for the kernel NFS server
Name: nfs-utils
URL: http://sourceforge.net/projects/nfs
Version: 1.1.3
Release: 6%{?dist}
Version: 1.1.4
Release: 1%{?dist}
Epoch: 1
# group all 32bit related archs
@ -30,19 +30,6 @@ Patch02: nfs-utils-1.1.0-exp-subtree-warn-off.patch
Patch90: nfs-utils-1.1.0-mount-fsc.patch
%endif
Patch100: nfs-utils-1.1.3-glibc22.patch
Patch101: nfs-utils-1.1.3-mountd-gids.patch
Patch102: nfs-utils-1.1.3-mountd-uuid-explicit.patch
Patch103: nfs-utils-1.1.3-mountd-uuid-noblkid.patch
Patch104: nfs-utils-1.1.3-mountd-uuid-stat.patch
Patch105: nfs-utils-1.1.3-exportfs-uuid-nowarn.patch
Patch106: nfs-utils-1.1.3-mountd-rm-m_path.patch
Patch107: nfs-utils-1.1.3-mountd-cleanup.patch
Patch108: nfs-utils-1.1.3-mountd-pseudoflavor-support.patch
Patch109: nfs-utils-1.1.3-idmapd-rm-idmapconf.patch
Patch110: nfs-utils-1.1.3-network-conn-udp-ports.patch
Patch111: nfs-utils-1.1.3-smnotify-earlyexit.patch
Group: System Environment/Daemons
Provides: exportfs = %{epoch}:%{version}-%{release}
Provides: nfsstat = %{epoch}:%{version}-%{release}
@ -96,19 +83,6 @@ This package also contains the mount.nfs and umount.nfs program.
%patch90 -p1
%endif
%patch100 -p1
%patch101 -p1
%patch102 -p1
%patch103 -p1
%patch104 -p1
%patch105 -p1
%patch106 -p1
%patch107 -p1
%patch108 -p1
%patch109 -p1
%patch110 -p1
%patch111 -p1
# Remove .orig files
find . -name "*.orig" | xargs rm -f
@ -267,6 +241,9 @@ fi
%attr(4755,root,root) /sbin/umount.nfs4
%changelog
* Sat Oct 18 2008 Steve Dickson <steved@redhat.com> 1.1.4-1
- Updated to latest upstream version: 1.1.4
* Tue Oct 14 2008 Steve Dickson <steved@redhat.com> 1.1.3-6
- sm-notify exists when there are no hosts to notify

View File

@ -1,2 +1,2 @@
ae7db9c61c5ad04f83bb99e5caed73da nfs.doc.tar.gz
3ce0faed9e85e78c3017066530050a41 nfs-utils-1.1.3.tar.bz2
3ed5b9cb73fd1c9b358c7bfa7a6ae150 nfs-utils-1.1.4.tar.bz2