- Updated to the latest pseudo root release (rel7).
- Added upstream 1.2.1-rc7 patch which fixes: - Stop ignoring the -o v4 option (bz 529407) - Allow network protocol roll backs when proto is set in the config file (bz 529864)
This commit is contained in:
parent
cb3fa4ca36
commit
8152f820a8
@ -1,70 +0,0 @@
|
||||
diff -up nfs-utils-1.2.0/utils/mount/configfile.c.orig nfs-utils-1.2.0/utils/mount/configfile.c
|
||||
--- nfs-utils-1.2.0/utils/mount/configfile.c.orig 2009-09-30 13:57:48.647286000 -0400
|
||||
+++ nfs-utils-1.2.0/utils/mount/configfile.c 2009-09-30 14:50:05.365468000 -0400
|
||||
@@ -198,6 +198,15 @@ int inline check_vers(char *mopt, char *
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+int inline vers_is_set(char *mopt)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ for (i=0; versions[i]; i++)
|
||||
+ if (strncasecmp(mopt, versions[i], strlen(versions[i])) == 0)
|
||||
+ return 1;
|
||||
+ return 0;
|
||||
+}
|
||||
/*
|
||||
* Parse the given section of the configuration
|
||||
* file to if there are any mount options set.
|
||||
@@ -256,6 +265,8 @@ conf_parse_mntopts(char *section, char *
|
||||
conf_free_list(list);
|
||||
}
|
||||
|
||||
+int do_version_negation;
|
||||
+
|
||||
/*
|
||||
* Concatenate options from the configuration file with the
|
||||
* given options by building a link list of options from the
|
||||
@@ -326,6 +337,8 @@ char *conf_get_mntopts(char *spec, char
|
||||
strcat(config_opts, ",");
|
||||
}
|
||||
SLIST_FOREACH(entry, &head, entries) {
|
||||
+ if (vers_is_set(entry->opt))
|
||||
+ do_version_negation = 1;
|
||||
strcat(config_opts, entry->opt);
|
||||
strcat(config_opts, ",");
|
||||
}
|
||||
diff -up nfs-utils-1.2.0/utils/mount/stropts.c.orig nfs-utils-1.2.0/utils/mount/stropts.c
|
||||
--- nfs-utils-1.2.0/utils/mount/stropts.c.orig 2009-09-30 13:57:48.613288000 -0400
|
||||
+++ nfs-utils-1.2.0/utils/mount/stropts.c 2009-09-30 14:59:56.716461000 -0400
|
||||
@@ -588,6 +588,7 @@ out_fail:
|
||||
po_destroy(options);
|
||||
return result;
|
||||
}
|
||||
+extern int do_version_negation;
|
||||
|
||||
/*
|
||||
* This is a single pass through the fg/bg loop.
|
||||
@@ -607,12 +608,20 @@ static int nfs_try_mount(struct nfsmount
|
||||
if (errno != EPROTONOSUPPORT)
|
||||
break;
|
||||
}
|
||||
- case 2:
|
||||
case 3:
|
||||
+ if (do_version_negation)
|
||||
+ po_remove_all(mi->options, "nfsvers");
|
||||
+ case 2:
|
||||
result = nfs_try_mount_v3v2(mi);
|
||||
break;
|
||||
case 4:
|
||||
result = nfs_try_mount_v4(mi);
|
||||
+ if (do_version_negation && !result) {
|
||||
+ if (errno == EPROTONOSUPPORT) {
|
||||
+ po_remove_all(mi->options, "nfsvers");
|
||||
+ result = nfs_try_mount_v3v2(mi);
|
||||
+ }
|
||||
+ }
|
||||
break;
|
||||
default:
|
||||
errno = EIO;
|
@ -1,37 +0,0 @@
|
||||
diff -up nfs-utils-1.2.0/utils/mount/configfile.c.orig nfs-utils-1.2.0/utils/mount/configfile.c
|
||||
--- nfs-utils-1.2.0/utils/mount/configfile.c.orig 2009-10-02 11:10:01.000000000 -0400
|
||||
+++ nfs-utils-1.2.0/utils/mount/configfile.c 2009-10-02 11:14:30.000000000 -0400
|
||||
@@ -185,6 +185,20 @@ void free_all(void)
|
||||
free(entry);
|
||||
}
|
||||
}
|
||||
+static char *versions[] = {"v2", "v3", "v4", "vers", "nfsvers", NULL};
|
||||
+int inline check_vers(char *mopt, char *field)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ if (strncmp("mountvers", field, strlen("mountvers") != 0 &&
|
||||
+ (strcasecmp(field, "nfsvers") == 0 ||
|
||||
+ strcasecmp(field, "vers") == 0))) {
|
||||
+ for (i=0; versions[i]; i++)
|
||||
+ if (strcasestr(mopt, versions[i]) != NULL)
|
||||
+ return 1;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
/*
|
||||
* Parse the given section of the configuration
|
||||
* file to if there are any mount options set.
|
||||
@@ -207,6 +221,12 @@ conf_parse_mntopts(char *section, char *
|
||||
snprintf(buf, BUFSIZ, "%s=", node->field);
|
||||
if (opts && strcasestr(opts, buf) != NULL)
|
||||
continue;
|
||||
+ /*
|
||||
+ * Protocol verions can be set in a number of ways
|
||||
+ */
|
||||
+ if (opts && check_vers(opts, node->field))
|
||||
+ continue;
|
||||
+
|
||||
if (lookup_entry(node->field) != NULL)
|
||||
continue;
|
||||
buf[0] = '\0';
|
@ -1,31 +0,0 @@
|
||||
diff -up nfs-utils-1.2.0/utils/mount/nfsmount.conf.orig nfs-utils-1.2.0/utils/mount/nfsmount.conf
|
||||
--- nfs-utils-1.2.0/utils/mount/nfsmount.conf.orig 2009-09-30 11:32:14.148326000 -0400
|
||||
+++ nfs-utils-1.2.0/utils/mount/nfsmount.conf 2009-09-30 11:35:24.714787000 -0400
|
||||
@@ -24,12 +24,12 @@
|
||||
# All reads and writes to the 'nfsserver.foo.com' server
|
||||
# will be done with 32k (32768 bytes) block sizes.
|
||||
#
|
||||
-#[ NFSMount_Global_Options ]
|
||||
+[ NFSMount_Global_Options ]
|
||||
# This statically named section defines global mount
|
||||
# options that can be applied on all NFS mount.
|
||||
#
|
||||
-# Protocol Version [2,3]
|
||||
-# Nfsvers=3
|
||||
+# Protocol Version [2,3,4]
|
||||
+Nfsvers=3
|
||||
# Network Transport [Udp,Tcp,Rdma]
|
||||
# Proto=Tcp
|
||||
#
|
||||
diff -up nfs-utils-1.2.0/utils/mount/stropts.c.orig nfs-utils-1.2.0/utils/mount/stropts.c
|
||||
--- nfs-utils-1.2.0/utils/mount/stropts.c.orig 2009-09-30 11:32:14.214327000 -0400
|
||||
+++ nfs-utils-1.2.0/utils/mount/stropts.c 2009-09-30 11:34:35.841020000 -0400
|
||||
@@ -601,7 +601,7 @@ static int nfs_try_mount(struct nfsmount
|
||||
|
||||
switch (mi->version) {
|
||||
case 0:
|
||||
- if (linux_version_code() > MAKE_VERSION(2, 6, 31)) {
|
||||
+ if (linux_version_code() >= MAKE_VERSION(2, 6, 31)) {
|
||||
errno = 0;
|
||||
result = nfs_try_mount_v4(mi);
|
||||
if (errno != EPROTONOSUPPORT)
|
@ -1,7 +1,6 @@
|
||||
diff --git a/support/export/xtab.c b/support/export/xtab.c
|
||||
index 3b1dcce..2a43193 100644
|
||||
--- a/support/export/xtab.c
|
||||
+++ b/support/export/xtab.c
|
||||
diff -up nfs-utils-1.2.0/support/export/xtab.c.save nfs-utils-1.2.0/support/export/xtab.c
|
||||
--- nfs-utils-1.2.0/support/export/xtab.c.save 2009-10-20 08:46:50.000000000 -0400
|
||||
+++ nfs-utils-1.2.0/support/export/xtab.c 2009-10-20 08:47:26.000000000 -0400
|
||||
@@ -19,7 +19,9 @@
|
||||
#include "exportfs.h"
|
||||
#include "xio.h"
|
||||
@ -12,7 +11,7 @@ index 3b1dcce..2a43193 100644
|
||||
static void cond_rename(char *newfile, char *oldfile);
|
||||
|
||||
static int
|
||||
@@ -36,6 +38,8 @@ xtab_read(char *xtab, char *lockfn, int is_export)
|
||||
@@ -36,6 +38,8 @@ xtab_read(char *xtab, char *lockfn, int
|
||||
if ((lockid = xflock(lockfn, "r")) < 0)
|
||||
return 0;
|
||||
setexportent(xtab, "r");
|
||||
@ -21,7 +20,7 @@ index 3b1dcce..2a43193 100644
|
||||
while ((xp = getexportent(is_export==0, 0)) != NULL) {
|
||||
if (!(exp = export_lookup(xp->e_hostname, xp->e_path, is_export != 1)) &&
|
||||
!(exp = export_create(xp, is_export!=1))) {
|
||||
@@ -48,6 +52,8 @@ xtab_read(char *xtab, char *lockfn, int is_export)
|
||||
@@ -48,6 +52,8 @@ xtab_read(char *xtab, char *lockfn, int
|
||||
case 1:
|
||||
exp->m_xtabent = 1;
|
||||
exp->m_mayexport = 1;
|
||||
@ -30,10 +29,9 @@ index 3b1dcce..2a43193 100644
|
||||
break;
|
||||
case 2:
|
||||
exp->m_exported = -1;/* may be exported */
|
||||
diff --git a/support/include/exportfs.h b/support/include/exportfs.h
|
||||
index a5cf482..1ad41e2 100644
|
||||
--- a/support/include/exportfs.h
|
||||
+++ b/support/include/exportfs.h
|
||||
diff -up nfs-utils-1.2.0/support/include/exportfs.h.save nfs-utils-1.2.0/support/include/exportfs.h
|
||||
--- nfs-utils-1.2.0/support/include/exportfs.h.save 2009-10-20 08:46:50.000000000 -0400
|
||||
+++ nfs-utils-1.2.0/support/include/exportfs.h 2009-10-20 08:47:07.000000000 -0400
|
||||
@@ -12,6 +12,17 @@
|
||||
#include <netdb.h>
|
||||
#include "nfslib.h"
|
||||
@ -52,10 +50,9 @@ index a5cf482..1ad41e2 100644
|
||||
enum {
|
||||
MCL_FQDN = 0,
|
||||
MCL_SUBNETWORK,
|
||||
diff --git a/support/include/nfs/export.h b/support/include/nfs/export.h
|
||||
index f7a99ba..76953ac 100644
|
||||
--- a/support/include/nfs/export.h
|
||||
+++ b/support/include/nfs/export.h
|
||||
diff -up nfs-utils-1.2.0/support/include/nfs/export.h.save nfs-utils-1.2.0/support/include/nfs/export.h
|
||||
--- nfs-utils-1.2.0/support/include/nfs/export.h.save 2009-10-20 08:46:50.000000000 -0400
|
||||
+++ nfs-utils-1.2.0/support/include/nfs/export.h 2009-10-20 08:47:07.000000000 -0400
|
||||
@@ -24,6 +24,7 @@
|
||||
#define NFSEXP_FSID 0x2000
|
||||
#define NFSEXP_CROSSMOUNT 0x4000
|
||||
@ -65,10 +62,9 @@ index f7a99ba..76953ac 100644
|
||||
+#define NFSEXP_ALLFLAGS 0x1FFFF
|
||||
|
||||
#endif /* _NSF_EXPORT_H */
|
||||
diff --git a/support/include/nfslib.h b/support/include/nfslib.h
|
||||
index 537a31e..e4777dd 100644
|
||||
--- a/support/include/nfslib.h
|
||||
+++ b/support/include/nfslib.h
|
||||
diff -up nfs-utils-1.2.0/support/include/nfslib.h.save nfs-utils-1.2.0/support/include/nfslib.h
|
||||
--- nfs-utils-1.2.0/support/include/nfslib.h.save 2009-10-20 08:46:50.000000000 -0400
|
||||
+++ nfs-utils-1.2.0/support/include/nfslib.h 2009-10-20 08:47:07.000000000 -0400
|
||||
@@ -88,6 +88,7 @@ struct exportent {
|
||||
int e_fslocmethod;
|
||||
char * e_fslocdata;
|
||||
@ -77,11 +73,9 @@ index 537a31e..e4777dd 100644
|
||||
struct sec_entry e_secinfo[SECFLAVOR_COUNT+1];
|
||||
};
|
||||
|
||||
diff --git a/support/include/v4root.h b/support/include/v4root.h
|
||||
new file mode 100644
|
||||
index 0000000..43b1d2e
|
||||
--- /dev/null
|
||||
+++ b/support/include/v4root.h
|
||||
diff -up /dev/null nfs-utils-1.2.0/support/include/v4root.h
|
||||
--- /dev/null 2009-10-15 16:13:05.251004788 -0400
|
||||
+++ nfs-utils-1.2.0/support/include/v4root.h 2009-10-20 08:47:16.000000000 -0400
|
||||
@@ -0,0 +1,20 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2009 Red Hat <nfs@redhat.com>
|
||||
@ -98,28 +92,14 @@ index 0000000..43b1d2e
|
||||
+
|
||||
+extern struct exportent *v4root_chkroot(int , unsigned int , char *);
|
||||
+extern struct exportent *v4root_export(char *, int);
|
||||
+extern struct exportent *v4root_create(char *, nfs_export *, int);
|
||||
+extern struct exportent *v4root_lookup(char *, nfs_export *);
|
||||
+extern void v4root_free(struct exportent *);
|
||||
+extern void v4root_unset(void), v4root_set(void);
|
||||
+
|
||||
+#endif /* V4ROOT_H */
|
||||
diff --git a/utils/mountd/Makefile.am b/utils/mountd/Makefile.am
|
||||
index 1e76cf8..eba81fc 100644
|
||||
--- a/utils/mountd/Makefile.am
|
||||
+++ b/utils/mountd/Makefile.am
|
||||
@@ -8,7 +8,7 @@ KPREFIX = @kprefix@
|
||||
sbin_PROGRAMS = mountd
|
||||
|
||||
mountd_SOURCES = mountd.c mount_dispatch.c auth.c rmtab.c cache.c \
|
||||
- svc_run.c fsloc.c mountd.h
|
||||
+ svc_run.c fsloc.c v4root.c mountd.h
|
||||
mountd_LDADD = ../../support/export/libexport.a \
|
||||
../../support/nfs/libnfs.a \
|
||||
../../support/misc/libmisc.a \
|
||||
diff --git a/utils/mountd/auth.c b/utils/mountd/auth.c
|
||||
index 575f207..041a745 100644
|
||||
--- a/utils/mountd/auth.c
|
||||
+++ b/utils/mountd/auth.c
|
||||
diff -up nfs-utils-1.2.0/utils/mountd/auth.c.save nfs-utils-1.2.0/utils/mountd/auth.c
|
||||
--- nfs-utils-1.2.0/utils/mountd/auth.c.save 2009-10-20 08:46:50.000000000 -0400
|
||||
+++ nfs-utils-1.2.0/utils/mountd/auth.c 2009-10-20 08:47:26.000000000 -0400
|
||||
@@ -20,6 +20,7 @@
|
||||
#include "exportfs.h"
|
||||
#include "mountd.h"
|
||||
@ -142,10 +122,9 @@ index 575f207..041a745 100644
|
||||
++counter;
|
||||
|
||||
return counter;
|
||||
diff --git a/utils/mountd/cache.c b/utils/mountd/cache.c
|
||||
index e4e2f22..d631570 100644
|
||||
--- a/utils/mountd/cache.c
|
||||
+++ b/utils/mountd/cache.c
|
||||
diff -up nfs-utils-1.2.0/utils/mountd/cache.c.save nfs-utils-1.2.0/utils/mountd/cache.c
|
||||
--- nfs-utils-1.2.0/utils/mountd/cache.c.save 2009-10-20 08:46:50.000000000 -0400
|
||||
+++ nfs-utils-1.2.0/utils/mountd/cache.c 2009-10-20 08:47:21.000000000 -0400
|
||||
@@ -32,23 +32,12 @@
|
||||
#include "xmalloc.h"
|
||||
#include "fsloc.h"
|
||||
@ -233,14 +212,14 @@ index e4e2f22..d631570 100644
|
||||
+ else {
|
||||
+ /* See if the path is part of the psuedo root */
|
||||
+ if (v4root_needed && !v4root)
|
||||
+ v4root = v4root_create(path, exp, TRUE);
|
||||
+ v4root = v4root_lookup(path, exp);
|
||||
continue;
|
||||
- } else if (strcmp(path, exp->m_export.e_path) != 0)
|
||||
+ }
|
||||
+ } else if (strcmp(path, exp->m_export.e_path) != 0) {
|
||||
+ /* See if the path is part of the psuedo root */
|
||||
+ if (v4root_needed && !v4root)
|
||||
+ v4root = v4root_create(path, exp, TRUE);
|
||||
+ v4root = v4root_lookup(path, exp);
|
||||
continue;
|
||||
+ }
|
||||
if (use_ipaddr) {
|
||||
@ -277,7 +256,7 @@ index e4e2f22..d631570 100644
|
||||
if (dom) free(dom);
|
||||
if (path) free(path);
|
||||
if (he) free(he);
|
||||
@@ -743,7 +776,9 @@ void cache_open(void)
|
||||
@@ -743,7 +776,9 @@ void cache_open(void)
|
||||
if (!manage_gids && cachelist[i].cache_handle == auth_unix_gid)
|
||||
continue;
|
||||
sprintf(path, "/proc/net/rpc/%s/channel", cachelist[i].cache_name);
|
||||
@ -288,12 +267,22 @@ index e4e2f22..d631570 100644
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/utils/mountd/v4root.c b/utils/mountd/v4root.c
|
||||
new file mode 100644
|
||||
index 0000000..8de2ab6
|
||||
--- /dev/null
|
||||
+++ b/utils/mountd/v4root.c
|
||||
@@ -0,0 +1,420 @@
|
||||
diff -up nfs-utils-1.2.0/utils/mountd/Makefile.am.save nfs-utils-1.2.0/utils/mountd/Makefile.am
|
||||
--- nfs-utils-1.2.0/utils/mountd/Makefile.am.save 2009-10-20 08:46:50.000000000 -0400
|
||||
+++ nfs-utils-1.2.0/utils/mountd/Makefile.am 2009-10-20 08:47:16.000000000 -0400
|
||||
@@ -8,7 +8,7 @@ KPREFIX = @kprefix@
|
||||
sbin_PROGRAMS = mountd
|
||||
|
||||
mountd_SOURCES = mountd.c mount_dispatch.c auth.c rmtab.c cache.c \
|
||||
- svc_run.c fsloc.c mountd.h
|
||||
+ svc_run.c fsloc.c v4root.c mountd.h
|
||||
mountd_LDADD = ../../support/export/libexport.a \
|
||||
../../support/nfs/libnfs.a \
|
||||
../../support/misc/libmisc.a \
|
||||
diff -up /dev/null nfs-utils-1.2.0/utils/mountd/v4root.c
|
||||
--- /dev/null 2009-10-15 16:13:05.251004788 -0400
|
||||
+++ nfs-utils-1.2.0/utils/mountd/v4root.c 2009-10-20 08:47:33.000000000 -0400
|
||||
@@ -0,0 +1,414 @@
|
||||
+/*
|
||||
+ * Copyright (C) 2009 Red Hat <nfs@redhat.com>
|
||||
+ *
|
||||
@ -334,21 +323,22 @@ index 0000000..8de2ab6
|
||||
+
|
||||
+extern int get_uuid(char *path, char *uuid, int uuidlen, char *u);
|
||||
+
|
||||
+typedef struct _exports_t {
|
||||
+ TAILQ_ENTRY(_exports_t) list;
|
||||
+ char *path;
|
||||
+ void *head;
|
||||
+ char uuid_len;
|
||||
+ char uuid[sizeof(uuid_t)];
|
||||
+ struct exportent p_export;
|
||||
+} exports_t;
|
||||
+
|
||||
+#define HASH_TABLE_SIZE 1021
|
||||
+typedef struct _hash_head {
|
||||
+ TAILQ_HEAD(export_list, _exports_t) h_head;
|
||||
+} hash_head;
|
||||
+hash_head exports_tbl[HASH_TABLE_SIZE];
|
||||
+
|
||||
+typedef struct _exports_t {
|
||||
+ TAILQ_ENTRY(_exports_t) list;
|
||||
+ char *path;
|
||||
+ hash_head *head;
|
||||
+ char uuid_len;
|
||||
+ char uuid[sizeof(uuid_t)];
|
||||
+ struct exportent p_export;
|
||||
+} exports_t;
|
||||
+
|
||||
+
|
||||
+
|
||||
+static exports_t *hash_export_lookup(char *, unsigned int);
|
||||
+static void hash_export_add(struct _exports_t *, int);
|
||||
@ -372,6 +362,8 @@ index 0000000..8de2ab6
|
||||
+void v4root_unset(void);
|
||||
+static int v4root_support(void);
|
||||
+
|
||||
+static struct exportent *v4root_create(char *, nfs_export *);
|
||||
+
|
||||
+int v4root_needed;
|
||||
+
|
||||
+static nfs_export pr_export = {
|
||||
@ -467,8 +459,8 @@ index 0000000..8de2ab6
|
||||
+v4root_set()
|
||||
+{
|
||||
+ nfs_export *exp, *nxt;
|
||||
+ int i, slcnt;
|
||||
+ char *e_path, *path, *ptr, *comp;
|
||||
+ int i;
|
||||
+ char *path, *ptr;
|
||||
+ char *hostname;
|
||||
+
|
||||
+ if (!v4root_needed)
|
||||
@ -482,42 +474,22 @@ index 0000000..8de2ab6
|
||||
+ for (i = 0; i < MCL_MAXTYPES; i++) {
|
||||
+ for (exp = exportlist[i].p_head; exp; exp = nxt) {
|
||||
+ nxt = exp->m_next;
|
||||
+ e_path = exp->m_export.e_path;
|
||||
+ hostname = exp->m_export.e_hostname;
|
||||
+
|
||||
+ slcnt = slash_count(e_path);
|
||||
+ if (slcnt == 1)
|
||||
+ continue;
|
||||
+ slcnt--; /* knock off the leanding '/' */
|
||||
+
|
||||
+ path = strdup(e_path);
|
||||
+ if (path == NULL) {
|
||||
+ xlog(L_WARNING, "v4root_set: No memory for pseudo export");
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Run through each component of the path to
|
||||
+ * see if a pseudo export should be created.
|
||||
+ */
|
||||
+ comp = path+1;
|
||||
+ do {
|
||||
+ if ((ptr = strchr(comp, '/')) != NULL)
|
||||
+ *ptr = '\0';
|
||||
+
|
||||
+ if (export_lookup(hostname, path, 0) == NULL)
|
||||
+ if (v4root_create(path, exp, FALSE) == NULL) {
|
||||
+ xlog(L_WARNING,
|
||||
+ "v4root_set: Unable to create pseudo export"
|
||||
+ "for '%s'", path);
|
||||
+ path = strdup(exp->m_export.e_path);
|
||||
+ ptr = path + 1;
|
||||
+ while ((ptr = strchr(ptr, '/')) != NULL) {
|
||||
+ *ptr = '\0';
|
||||
+ if (export_lookup(hostname, path, 0) == NULL)
|
||||
+ if (v4root_create(path, exp) == NULL) {
|
||||
+ xlog(L_WARNING, "v4root_set: Unable to create"
|
||||
+ "pseudo export for '%s'", path);
|
||||
+ break;
|
||||
+ }
|
||||
+ *ptr = '/';
|
||||
+ ptr++;
|
||||
+ }
|
||||
+
|
||||
+ if (ptr) {
|
||||
+ *ptr = '/';
|
||||
+ comp = ptr+1;
|
||||
+ }
|
||||
+ } while (--slcnt > 0);
|
||||
+ free(path);
|
||||
+ }
|
||||
+ }
|
||||
@ -541,53 +513,33 @@ index 0000000..8de2ab6
|
||||
+struct exportent *
|
||||
+v4root_chkroot(int fsidtype, unsigned int fsidnum, char *fhuuid)
|
||||
+{
|
||||
+ struct exportent *p_export = NULL;
|
||||
+
|
||||
+ if (pseudo_root == NULL)
|
||||
+ return NULL;
|
||||
+
|
||||
+ switch(fsidtype) {
|
||||
+ case FSID_NUM:
|
||||
+ if (fsidnum == _PSEUDO_ROOT_FSID) {
|
||||
+ p_export = &pseudo_root->m_export;
|
||||
+ strncpy(p_export->e_path, _PATH_PSEUDO_ROOT,
|
||||
+ NFS_MAXPATHLEN);
|
||||
+ }
|
||||
+ break;
|
||||
+ }
|
||||
+ if (fsidtype != FSID_NUM)
|
||||
+ return NULL;
|
||||
+
|
||||
+ return p_export;
|
||||
+ if (fsidnum != _PSEUDO_ROOT_FSID)
|
||||
+ return NULL;
|
||||
+
|
||||
+ return &pseudo_root->m_export;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Create a pseudo export, if one does not
|
||||
+ * already exist.
|
||||
+ */
|
||||
+struct exportent *
|
||||
+v4root_create(char *path, nfs_export *exp, int docheck)
|
||||
+static struct exportent *
|
||||
+v4root_create(char *path, nfs_export *exp)
|
||||
+{
|
||||
+ static struct exportent *p_export = NULL;
|
||||
+ exports_t *pexp;
|
||||
+ char *epath = exp->m_export.e_path;
|
||||
+ int elen, plen;
|
||||
+ char uuid_len = sizeof(uuid_t);
|
||||
+ char uuid[sizeof(uuid_t)];
|
||||
+
|
||||
+ if (pseudo_root == NULL)
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (docheck) {
|
||||
+
|
||||
+ /* Path needs to be a subset of e_path */
|
||||
+ elen = strlen(epath);
|
||||
+ plen = strlen(path);
|
||||
+ if (plen >= elen)
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (memcmp(path, epath, plen) != 0)
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ /* Check to see if the export already exists */
|
||||
+ get_uuid(path, NULL, uuid_len, uuid);
|
||||
+ if ((p_export = v4root_export(uuid, uuid_len)) != NULL)
|
||||
@ -621,6 +573,37 @@ index 0000000..8de2ab6
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * See if the pseudo export exists
|
||||
+ */
|
||||
+struct exportent *
|
||||
+v4root_lookup(char *path, nfs_export *exp)
|
||||
+{
|
||||
+ static struct exportent *p_export = NULL;
|
||||
+ char *epath = exp->m_export.e_path;
|
||||
+ int elen, plen;
|
||||
+ char uuid_len = sizeof(uuid_t);
|
||||
+ char uuid[sizeof(uuid_t)];
|
||||
+
|
||||
+ if (pseudo_root == NULL)
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* Path needs to be a subset of e_path */
|
||||
+ elen = strlen(epath);
|
||||
+ plen = strlen(path);
|
||||
+ if (plen >= elen)
|
||||
+ return NULL;
|
||||
+
|
||||
+ if (memcmp(path, epath, plen) != 0)
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* Now to see if the export exists */
|
||||
+ get_uuid(path, NULL, uuid_len, uuid);
|
||||
+ p_export = v4root_export(uuid, uuid_len);
|
||||
+
|
||||
+ return p_export;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Free a pseudo export
|
||||
+ */
|
||||
+void
|
261
nfs-utils-1.2.1-rc7.patch
Normal file
261
nfs-utils-1.2.1-rc7.patch
Normal file
@ -0,0 +1,261 @@
|
||||
diff --git a/support/include/conffile.h b/support/include/conffile.h
|
||||
index 672020a..fe23ec2 100644
|
||||
--- a/support/include/conffile.h
|
||||
+++ b/support/include/conffile.h
|
||||
@@ -75,4 +75,11 @@ static inline void upper2lower(char *str)
|
||||
while ((c = tolower(*str)))
|
||||
*str++ = c;
|
||||
}
|
||||
+
|
||||
+/*
|
||||
+ * Default Mount options
|
||||
+ */
|
||||
+extern unsigned long config_default_vers;
|
||||
+extern unsigned long config_default_proto;
|
||||
+
|
||||
#endif /* _CONFFILE_H_ */
|
||||
diff --git a/utils/mount/configfile.c b/utils/mount/configfile.c
|
||||
index e347b0e..28b722c 100644
|
||||
--- a/utils/mount/configfile.c
|
||||
+++ b/utils/mount/configfile.c
|
||||
@@ -20,13 +20,19 @@
|
||||
#include <config.h>
|
||||
#endif
|
||||
#include <sys/types.h>
|
||||
+#include <sys/socket.h>
|
||||
+#include <netinet/in.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
+#include <errno.h>
|
||||
|
||||
#include "xlog.h"
|
||||
+#include "mount.h"
|
||||
+#include "parse_opt.h"
|
||||
+#include "network.h"
|
||||
#include "conffile.h"
|
||||
|
||||
#define KBYTES(x) ((x) * (1024))
|
||||
@@ -185,6 +191,63 @@ void free_all(void)
|
||||
free(entry);
|
||||
}
|
||||
}
|
||||
+static char *versions[] = {"v2", "v3", "v4", "vers", "nfsvers", NULL};
|
||||
+int inline check_vers(char *mopt, char *field)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ if (strncmp("mountvers", field, strlen("mountvers")) != 0) {
|
||||
+ for (i=0; versions[i]; i++)
|
||||
+ if (strcasestr(mopt, versions[i]) != NULL)
|
||||
+ return 1;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+unsigned long config_default_vers;
|
||||
+unsigned long config_default_proto;
|
||||
+/*
|
||||
+ * Check to see if a default value is being set.
|
||||
+ * If so, set the appropriate global value which will
|
||||
+ * be used as the initial value in the server negation.
|
||||
+ */
|
||||
+int inline default_value(char *mopt)
|
||||
+{
|
||||
+ struct mount_options *options = NULL;
|
||||
+ int dftlen = strlen("default");
|
||||
+ char *field;
|
||||
+
|
||||
+ if (strncasecmp(mopt, "default", dftlen) != 0)
|
||||
+ return 0;
|
||||
+
|
||||
+ field = mopt + dftlen;
|
||||
+ if (strncasecmp(field, "proto", strlen("proto")) == 0) {
|
||||
+ if ((options = po_split(field)) != NULL) {
|
||||
+ if (!nfs_nfs_protocol(options, &config_default_proto)) {
|
||||
+ xlog_warn("Unable to set default protocol : %s",
|
||||
+ strerror(errno));
|
||||
+ }
|
||||
+ } else {
|
||||
+ xlog_warn("Unable to alloc memory for default protocol");
|
||||
+ }
|
||||
+ } else if (strncasecmp(field, "vers", strlen("vers")) == 0) {
|
||||
+ if ((options = po_split(field)) != NULL) {
|
||||
+ if (!nfs_nfs_version(options, &config_default_vers)) {
|
||||
+ xlog_warn("Unable to set default version: %s",
|
||||
+ strerror(errno));
|
||||
+
|
||||
+ }
|
||||
+ } else {
|
||||
+ xlog_warn("Unable to alloc memory for default version");
|
||||
+ }
|
||||
+ } else
|
||||
+ xlog_warn("Invalid default setting: '%s'", mopt);
|
||||
+
|
||||
+ if (options)
|
||||
+ po_destroy(options);
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
/*
|
||||
* Parse the given section of the configuration
|
||||
* file to if there are any mount options set.
|
||||
@@ -207,6 +270,12 @@ conf_parse_mntopts(char *section, char *arg, char *opts)
|
||||
snprintf(buf, BUFSIZ, "%s=", node->field);
|
||||
if (opts && strcasestr(opts, buf) != NULL)
|
||||
continue;
|
||||
+ /*
|
||||
+ * Protocol verions can be set in a number of ways
|
||||
+ */
|
||||
+ if (opts && check_vers(opts, node->field))
|
||||
+ continue;
|
||||
+
|
||||
if (lookup_entry(node->field) != NULL)
|
||||
continue;
|
||||
buf[0] = '\0';
|
||||
@@ -302,15 +371,19 @@ char *conf_get_mntopts(char *spec, char *mount_point,
|
||||
free_all();
|
||||
return mount_opts;
|
||||
}
|
||||
+
|
||||
if (mount_opts) {
|
||||
strcpy(config_opts, mount_opts);
|
||||
strcat(config_opts, ",");
|
||||
}
|
||||
SLIST_FOREACH(entry, &head, entries) {
|
||||
+ if (default_value(entry->opt))
|
||||
+ continue;
|
||||
strcat(config_opts, entry->opt);
|
||||
strcat(config_opts, ",");
|
||||
}
|
||||
- *(strrchr(config_opts, ',')) = '\0';
|
||||
+ if ((ptr = strrchr(config_opts, ',')) != NULL)
|
||||
+ *ptr = '\0';
|
||||
|
||||
free_all();
|
||||
if (mount_opts)
|
||||
diff --git a/utils/mount/network.c b/utils/mount/network.c
|
||||
index bd621be..e651167 100644
|
||||
--- a/utils/mount/network.c
|
||||
+++ b/utils/mount/network.c
|
||||
@@ -50,6 +50,7 @@
|
||||
#include "nfsrpc.h"
|
||||
#include "parse_opt.h"
|
||||
#include "network.h"
|
||||
+#include "conffile.h"
|
||||
|
||||
#define PMAP_TIMEOUT (10)
|
||||
#define CONNECT_TIMEOUT (20)
|
||||
@@ -609,10 +610,19 @@ static int nfs_probe_nfsport(const struct sockaddr *sap, const socklen_t salen,
|
||||
if (pmap->pm_vers && pmap->pm_prot && pmap->pm_port)
|
||||
return 1;
|
||||
|
||||
- if (nfs_mount_data_version >= 4)
|
||||
+ if (nfs_mount_data_version >= 4) {
|
||||
+ const unsigned int *probe_proto = probe_tcp_first;
|
||||
+
|
||||
+ /*
|
||||
+ * If the default proto has been set and
|
||||
+ * its not TCP, start with UDP
|
||||
+ */
|
||||
+ if (config_default_proto && config_default_proto != IPPROTO_TCP)
|
||||
+ probe_proto = probe_udp_first;
|
||||
+
|
||||
return nfs_probe_port(sap, salen, pmap,
|
||||
- probe_nfs3_first, probe_tcp_first);
|
||||
- else
|
||||
+ probe_nfs3_first, probe_proto);
|
||||
+ } else
|
||||
return nfs_probe_port(sap, salen, pmap,
|
||||
probe_nfs2_only, probe_udp_only);
|
||||
}
|
||||
@@ -1261,7 +1271,7 @@ nfs_nfs_version(struct mount_options *options, unsigned long *version)
|
||||
* Returns TRUE if @protocol contains a valid value for this option,
|
||||
* or FALSE if the option was specified with an invalid value.
|
||||
*/
|
||||
-static int
|
||||
+int
|
||||
nfs_nfs_protocol(struct mount_options *options, unsigned long *protocol)
|
||||
{
|
||||
char *option;
|
||||
diff --git a/utils/mount/network.h b/utils/mount/network.h
|
||||
index 402e0a5..7eb89b0 100644
|
||||
--- a/utils/mount/network.h
|
||||
+++ b/utils/mount/network.h
|
||||
@@ -57,6 +57,8 @@ int clnt_ping(struct sockaddr_in *, const unsigned long,
|
||||
struct mount_options;
|
||||
|
||||
int nfs_nfs_version(struct mount_options *options, unsigned long *version);
|
||||
+int nfs_nfs_protocol(struct mount_options *options, unsigned long *protocol);
|
||||
+
|
||||
int nfs_options2pmap(struct mount_options *,
|
||||
struct pmap *, struct pmap *);
|
||||
|
||||
diff --git a/utils/mount/nfsmount.conf b/utils/mount/nfsmount.conf
|
||||
index f9fcfcb..9b8ff4a 100644
|
||||
--- a/utils/mount/nfsmount.conf
|
||||
+++ b/utils/mount/nfsmount.conf
|
||||
@@ -24,14 +24,29 @@
|
||||
# All reads and writes to the 'nfsserver.foo.com' server
|
||||
# will be done with 32k (32768 bytes) block sizes.
|
||||
#
|
||||
-#[ NFSMount_Global_Options ]
|
||||
+[ NFSMount_Global_Options ]
|
||||
# This statically named section defines global mount
|
||||
# options that can be applied on all NFS mount.
|
||||
#
|
||||
-# Protocol Version [2,3]
|
||||
-# Nfsvers=3
|
||||
-# Network Transport [Udp,Tcp,Rdma]
|
||||
-# Proto=Tcp
|
||||
+# Protocol Version [2,3,4]
|
||||
+# This defines the default protocol version which will
|
||||
+# be used to start the negotiation with the server.
|
||||
+# Defaultvers=4
|
||||
+#
|
||||
+# Setting this option makes it mandatory the server supports the
|
||||
+# given version. The mount will fail if the given version is
|
||||
+# not support by the server.
|
||||
+# Nfsvers=4
|
||||
+#
|
||||
+# Network Protocol [udp,tcp,rdma] (Note: values are case sensitive)
|
||||
+# This defines the default network protocol which will
|
||||
+# be used to start the negotiation with the server.
|
||||
+# Defaultproto=tcp
|
||||
+#
|
||||
+# Setting this option makes it mandatory the server supports the
|
||||
+# given network protocol. The mount will fail if the given network
|
||||
+# protocol is not supported by the server.
|
||||
+# Proto=tcp
|
||||
#
|
||||
# The number of times a request will be retired before
|
||||
# generating a timeout
|
||||
diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
|
||||
index 069bdc1..ceefdb0 100644
|
||||
--- a/utils/mount/stropts.c
|
||||
+++ b/utils/mount/stropts.c
|
||||
@@ -45,6 +45,7 @@
|
||||
#include "parse_opt.h"
|
||||
#include "version.h"
|
||||
#include "parse_dev.h"
|
||||
+#include "conffile.h"
|
||||
|
||||
#ifndef NFS_PROGRAM
|
||||
#define NFS_PROGRAM (100003)
|
||||
@@ -283,6 +284,14 @@ static int nfs_validate_options(struct nfsmount_info *mi)
|
||||
if (option && strcmp(option, "rdma") == 0)
|
||||
mi->version = 3;
|
||||
}
|
||||
+ /*
|
||||
+ * Use the default value set in the config file when
|
||||
+ * the version has not been explicitly set.
|
||||
+ */
|
||||
+ if (mi->version == 0 && config_default_vers) {
|
||||
+ if (config_default_vers < 4)
|
||||
+ mi->version = config_default_vers;
|
||||
+ }
|
||||
|
||||
if (!nfs_append_sloppy_option(mi->options))
|
||||
return 0;
|
@ -2,7 +2,7 @@ Summary: NFS utilities and supporting clients and daemons for the kernel NFS ser
|
||||
Name: nfs-utils
|
||||
URL: http://sourceforge.net/projects/nfs
|
||||
Version: 1.2.0
|
||||
Release: 16%{?dist}
|
||||
Release: 17%{?dist}
|
||||
Epoch: 1
|
||||
|
||||
# group all 32bit related archs
|
||||
@ -28,12 +28,9 @@ Patch102: nfs-utils-1.2.1-rc3.patch
|
||||
Patch103: nfs-utils-1.2.1-rc4.patch
|
||||
Patch104: nfs-utils-1.2.1-rc5.patch
|
||||
Patch105: nfs-utils-1.2.1-rc6.patch
|
||||
Patch106: nfs-utils-1.2.0-mount-vers4.patch
|
||||
Patch106: nfs-utils-1.2.1-rc7.patch
|
||||
|
||||
Patch200: nfs-utils-1.2.0-v4root-rel6.patch
|
||||
|
||||
Patch300: nfs-utils-1.2.0-mntconf-vers.patch
|
||||
Patch301: nfs-utils-1.2.0-mntconf-negation.patch
|
||||
Patch200: nfs-utils-1.2.0-v4root-rel7.patch
|
||||
|
||||
Group: System Environment/Daemons
|
||||
Provides: exportfs = %{epoch}:%{version}-%{release}
|
||||
@ -95,9 +92,6 @@ This package also contains the mount.nfs and umount.nfs program.
|
||||
|
||||
%patch200 -p1
|
||||
|
||||
%patch300 -p1
|
||||
%patch301 -p1
|
||||
|
||||
# Remove .orig files
|
||||
find . -name "*.orig" | xargs rm -f
|
||||
|
||||
@ -268,6 +262,13 @@ fi
|
||||
%attr(4755,root,root) /sbin/umount.nfs4
|
||||
|
||||
%changelog
|
||||
* Mon Oct 26 09:23:45 EDT 2009
|
||||
- Updated to the latest pseudo root release (rel7).
|
||||
- Added upstream 1.2.1-rc7 patch which fixes:
|
||||
- Stop ignoring the -o v4 option (bz 529407)
|
||||
- Allow network protocol roll backs when proto is set
|
||||
in the config file (bz 529864)
|
||||
|
||||
* Mon Oct 5 2009 Steve Dickson <steved@redhat.com> 1.2.0-16
|
||||
- Fixed a whole where '-o v4' was not overriding the
|
||||
version in the conf file.
|
||||
|
Loading…
Reference in New Issue
Block a user