walters / rpms / nfs-utils

Forked from rpms/nfs-utils 6 years ago
Clone
0e25fb5
commit 4cacc965afc4fb03a465ffcc6cb3078aeadc3818
0e25fb5
Author: Tomas Richter <krik3t@gmail.com>
0e25fb5
Date:   Wed Feb 18 13:33:27 2009 -0500
0e25fb5
0e25fb5
    Exportfs and rpc.mountd optimalization
0e25fb5
    
0e25fb5
    There were some problems with exportfs and rpc.mountd for long export
0e25fb5
    lists - see https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=76643
0e25fb5
    I do optimalization as my bachelors thesis (Facuulty of informatics,
0e25fb5
    Masaryk's university Brno, Czech Republic), under lead of Yenya
0e25fb5
    Kasprzak.
0e25fb5
    
0e25fb5
    Both exportfs and rpc.mount build linked list of exports (shared
0e25fb5
    functions in export.c). Every time they are inserting new export into
0e25fb5
    list, they search for same export in list.
0e25fb5
    I replaced linked list by hash table and functions export_add and
0e25fb5
    export_lookup by functions hash_export_add and hash_export_lookup
0e25fb5
    (export.c).
0e25fb5
    
0e25fb5
    Because some other functions required exportlist as linked list, hash
0e25fb5
    table has some implementation modification im comparison with ordinary
0e25fb5
    hash table. It also keeps exports in linked list  and has pointer to
0e25fb5
    head of the list. So there's no need of implementation function
0e25fb5
    <for_all_in_hash_table>.
0e25fb5
    
0e25fb5
    Signed-off-by: Tomas Richter <krik3t@gmail.com>
0e25fb5
    Signed-off-by: Steve Dickson <steved@redhat.com>
0e25fb5
0e25fb5
diff -up nfs-utils-1.1.4/support/export/export.c.orig nfs-utils-1.1.4/support/export/export.c
0e25fb5
--- nfs-utils-1.1.4/support/export/export.c.orig	2008-10-17 10:20:09.000000000 -0400
0e25fb5
+++ nfs-utils-1.1.4/support/export/export.c	2009-02-18 19:42:13.000000000 -0500
0e25fb5
@@ -19,7 +19,8 @@
0e25fb5
 #include "nfslib.h"
0e25fb5
 #include "exportfs.h"
0e25fb5
 
0e25fb5
-nfs_export	*exportlist[MCL_MAXTYPES] = { NULL, };
0e25fb5
+exp_hash_table exportlist[MCL_MAXTYPES] = {{NULL, {{NULL,NULL}, }}, }; 
0e25fb5
+static int export_hash(char *);
0e25fb5
 
0e25fb5
 static void	export_init(nfs_export *exp, nfs_client *clp,
0e25fb5
 					struct exportent *nep);
0e25fb5
@@ -125,22 +126,35 @@ export_dup(nfs_export *exp, struct hoste
0e25fb5
 
0e25fb5
 	return new;
0e25fb5
 }
0e25fb5
-
0e25fb5
-void
0e25fb5
+/*
0e25fb5
+ * Add export entry to hash table
0e25fb5
+ */
0e25fb5
+void 
0e25fb5
 export_add(nfs_export *exp)
0e25fb5
 {
0e25fb5
-	nfs_export	**epp;
0e25fb5
-	int		type = exp->m_client->m_type;
0e25fb5
-	int		slen = strlen(exp->m_export.e_path);
0e25fb5
-
0e25fb5
-	if (type < 0 || type >= MCL_MAXTYPES)
0e25fb5
-		xlog(L_FATAL, "unknown client type in export_add");
0e25fb5
-
0e25fb5
-	epp = exportlist + type;
0e25fb5
-	while (*epp && slen <= strlen((*epp)->m_export.e_path))
0e25fb5
-		epp = &((*epp)->m_next);
0e25fb5
-	exp->m_next = *epp;
0e25fb5
-	*epp = exp;
0e25fb5
+	exp_hash_table *p_tbl;
0e25fb5
+	exp_hash_entry *p_hen;
0e25fb5
+	nfs_export *p_next;
0e25fb5
+
0e25fb5
+	int type = exp->m_client->m_type;
0e25fb5
+	int pos;
0e25fb5
+
0e25fb5
+	pos = export_hash(exp->m_export.e_path);
0e25fb5
+	p_tbl = &(exportlist[type]); /* pointer to hash table */
0e25fb5
+	p_hen = &(p_tbl->entries[pos]); /* pointer to hash table entry */
0e25fb5
+
0e25fb5
+	if (!(p_hen->p_first)) { /* hash table entry is empty */ 
0e25fb5
+ 		p_hen->p_first = exp;
0e25fb5
+ 		p_hen->p_last  = exp;
0e25fb5
+
0e25fb5
+ 		exp->m_next = p_tbl->p_head;
0e25fb5
+ 		p_tbl->p_head = exp;
0e25fb5
+	} else { /* hash table entry is NOT empty */
0e25fb5
+		p_next = p_hen->p_last->m_next;
0e25fb5
+		p_hen->p_last->m_next = exp;
0e25fb5
+		exp->m_next = p_next;
0e25fb5
+		p_hen->p_last = exp;
0e25fb5
+	}
0e25fb5
 }
0e25fb5
 
0e25fb5
 nfs_export *
0e25fb5
@@ -150,7 +164,7 @@ export_find(struct hostent *hp, char *pa
0e25fb5
 	int		i;
0e25fb5
 
0e25fb5
 	for (i = 0; i < MCL_MAXTYPES; i++) {
0e25fb5
-		for (exp = exportlist[i]; exp; exp = exp->m_next) {
0e25fb5
+		for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
0e25fb5
 			if (!export_check(exp, hp, path))
0e25fb5
 				continue;
0e25fb5
 			if (exp->m_client->m_type == MCL_FQDN)
0e25fb5
@@ -169,7 +183,7 @@ export_allowed_internal (struct hostent 
0e25fb5
 	int		i;
0e25fb5
 
0e25fb5
 	for (i = 0; i < MCL_MAXTYPES; i++) {
0e25fb5
-		for (exp = exportlist[i]; exp; exp = exp->m_next) {
0e25fb5
+		for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
0e25fb5
 			if (!exp->m_mayexport ||
0e25fb5
 			    !export_check(exp, hp, path))
0e25fb5
 				continue;
0e25fb5
@@ -207,17 +221,30 @@ export_allowed(struct hostent *hp, char 
0e25fb5
 	return NULL;
0e25fb5
 }
0e25fb5
 
0e25fb5
+/*
0e25fb5
+ * Search hash table for export entry. 
0e25fb5
+ */  
0e25fb5
 nfs_export *
0e25fb5
-export_lookup(char *hname, char *path, int canonical)
0e25fb5
+export_lookup(char *hname, char *path, int canonical) 
0e25fb5
 {
0e25fb5
-	nfs_client	*clp;
0e25fb5
-	nfs_export	*exp;
0e25fb5
+	nfs_client *clp;
0e25fb5
+	nfs_export *exp;
0e25fb5
+	exp_hash_entry *p_hen;
0e25fb5
+
0e25fb5
+	int pos;
0e25fb5
 
0e25fb5
-	if (!(clp = client_lookup(hname, canonical)))
0e25fb5
+	clp = client_lookup(hname, canonical);
0e25fb5
+	if(clp == NULL)
0e25fb5
 		return NULL;
0e25fb5
-	for (exp = exportlist[clp->m_type]; exp; exp = exp->m_next)
0e25fb5
-		if (exp->m_client == clp && !strcmp(exp->m_export.e_path, path))
0e25fb5
-			return exp;
0e25fb5
+
0e25fb5
+	pos = export_hash(path);
0e25fb5
+	p_hen = &(exportlist[clp->m_type].entries[pos]); 
0e25fb5
+	for(exp = p_hen->p_first; exp && (exp != p_hen->p_last->m_next); 
0e25fb5
+  			exp = exp->m_next) {
0e25fb5
+		if (exp->m_client == clp && !strcmp(exp->m_export.e_path, path)) {
0e25fb5
+  			return exp;
0e25fb5
+		}
0e25fb5
+	}
0e25fb5
 	return NULL;
0e25fb5
 }
0e25fb5
 
0e25fb5
@@ -234,10 +261,10 @@ void
0e25fb5
 export_freeall(void)
0e25fb5
 {
0e25fb5
 	nfs_export	*exp, *nxt;
0e25fb5
-	int		i;
0e25fb5
+	int		i, j;
0e25fb5
 
0e25fb5
 	for (i = 0; i < MCL_MAXTYPES; i++) {
0e25fb5
-		for (exp = exportlist[i]; exp; exp = nxt) {
0e25fb5
+		for (exp = exportlist[i].p_head; exp; exp = nxt) {
0e25fb5
 			nxt = exp->m_next;
0e25fb5
 			client_release(exp->m_client);
0e25fb5
 			if (exp->m_export.e_squids)
0e25fb5
@@ -251,7 +278,40 @@ export_freeall(void)
0e25fb5
 			xfree(exp->m_export.e_hostname);
0e25fb5
 			xfree(exp);
0e25fb5
 		}
0e25fb5
-		exportlist[i] = NULL;
0e25fb5
+      for(j = 0; j < HASH_TABLE_SIZE; j++) {
0e25fb5
+        exportlist[i].entries[j].p_first = NULL;
0e25fb5
+        exportlist[i].entries[j].p_last = NULL;
0e25fb5
+      }
0e25fb5
+      exportlist[i].p_head = NULL;
0e25fb5
 	}
0e25fb5
 	client_freeall();
0e25fb5
 }
0e25fb5
+
0e25fb5
+/*
0e25fb5
+ * Compute and returns integer from string. 
0e25fb5
+ * Note: Its understood the smae integers can be same for 
0e25fb5
+ *       different strings, but it should not matter.
0e25fb5
+ */
0e25fb5
+static unsigned int 
0e25fb5
+strtoint(char *str)
0e25fb5
+{
0e25fb5
+	int i = 0;
0e25fb5
+	unsigned int n = 0;
0e25fb5
+
0e25fb5
+	while ( str[i] != '\0') {
0e25fb5
+		n+=((int)str[i])*i;
0e25fb5
+		i++;
0e25fb5
+	}
0e25fb5
+	return n;
0e25fb5
+}
0e25fb5
+
0e25fb5
+/*
0e25fb5
+ * Hash function
0e25fb5
+ */
0e25fb5
+static int 
0e25fb5
+export_hash(char *str)
0e25fb5
+{
0e25fb5
+	int num = strtoint(str);
0e25fb5
+
0e25fb5
+	return num % HASH_TABLE_SIZE;
0e25fb5
+}
0e25fb5
diff -up nfs-utils-1.1.4/support/export/xtab.c.orig nfs-utils-1.1.4/support/export/xtab.c
0e25fb5
--- nfs-utils-1.1.4/support/export/xtab.c.orig	2008-10-17 10:20:09.000000000 -0400
0e25fb5
+++ nfs-utils-1.1.4/support/export/xtab.c	2009-02-18 19:42:13.000000000 -0500
0e25fb5
@@ -100,7 +100,7 @@ xtab_write(char *xtab, char *xtabtmp, in
0e25fb5
 	setexportent(xtabtmp, "w");
0e25fb5
 
0e25fb5
 	for (i = 0; i < MCL_MAXTYPES; i++) {
0e25fb5
-		for (exp = exportlist[i]; exp; exp = exp->m_next) {
0e25fb5
+		for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
0e25fb5
 			if (is_export && !exp->m_xtabent)
0e25fb5
 				continue;
0e25fb5
 			if (!is_export && ! exp->m_exported)
0e25fb5
diff -up nfs-utils-1.1.4/support/include/exportfs.h.orig nfs-utils-1.1.4/support/include/exportfs.h
0e25fb5
--- nfs-utils-1.1.4/support/include/exportfs.h.orig	2008-10-17 10:20:09.000000000 -0400
0e25fb5
+++ nfs-utils-1.1.4/support/include/exportfs.h	2009-02-18 19:42:13.000000000 -0500
0e25fb5
@@ -52,8 +52,21 @@ typedef struct mexport {
0e25fb5
 						 * matching one client */
0e25fb5
 } nfs_export;
0e25fb5
 
0e25fb5
+#define HASH_TABLE_SIZE 1021
0e25fb5
+
0e25fb5
+typedef struct _exp_hash_entry {
0e25fb5
+	nfs_export * p_first;
0e25fb5
+  	nfs_export * p_last;
0e25fb5
+} exp_hash_entry;
0e25fb5
+
0e25fb5
+typedef struct _exp_hash_table {
0e25fb5
+	nfs_export * p_head;
0e25fb5
+	exp_hash_entry entries[HASH_TABLE_SIZE];
0e25fb5
+} exp_hash_table;
0e25fb5
+
0e25fb5
+extern exp_hash_table exportlist[MCL_MAXTYPES];
0e25fb5
+
0e25fb5
 extern nfs_client *		clientlist[MCL_MAXTYPES];
0e25fb5
-extern nfs_export *		exportlist[MCL_MAXTYPES];
0e25fb5
 
0e25fb5
 nfs_client *			client_lookup(char *hname, int canonical);
0e25fb5
 nfs_client *			client_find(struct hostent *);
0e25fb5
@@ -69,7 +82,7 @@ struct hostent *		client_resolve(struct 
0e25fb5
 int 				client_member(char *client, char *name);
0e25fb5
 
0e25fb5
 int				export_read(char *fname);
0e25fb5
-void				export_add(nfs_export *);
0e25fb5
+void			export_add(nfs_export *);
0e25fb5
 void				export_reset(nfs_export *);
0e25fb5
 nfs_export *			export_lookup(char *hname, char *path, int caconical);
0e25fb5
 nfs_export *			export_find(struct hostent *, char *path);
0e25fb5
diff -up nfs-utils-1.1.4/support/misc/tcpwrapper.c.orig nfs-utils-1.1.4/support/misc/tcpwrapper.c
0e25fb5
--- nfs-utils-1.1.4/support/misc/tcpwrapper.c.orig	2009-02-17 16:45:04.000000000 -0500
0e25fb5
+++ nfs-utils-1.1.4/support/misc/tcpwrapper.c	2009-02-18 19:42:13.000000000 -0500
0e25fb5
@@ -91,7 +91,7 @@ inline unsigned int strtoint(char *str)
0e25fb5
 
0e25fb5
 	return n;
0e25fb5
 }
0e25fb5
-inline int hashint(unsigned int num)
0e25fb5
+static inline int hashint(unsigned int num)
0e25fb5
 {
0e25fb5
 	return num % HASH_TABLE_SIZE;
0e25fb5
 }
0e25fb5
diff -up nfs-utils-1.1.4/utils/exportfs/exportfs.c.orig nfs-utils-1.1.4/utils/exportfs/exportfs.c
0e25fb5
--- nfs-utils-1.1.4/utils/exportfs/exportfs.c.orig	2008-10-17 10:20:09.000000000 -0400
0e25fb5
+++ nfs-utils-1.1.4/utils/exportfs/exportfs.c	2009-02-18 19:42:13.000000000 -0500
0e25fb5
@@ -111,7 +111,6 @@ main(int argc, char **argv)
0e25fb5
 			return 0;
0e25fb5
 		}
0e25fb5
 	}
0e25fb5
-
0e25fb5
 	if (f_export && ! f_ignore)
0e25fb5
 		export_read(_PATH_EXPORTS);
0e25fb5
 	if (f_export) {
0e25fb5
@@ -193,10 +192,10 @@ exports_update(int verbose)
0e25fb5
 {
0e25fb5
 	nfs_export 	*exp;
0e25fb5
 
0e25fb5
-	for (exp = exportlist[MCL_FQDN]; exp; exp=exp->m_next) {
0e25fb5
+	for (exp = exportlist[MCL_FQDN].p_head; exp; exp=exp->m_next) {
0e25fb5
 		exports_update_one(exp, verbose);
0e25fb5
 	}
0e25fb5
-	for (exp = exportlist[MCL_GSS]; exp; exp=exp->m_next) {
0e25fb5
+	for (exp = exportlist[MCL_GSS].p_head; exp; exp=exp->m_next) {
0e25fb5
 		exports_update_one(exp, verbose);
0e25fb5
 	}
0e25fb5
 }
0e25fb5
@@ -212,7 +211,7 @@ export_all(int verbose)
0e25fb5
 	int		i;
0e25fb5
 
0e25fb5
 	for (i = 0; i < MCL_MAXTYPES; i++) {
0e25fb5
-		for (exp = exportlist[i]; exp; exp = exp->m_next) {
0e25fb5
+		for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
0e25fb5
 			if (verbose)
0e25fb5
 				printf("exporting %s:%s\n",
0e25fb5
 				       exp->m_client->m_hostname, 
0e25fb5
@@ -308,7 +307,7 @@ unexportfs(char *arg, int verbose)
0e25fb5
 		}
0e25fb5
 	}
0e25fb5
 
0e25fb5
-	for (exp = exportlist[htype]; exp; exp = exp->m_next) {
0e25fb5
+	for (exp = exportlist[htype].p_head; exp; exp = exp->m_next) {
0e25fb5
 		if (path && strcmp(path, exp->m_export.e_path))
0e25fb5
 			continue;
0e25fb5
 		if (htype != exp->m_client->m_type)
0e25fb5
@@ -453,7 +452,7 @@ dump(int verbose)
0e25fb5
 	char		*hname, c;
0e25fb5
 
0e25fb5
 	for (htype = 0; htype < MCL_MAXTYPES; htype++) {
0e25fb5
-		for (exp = exportlist[htype]; exp; exp = exp->m_next) {
0e25fb5
+		for (exp = exportlist[htype].p_head; exp; exp = exp->m_next) {
0e25fb5
 			ep = &exp->m_export;
0e25fb5
 			if (!exp->m_xtabent)
0e25fb5
 			    continue; /* neilb */
0e25fb5
diff -up nfs-utils-1.1.4/utils/mountd/auth.c.orig nfs-utils-1.1.4/utils/mountd/auth.c
0e25fb5
--- nfs-utils-1.1.4/utils/mountd/auth.c.orig	2008-10-17 10:20:09.000000000 -0400
0e25fb5
+++ nfs-utils-1.1.4/utils/mountd/auth.c	2009-02-18 19:42:13.000000000 -0500
0e25fb5
@@ -142,7 +142,7 @@ auth_authenticate_internal(char *what, s
0e25fb5
 
0e25fb5
 		exp = NULL;
0e25fb5
 		for (i = 0; !exp && i < MCL_MAXTYPES; i++) 
0e25fb5
-			for (exp = exportlist[i]; exp; exp = exp->m_next) {
0e25fb5
+			for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
0e25fb5
 				if (strcmp(path, exp->m_export.e_path))
0e25fb5
 					continue;
0e25fb5
 				if (!use_ipaddr && !client_member(my_client.m_hostname, exp->m_client->m_hostname))
0e25fb5
diff -up nfs-utils-1.1.4/utils/mountd/cache.c.orig nfs-utils-1.1.4/utils/mountd/cache.c
0e25fb5
--- nfs-utils-1.1.4/utils/mountd/cache.c.orig	2008-10-17 10:20:09.000000000 -0400
0e25fb5
+++ nfs-utils-1.1.4/utils/mountd/cache.c	2009-02-18 19:42:13.000000000 -0500
0e25fb5
@@ -394,7 +394,7 @@ void nfsd_fh(FILE *f)
0e25fb5
 	/* Now determine export point for this fsid/domain */
0e25fb5
 	for (i=0 ; i < MCL_MAXTYPES; i++) {
0e25fb5
 		nfs_export *next_exp;
0e25fb5
-		for (exp = exportlist[i]; exp; exp = next_exp) {
0e25fb5
+		for (exp = exportlist[i].p_head; exp; exp = next_exp) {
0e25fb5
 			struct stat stb;
0e25fb5
 			char u[16];
0e25fb5
 			char *path;
0e25fb5
@@ -654,7 +654,7 @@ void nfsd_export(FILE *f)
0e25fb5
 
0e25fb5
 	/* now find flags for this export point in this domain */
0e25fb5
 	for (i=0 ; i < MCL_MAXTYPES; i++) {
0e25fb5
-		for (exp = exportlist[i]; exp; exp = exp->m_next) {
0e25fb5
+		for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
0e25fb5
 			if (!use_ipaddr && !client_member(dom, exp->m_client->m_hostname))
0e25fb5
 				continue;
0e25fb5
 			if (exp->m_export.e_flags & NFSEXP_CROSSMOUNT) {
0e25fb5
diff -up nfs-utils-1.1.4/utils/mountd/mountd.c.orig nfs-utils-1.1.4/utils/mountd/mountd.c
0e25fb5
--- nfs-utils-1.1.4/utils/mountd/mountd.c.orig	2008-10-17 10:20:09.000000000 -0400
0e25fb5
+++ nfs-utils-1.1.4/utils/mountd/mountd.c	2009-02-18 19:42:13.000000000 -0500
0e25fb5
@@ -521,7 +521,7 @@ get_exportlist(void)
0e25fb5
 	elist = NULL;
0e25fb5
 
0e25fb5
 	for (i = 0; i < MCL_MAXTYPES; i++) {
0e25fb5
-		for (exp = exportlist[i]; exp; exp = exp->m_next) {
0e25fb5
+		for (exp = exportlist[i].p_head; exp; exp = exp->m_next) {
0e25fb5
 			for (e = elist; e != NULL; e = e->ex_next) {
0e25fb5
 				if (!strcmp(exp->m_export.e_path, e->ex_dir))
0e25fb5
 					break;