SOURCES: nfs-utils-CITI_NFS4.patch (NEW) - based on nfs-utils-1.0....

qboosh qboosh at pld-linux.org
Sun Mar 11 01:03:48 CET 2007


Author: qboosh                       Date: Sun Mar 11 00:03:48 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- based on nfs-utils-1.0.11-CITI_NFS4_ALL-1.dif, adapted for 1.0.12

---- Files affected:
SOURCES:
   nfs-utils-CITI_NFS4.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/nfs-utils-CITI_NFS4.patch
diff -u /dev/null SOURCES/nfs-utils-CITI_NFS4.patch:1.1
--- /dev/null	Sun Mar 11 01:03:48 2007
+++ SOURCES/nfs-utils-CITI_NFS4.patch	Sun Mar 11 01:03:43 2007
@@ -0,0 +1,2674 @@
+
+
+The complete set of CITI nfs-utils patches rolled into one patch.
+
+Changes since 1.0.10-CITI_NFS4_ALL-4:
+
+ * Update to nfs-utils-1.0.11
+
+ * Include missing fslocations files and a small change so that
+   fslocations works.
+
+ * Include several mount patches from Steve Dickson
+
+ * Add a patch to put the mount.nfs[4] and umount.nfs[4] in the
+   place where mount expects them during install.
+
+
+---
+
+ nfs-utils-1.0.11-kwc/Makefile.in                        |  136 
+ nfs-utils-1.0.11-kwc/aclocal.m4                         |  250 
+ nfs-utils-1.0.11-kwc/configure                          | 4436 +++++++++++-----
+ nfs-utils-1.0.11-kwc/linux-nfs/Makefile.in              |   88 
+ nfs-utils-1.0.11-kwc/support/Makefile.in                |  120 
+ nfs-utils-1.0.11-kwc/support/export/Makefile.in         |  113 
+ nfs-utils-1.0.11-kwc/support/export/export.c            |    2 
+ nfs-utils-1.0.11-kwc/support/include/Makefile.in        |  124 
+ nfs-utils-1.0.11-kwc/support/include/fstab.h            |    8 
+ nfs-utils-1.0.11-kwc/support/include/nfs/Makefile.in    |   88 
+ nfs-utils-1.0.11-kwc/support/include/nfs_mntent.h       |    8 
+ nfs-utils-1.0.11-kwc/support/include/nfslib.h           |    6 
+ nfs-utils-1.0.11-kwc/support/include/rpcsvc/Makefile.in |   88 
+ nfs-utils-1.0.11-kwc/support/include/sys/Makefile.in    |  120 
+ nfs-utils-1.0.11-kwc/support/include/sys/fs/Makefile.in |   88 
+ nfs-utils-1.0.11-kwc/support/misc/Makefile.in           |  113 
+ nfs-utils-1.0.11-kwc/support/nfs/Makefile.in            |  113 
+ nfs-utils-1.0.11-kwc/support/nfs/conn.c                 |    2 
+ nfs-utils-1.0.11-kwc/support/nfs/exports.c              |  149 
+ nfs-utils-1.0.11-kwc/support/nfs/fstab.c                |   57 
+ nfs-utils-1.0.11-kwc/tools/Makefile.in                  |  120 
+ nfs-utils-1.0.11-kwc/tools/getiversion/Makefile.in      |  126 
+ nfs-utils-1.0.11-kwc/tools/locktest/Makefile.in         |  126 
+ nfs-utils-1.0.11-kwc/tools/nlmtest/Makefile.in          |   88 
+ nfs-utils-1.0.11-kwc/tools/rpcdebug/Makefile.in         |  135 
+ nfs-utils-1.0.11-kwc/tools/rpcgen/Makefile.in           |  198 
+ nfs-utils-1.0.11-kwc/utils/Makefile.in                  |  120 
+ nfs-utils-1.0.11-kwc/utils/exportfs/Makefile.in         |  130 
+ nfs-utils-1.0.11-kwc/utils/exportfs/exportfs.c          |    5 
+ nfs-utils-1.0.11-kwc/utils/exportfs/exports.man         |   14 
+ nfs-utils-1.0.11-kwc/utils/gssd/Makefile.in             |  356 -
+ nfs-utils-1.0.11-kwc/utils/gssd/context.h               |    6 
+ nfs-utils-1.0.11-kwc/utils/gssd/context_lucid.c         |  391 +
+ nfs-utils-1.0.11-kwc/utils/gssd/context_mit.c           |  256 
+ nfs-utils-1.0.11-kwc/utils/gssd/gssd.c                  |   17 
+ nfs-utils-1.0.11-kwc/utils/gssd/gssd.h                  |    3 
+ nfs-utils-1.0.11-kwc/utils/gssd/gssd_main_loop.c        |    4 
+ nfs-utils-1.0.11-kwc/utils/gssd/gssd_proc.c             |   22 
+ nfs-utils-1.0.11-kwc/utils/gssd/krb5_util.c             |  228 
+ nfs-utils-1.0.11-kwc/utils/gssd/krb5_util.h             |    2 
+ nfs-utils-1.0.11-kwc/utils/idmapd/Makefile.in           |  124 
+ nfs-utils-1.0.11-kwc/utils/lockd/Makefile.in            |  126 
+ nfs-utils-1.0.11-kwc/utils/mount/Makefile.am            |   15 
+ nfs-utils-1.0.11-kwc/utils/mount/Makefile.in            |  140 
+ nfs-utils-1.0.11-kwc/utils/mount/mount.c                |  211 
+ nfs-utils-1.0.11-kwc/utils/mount/nfs4mount.c            |    3 
+ nfs-utils-1.0.11-kwc/utils/mount/nfs_mount.h            |    4 
+ nfs-utils-1.0.11-kwc/utils/mount/nfsmount.c             |   70 
+ nfs-utils-1.0.11-kwc/utils/mount/nfsumount.c            |   53 
+ nfs-utils-1.0.11-kwc/utils/mountd/Makefile.in           |  182 
+ nfs-utils-1.0.11-kwc/utils/mountd/cache.c               |   16 
+ nfs-utils-1.0.11-kwc/utils/mountd/fsloc.c               |  188 
+ nfs-utils-1.0.11-kwc/utils/mountd/fsloc.h               |   50 
+ nfs-utils-1.0.11-kwc/utils/nfsd/Makefile.in             |  126 
+ nfs-utils-1.0.11-kwc/utils/nfsstat/Makefile.in          |  124 
+ nfs-utils-1.0.11-kwc/utils/rquotad/Makefile.in          |  166 
+ nfs-utils-1.0.11-kwc/utils/showmount/Makefile.in        |  132 
+ nfs-utils-1.0.11-kwc/utils/statd/Makefile.in            |  126 
+ 58 files changed, 6974 insertions(+), 3338 deletions(-)
+
+--- nfs-utils-1.0.12/utils/mountd/cache.c.orig	2007-02-27 05:55:40.000000000 +0100
++++ nfs-utils-1.0.12/utils/mountd/cache.c	2007-03-11 00:38:34.746218136 +0100
+@@ -445,6 +445,19 @@
+ 	release_replicas(servers);
+ }
+ 
++static void write_secinfo(FILE *f, struct exportent *ep)
++{
++	int *p;
++	qword_print(f, "secinfo");
++	for (p=ep->e_secinfo_order; *p>=0; p++)
++		; /* Do nothing */
++	qword_printint(f, p - ep->e_secinfo_order);
++	for (p=ep->e_secinfo_order; *p>=0; p++) {
++		qword_print(f, secflavor_name[*p]);
++		qword_printint(f, ep->e_secinfo_flags[*p]);
++	}
++}
++
+ static int dump_to_cache(FILE *f, char *domain, char *path, struct exportent *exp)
+ {
+ 	qword_print(f, domain);
+@@ -466,6 +479,7 @@
+  			qword_print(f, "uuid");
+  			qword_printhex(f, exp->e_uuid, 16);
+  		}
++		write_secinfo(f, exp);
+ 	}
+ 	return qword_eol(f);
+ }
+--- nfs-utils-1.0.12/support/nfs/exports.c.orig	2007-02-27 05:55:40.000000000 +0100
++++ nfs-utils-1.0.12/support/nfs/exports.c	2007-03-11 00:39:09.496198423 +0100
+@@ -51,6 +51,10 @@
+ static int	parsemaptype(char *type);
+ static void	freesquash(void);
+ static void	syntaxerr(char *msg);
++static unsigned int parse_flavors(char *str, struct exportent *ep);
++static int	secinfo_default(struct exportent *ep);
++static void	setflags(int mask, unsigned int *ap, struct exportent *ep);
++static void	clearflags(int mask, unsigned int *ap, struct exportent *ep);
+ 
+ void
+ setexportent(char *fname, char *type)
+@@ -102,6 +106,7 @@
+ 		def_ee.e_mountpoint = NULL;
+ 		def_ee.e_fslocmethod = FSLOC_NONE;
+ 		def_ee.e_fslocdata = NULL;
++		def_ee.e_secinfo_order[0] = -1;
+ 		def_ee.e_nsquids = 0;
+ 		def_ee.e_nsqgids = 0;
+ 
+@@ -182,6 +187,19 @@
+ }
+ 
+ void
++secinfo_show(FILE *fp, struct exportent *ep)
++{
++	int *p1, *p2;
++	for (p1=ep->e_secinfo_order; *p1>=0; p1=p2) {
++		fprintf(fp, ",sec=%s", secflavor_name[*p1]);
++		for (p2=p1+1; (*p2>=0) && (ep->e_secinfo_flags[*p1]==ep->e_secinfo_flags[*p2]); p2++) {
++			fprintf(fp, ":%s", secflavor_name[*p2]);
++		}
++		fprintf(fp, ",%s", (ep->e_secinfo_flags[*p1] & NFSEXP_READONLY)? "ro" : "rw");
++	}
++}
++
++void
+ putexportent(struct exportent *ep)
+ {
+ 	FILE	*fp;
+@@ -199,7 +217,6 @@
+ 			fprintf(fp, "%c", esc[i]);
+ 
+ 	fprintf(fp, "\t%s(", ep->e_hostname);
+-	fprintf(fp, "%s,", (ep->e_flags & NFSEXP_READONLY)? "ro" : "rw");
+ 	fprintf(fp, "%ssync,", (ep->e_flags & NFSEXP_ASYNC)? "a" : "");
+ 	fprintf(fp, "%swdelay,", (ep->e_flags & NFSEXP_GATHERED_WRITES)?
+ 				"" : "no_");
+@@ -276,7 +293,9 @@
+ 			else
+ 				fprintf(fp, "%d,", id[i]);
+ 	}
+-	fprintf(fp, "anonuid=%d,anongid=%d)\n", ep->e_anonuid, ep->e_anongid);
++	fprintf(fp, "anonuid=%d,anongid=%d", ep->e_anonuid, ep->e_anongid);
++	secinfo_show(fp, ep);
++	fprintf(fp, ")\n");
+ }
+ 
+ void
+@@ -325,6 +344,7 @@
+ 	ee.e_mountpoint = NULL;
+ 	ee.e_fslocmethod = FSLOC_NONE;
+ 	ee.e_fslocdata = NULL;
++	ee.e_secinfo_order[0] = -1;
+ 	ee.e_nsquids = 0;
+ 	ee.e_nsqgids = 0;
+ 	ee.e_uuid = NULL;
+@@ -376,6 +396,9 @@
+ 	int	had_subtree_opt = 0;
+ 	char 	*flname = efname?efname:"command line";
+ 	int	flline = efp?efp->x_line:0;
++	int	*p;
++	unsigned int active = 0;
++	int secmask = NFSEXP_READONLY;	/* options that can vary per flavor */
+ 
+ 	squids = ep->e_squids; nsquids = ep->e_nsquids;
+ 	sqgids = ep->e_sqgids; nsqgids = ep->e_nsqgids;
+@@ -398,9 +421,9 @@
+ 
+ 		/* process keyword */
+ 		if (strcmp(opt, "ro") == 0)
+-			ep->e_flags |= NFSEXP_READONLY;
++			setflags(NFSEXP_READONLY, &active, ep);
+ 		else if (strcmp(opt, "rw") == 0)
+-			ep->e_flags &= ~NFSEXP_READONLY;
++			clearflags(NFSEXP_READONLY, &active, ep);
+ 		else if (!strcmp(opt, "secure"))
+ 			ep->e_flags &= ~NFSEXP_INSECURE_PORT;
+ 		else if (!strcmp(opt, "insecure"))
+@@ -522,6 +545,10 @@
+ 		} else if (strncmp(opt, "replicas=", 9) == 0) {
+ 			ep->e_fslocmethod = FSLOC_REPLICA;
+ 			ep->e_fslocdata = strdup(opt+9);
++		} else if (strncmp(opt, "sec=", 4) == 0) {
++			active = parse_flavors(opt+4, ep);
++			if (!active)
++				goto bad_option;
+ 		} else {
+ 			xlog(L_ERROR, "%s:%d: unknown keyword \"%s\"\n",
+ 					flname, flline, opt);
+@@ -533,6 +560,12 @@
+ 			cp++;
+ 	}
+ 
++	if (!active)
++		active = secinfo_default(ep);
++	for (p=ep->e_secinfo_order; *p>=0; p++)
++		ep->e_secinfo_flags[*p] |= (ep->e_flags & ~secmask);
++	/* If did not use sec= option, ensure e_flags is backward compatible */
++	ep->e_flags = ep->e_secinfo_flags[ep->e_secinfo_order[0]];
+ 	ep->e_squids = squids;
+ 	ep->e_sqgids = sqgids;
+ 	ep->e_nsquids = nsquids;
+@@ -663,3 +696,107 @@
+ 			efname, efp?efp->x_line:0, msg);
+ }
+ 
++char *secflavor_name[SECFLAVOR_COUNT] = { "sys",
++					  "krb5",
++					  "krb5i",
++					  "krb5p",
++					  "spkm3",
++					  "spkm3i",
++					  "spkm3p"
++};
++
++static void
++secinfo_addflavor(int bit, struct exportent *ep)
++{
++	int *p;
++	for (p=ep->e_secinfo_order; *p>=0; p++) {
++		if (*p == bit)
++			return;
++	}
++	*p++ = bit;
++	*p = -1;
++	ep->e_secinfo_flags[bit] = 0;
++}
++
++static int
++secinfo_nameindex(char *name)
++{
++	int i;
++	for (i=0; i<SECFLAVOR_COUNT; i++) {
++		if (strcmp(secflavor_name[i], name) == 0)
++			return i;
++	}
++	return -1;
++}
++
++/* @str is a colon seperated list of security flavors.  Their order
++ * is recorded in @ep, and a bitmap corresponding to the list is returned.
++ * A zero return indicates an error.
++ */
++static unsigned int
++parse_flavors(char *str, struct exportent *ep)
++{
++	unsigned int out=0;
++	char *flavor;
++	int bit; 
++
++	while ( (flavor=strsep(&str, ":")) ) {
++		bit = secinfo_nameindex(flavor);
++		if (bit == -1) {
++			xlog(L_ERROR, "unknown flavor %s\n", flavor);
++			return 0;
++		}
++		out |= 1<<bit;
++		secinfo_addflavor(bit, ep);
++	}
++	return out;
++}
++
++/* Determine a default security flavor based on ep->e_hostname. */
++static int
++secinfo_default(struct exportent *ep)
++{
++	int i=-1;
++	if (strncmp(ep->e_hostname, "gss/", 4) == 0) {
++		i = secinfo_nameindex(ep->e_hostname + 4);
++		if (i < 0)
++			xlog(L_WARNING, "unknown flavor %s\n", ep->e_hostname);
++	}
++	/* Default to auth_sys */
++	if (i < 0)
++		i = secinfo_nameindex("sys");
++	secinfo_addflavor(i, ep);
++	return 1<<i;
++}
++
++/* Sets the bits in @mask for the appropriate security flavor flags. */
++static void
++setflags(int mask, unsigned int *ap, struct exportent *ep)
++{
++	int active, flavor=0;
++	if (!*ap)
++		*ap = secinfo_default(ep);
++	active = *ap;
++	while (active) {
++		if (active & 1)
++			ep->e_secinfo_flags[flavor] |= mask;
++		flavor++;
++		active >>= 1;
++	}
++}
++
++/* Clears the bits in @mask for the appropriate security flavor flags. */
++static void
++clearflags(int mask, unsigned int *ap, struct exportent *ep)
++{
++	int active, flavor=0;
++	if (!*ap)
++		*ap = secinfo_default(ep);
++	active = *ap;
++	while (active) {
++		if (active & 1)
++			ep->e_secinfo_flags[flavor] &= ~mask;
++		flavor++;
++		active >>= 1;
++	}
++}
+--- nfs-utils-1.0.12/utils/exportfs/exportfs.c.orig	2007-02-27 05:55:40.000000000 +0100
++++ nfs-utils-1.0.12/utils/exportfs/exportfs.c	2007-03-11 00:39:30.569399317 +0100
+@@ -376,10 +376,12 @@
+ 				continue;
+ 			}
+ 			c = '(';
++			/*
+ 			if (ep->e_flags & NFSEXP_READONLY)
+ 				c = dumpopt(c, "ro");
+ 			else
+ 				c = dumpopt(c, "rw");
++			*/
+ 			if (ep->e_flags & NFSEXP_ASYNC)
+ 				c = dumpopt(c, "async");
+ 			if (ep->e_flags & NFSEXP_GATHERED_WRITES)
+@@ -433,6 +435,7 @@
+ 				break;
+ #endif
+ 			}
++			secinfo_show(stdout, ep);
+ 			printf("%c\n", (c != '(')? ')' : ' ');
+ 		}
+ 	}
+diff -puN utils/exportfs/exports.man~CITI_NFS4_ALL utils/exportfs/exports.man
+--- nfs-utils-1.0.11/utils/exportfs/exports.man~CITI_NFS4_ALL	2007-02-26 18:52:07.928367000 -0500
++++ nfs-utils-1.0.11-kwc/utils/exportfs/exports.man	2007-02-26 18:52:08.691050000 -0500
+@@ -348,6 +348,20 @@ If the client asks for alternative locat
+ will be given this list of alternatives. (Note that actual replication
+ of the filesystem must be handled elsewhere.)
+ 
++.TP
++.IR refer= path at host[+host][:path at host[+host]]
++A client referencing the export point will be directed to choose from
++the given list an alternative location for the filesystem.
++(Note that the server must have a mountpoint here, though a different
++filesystem is not required; so, for example,
++.IR "mount --bind" " /path /path"
++is sufficient.)
++.TP
++.IR replicas= path at host[+host][:path at host[+host]]
++If the client asks for alternative locations for the export point, it
++will be given this list of alternatives. (Note that actual replication
++of the filesystem must be handled elsewhere.)
++
+ .SS User ID Mapping
+ .PP
+ .I nfsd
+diff -puN /dev/null utils/mountd/fsloc.c
+--- /dev/null	2007-02-26 18:43:11.800773059 -0500
++++ nfs-utils-1.0.11-kwc/utils/mountd/fsloc.c	2007-02-26 18:52:08.724017000 -0500
+@@ -0,0 +1,188 @@
++/*
++ * COPYRIGHT (c) 2006
++ * THE REGENTS OF THE UNIVERSITY OF MICHIGAN
++ * ALL RIGHTS RESERVED
++ *
++ * Permission is granted to use, copy, create derivative works
++ * and redistribute this software and such derivative works
++ * for any purpose, so long as the name of The University of
++ * Michigan is not used in any advertising or publicity
++ * pertaining to the use of distribution of this software
++ * without specific, written prior authorization.  If the
++ * above copyright notice or any other identification of the
++ * University of Michigan is included in any copy of any
++ * portion of this software, then the disclaimer below must
++ * also be included.
++ *
++ * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION
++ * FROM THE UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY
++ * PURPOSE, AND WITHOUT WARRANTY BY THE UNIVERSITY OF
++ * MICHIGAN OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING
++ * WITHOUT LIMITATION THE IMPLIED WARRANTIES OF
++ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
++ * REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE LIABLE
++ * FOR ANY DAMAGES, INCLUDING SPECIAL, INDIRECT, INCIDENTAL, OR
++ * CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM ARISING
++ * OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN
++ * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF
++ * SUCH DAMAGES.
++ */
++
++#include <stdlib.h>
++#include <string.h>
++#include <syslog.h>
++
++#include "fsloc.h"
++#include "exportfs.h"
++
++/* Debugging tool: prints out @servers info to syslog */
++static void replicas_print(struct servers *sp)
++{
++	int i;
++	if (!sp) {
++		xlog(L_NOTICE, "NULL replicas pointer\n");
++		return;
++	}
++	xlog(L_NOTICE, "replicas listsize=%i\n", sp->h_num);
++	for (i=0; i<sp->h_num; i++) {
++		xlog(L_NOTICE, "    %s:%s\n",
++		       sp->h_mp[i]->h_host, sp->h_mp[i]->h_path);
++	}
++}
++
++#ifdef DEBUG
++/* Called by setting 'Method = stub' in config file.  Just returns
++ * some syntactically correct gibberish for testing purposes.
++ */
++static struct servers *method_stub(char *key)
++{
++	struct servers *sp;
++	struct mount_point *mp;
++
++	xlog(L_NOTICE, "called method_stub\n");
++	sp = malloc(sizeof(struct servers));
++	if (!sp)
++		return NULL;
++	mp = calloc(1, sizeof(struct mount_point));
++	if (!mp) {
++		free(sp);
++		return NULL;
++	}
++	sp->h_num = 1;
++	sp->h_mp[0] = mp;
++	mp->h_host = strdup("stub_server");
++	mp->h_path = strdup("/my/test/path");
++	sp->h_referral = 1;
++	return sp;
++}
++#endif	/* DEBUG */
++
++/* Scan @list, which is a NULL-terminated array of strings of the
++ * form path at host[+host], and return corresponding servers structure.
++ */
++static struct servers *parse_list(char **list)
++{
++	int i;
++	struct servers *res;
++	struct mount_point *mp;
++	char *cp;
++
++	res = malloc(sizeof(struct servers));
++	if (!res)
++		return NULL;
++	res->h_num = 0;
++
++	/* parse each of the answers in sucession. */
++	for (i=0; list[i] && i<FSLOC_MAX_LIST; i++) {
++		mp = calloc(1, sizeof(struct mount_point));
++		if (!mp) {
++			release_replicas(res);
++			return NULL;
++		}
++		cp = strchr(list[i], '@');
++		if ((!cp) || list[i][0] != '/') {
++			xlog(L_WARNING, "invalid entry '%s'", list[i]);
++			continue; /* XXX Need better error handling */
++		}
++		res->h_mp[i] = mp;
++		res->h_num++;
++		mp->h_path = strndup(list[i], cp - list[i]);
++		cp++;
++		mp->h_host = strdup(cp);
++		/* hosts are '+' separated, kernel expects ':' separated */
++		while ( (cp = strchr(mp->h_host, '+')) )
++		       *cp = ':';
++	}
++	return res;
++}
++
++/* @data is a string of form path at host[+host][:path at host[+host]]
++ */
++static struct servers *method_list(char *data)
++{
++	char *copy, *ptr=data;
++	char **list;
++	int i, listsize;
++	struct servers *rv=NULL;
++
++	xlog(L_NOTICE, "method_list(%s)\n", data);
++	for (ptr--, listsize=1; ptr; ptr=index(ptr, ':'), listsize++)
++		ptr++;
++	list = malloc(listsize * sizeof(char *));
++	copy = strdup(data);
++	if (copy)
++		xlog(L_NOTICE, "converted to %s\n", copy);
++	if (list && copy) {
++		ptr = copy;
++		for (i=0; i<listsize; i++) {
++			list[i] = strsep(&ptr, ":");
++		}
++		rv = parse_list(list);
++	}
++	free(copy);
++	free(list);
++	replicas_print(rv);
++	return rv;
++}
++
++/* Returns appropriately filled struct servers, or NULL if had a problem */
++struct servers *replicas_lookup(int method, char *data, char *key)
++{
++	struct servers *sp=NULL;
++	switch(method) {
++	case FSLOC_NONE:
++		break;
++	case FSLOC_REFER:
++		sp = method_list(data);
++		if (sp)
++			sp->h_referral = 1;
++		break;
++	case FSLOC_REPLICA:
++		sp = method_list(data);
++		if (sp)
++			sp->h_referral = 0;
++		break;
++#ifdef DEBUG
++	case FSLOC_STUB:
++		sp = method_stub(data);
++		break;
++#endif
++	default:
++		xlog(L_WARNING, "Unknown method = %i", method);
++	}
++	replicas_print(sp);
++	return sp;
++}
++
++void release_replicas(struct servers *server)
++{
++	int i;
++
++	if (!server) return;
++	for (i = 0; i < server->h_num; i++) {
++		free(server->h_mp[i]->h_host);
++		free(server->h_mp[i]->h_path);
++		free(server->h_mp[i]);
++	}
++	free(server);
++}
+diff -puN /dev/null utils/mountd/fsloc.h
+--- /dev/null	2007-02-26 18:43:11.800773059 -0500
++++ nfs-utils-1.0.11-kwc/utils/mountd/fsloc.h	2007-02-26 18:52:08.764976000 -0500
+@@ -0,0 +1,50 @@
++/*
++ * COPYRIGHT (c) 2006
++ * THE REGENTS OF THE UNIVERSITY OF MICHIGAN
++ * ALL RIGHTS RESERVED
++ *
++ * Permission is granted to use, copy, create derivative works
++ * and redistribute this software and such derivative works
++ * for any purpose, so long as the name of The University of
++ * Michigan is not used in any advertising or publicity
++ * pertaining to the use of distribution of this software
++ * without specific, written prior authorization.  If the
++ * above copyright notice or any other identification of the
++ * University of Michigan is included in any copy of any
++ * portion of this software, then the disclaimer below must
++ * also be included.
++ *
++ * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION
<<Diff was trimmed, longer than 597 lines>>


More information about the pld-cvs-commit mailing list