All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <478D3820.9080402@redhat.com>

diff --git a/a/1.txt b/N1/1.txt
index af1100f..09728c4 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -9,11 +9,3 @@ be unlocked.
 Thanks to all for the review !
 
 -- Wendy
-
--------------- next part --------------
-A non-text attachment was scrubbed...
-Name: unlock_v3.patch
-Type: text/x-patch
-Size: 8335 bytes
-Desc: not available
-URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20080115/ebf7ec37/attachment.bin>
diff --git a/N1/2.hdr b/N1/2.hdr
new file mode 100644
index 0000000..a9e6175
--- /dev/null
+++ b/N1/2.hdr
@@ -0,0 +1,5 @@
+Content-Type: text/x-patch;
+ name="unlock_v3.patch"
+Content-Transfer-Encoding: 7bit
+Content-Disposition: inline;
+ filename="unlock_v3.patch"
diff --git a/N1/2.txt b/N1/2.txt
new file mode 100644
index 0000000..c8de0be
--- /dev/null
+++ b/N1/2.txt
@@ -0,0 +1,288 @@
+Two new NFSD procfs files are added:
+  /proc/fs/nfsd/unlock_ip
+  /proc/fs/nfsd/unlock_filesystem
+
+They are intended to allow admin or user mode script to release NLM locks
+based on either a path name or a server in-bound ip address (ipv4 for now)
+as;
+
+shell> echo 10.1.1.2 > /proc/fs/nfsd/unlock_ip
+shell> echo /mnt/sfs1 > /proc/fs/nfsd/unlock_filesystem
+
+Signed-off-by: S. Wendy Cheng <wcheng@redhat.com>
+Signed-off-by: Lon Hohberger  <lhh@redhat.com>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+
+ fs/lockd/svcsubs.c          |   66 +++++++++++++++++++++++++++++++++++++++-----
+ fs/nfsd/nfsctl.c            |   65 +++++++++++++++++++++++++++++++++++++++++++
+ include/linux/lockd/lockd.h |    7 ++++
+ 3 files changed, 131 insertions(+), 7 deletions(-)
+
+--- linux-o/fs/nfsd/nfsctl.c	2008-01-04 10:01:08.000000000 -0500
++++ linux/fs/nfsd/nfsctl.c	2008-01-15 11:30:19.000000000 -0500
+@@ -22,6 +22,7 @@
+ #include <linux/seq_file.h>
+ #include <linux/pagemap.h>
+ #include <linux/init.h>
++#include <linux/inet.h>
+ #include <linux/string.h>
+ #include <linux/smp_lock.h>
+ #include <linux/ctype.h>
+@@ -35,6 +36,7 @@
+ #include <linux/nfsd/cache.h>
+ #include <linux/nfsd/xdr.h>
+ #include <linux/nfsd/syscall.h>
++#include <linux/lockd/lockd.h>
+ 
+ #include <asm/uaccess.h>
+ 
+@@ -52,6 +54,8 @@ enum {
+ 	NFSD_Getfs,
+ 	NFSD_List,
+ 	NFSD_Fh,
++	NFSD_FO_UnlockIP,
++	NFSD_FO_UnlockFS,
+ 	NFSD_Threads,
+ 	NFSD_Pool_Threads,
+ 	NFSD_Versions,
+@@ -88,6 +92,9 @@ static ssize_t write_leasetime(struct fi
+ static ssize_t write_recoverydir(struct file *file, char *buf, size_t size);
+ #endif
+ 
++static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size);
++static ssize_t failover_unlock_fs(struct file *file, char *buf, size_t size);
++
+ static ssize_t (*write_op[])(struct file *, char *, size_t) = {
+ 	[NFSD_Svc] = write_svc,
+ 	[NFSD_Add] = write_add,
+@@ -97,6 +104,8 @@ static ssize_t (*write_op[])(struct file
+ 	[NFSD_Getfd] = write_getfd,
+ 	[NFSD_Getfs] = write_getfs,
+ 	[NFSD_Fh] = write_filehandle,
++	[NFSD_FO_UnlockIP] = failover_unlock_ip,
++	[NFSD_FO_UnlockFS] = failover_unlock_fs,
+ 	[NFSD_Threads] = write_threads,
+ 	[NFSD_Pool_Threads] = write_pool_threads,
+ 	[NFSD_Versions] = write_versions,
+@@ -288,6 +297,58 @@ static ssize_t write_getfd(struct file *
+ 	return err;
+ }
+ 
++static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size)
++{
++	__be32 server_ip;
++	char *fo_path, c;
++	int b1, b2, b3, b4;
++
++	/* sanity check */
++	if (size == 0)
++		return -EINVAL;
++
++	if (buf[size-1] != '\n')
++		return -EINVAL;
++
++	fo_path = buf;
++	if (qword_get(&buf, fo_path, size) < 0)
++		return -EINVAL;
++
++	/* get ipv4 address */
++	if (sscanf(fo_path, "%u.%u.%u.%u%c", &b1, &b2, &b3, &b4, &c) != 4)
++		return -EINVAL;
++	server_ip = htonl((((((b1<<8)|b2)<<8)|b3)<<8)|b4);
++
++	return nlmsvc_failover_ip(server_ip);
++}
++
++static ssize_t failover_unlock_fs(struct file *file, char *buf, size_t size)
++{
++	struct nameidata nd;
++	char *fo_path;
++	int error;
++
++	/* sanity check */
++	if (size == 0)
++		return -EINVAL;
++
++	if (buf[size-1] != '\n')
++		return -EINVAL;
++
++	fo_path = buf;
++	if (qword_get(&buf, fo_path, size) < 0)
++		return -EINVAL;
++
++	error = path_lookup(fo_path, 0, &nd);
++	if (error)
++		return error;
++
++	error = nlmsvc_failover_path(&nd);
++
++	path_release(&nd);
++	return error;
++}
++
+ static ssize_t write_filehandle(struct file *file, char *buf, size_t size)
+ {
+ 	/* request is:
+@@ -646,6 +707,10 @@ static int nfsd_fill_super(struct super_
+ 		[NFSD_Getfd] = {".getfd", &transaction_ops, S_IWUSR|S_IRUSR},
+ 		[NFSD_Getfs] = {".getfs", &transaction_ops, S_IWUSR|S_IRUSR},
+ 		[NFSD_List] = {"exports", &exports_operations, S_IRUGO},
++		[NFSD_FO_UnlockIP] = {"unlock_ip",
++					&transaction_ops, S_IWUSR|S_IRUSR},
++		[NFSD_FO_UnlockFS] = {"unlock_filesystem",
++					&transaction_ops, S_IWUSR|S_IRUSR},
+ 		[NFSD_Fh] = {"filehandle", &transaction_ops, S_IWUSR|S_IRUSR},
+ 		[NFSD_Threads] = {"threads", &transaction_ops, S_IWUSR|S_IRUSR},
+ 		[NFSD_Pool_Threads] = {"pool_threads", &transaction_ops, S_IWUSR|S_IRUSR},
+--- linux-o/fs/lockd/svcsubs.c	2008-01-04 10:01:08.000000000 -0500
++++ linux/fs/lockd/svcsubs.c	2008-01-15 11:16:48.000000000 -0500
+@@ -18,6 +18,8 @@
+ #include <linux/lockd/lockd.h>
+ #include <linux/lockd/share.h>
+ #include <linux/lockd/sm_inter.h>
++#include <linux/module.h>
++#include <linux/mount.h>
+ 
+ #define NLMDBG_FACILITY		NLMDBG_SVCSUBS
+ 
+@@ -87,7 +89,7 @@ nlm_lookup_file(struct svc_rqst *rqstp, 
+ 	unsigned int	hash;
+ 	__be32		nfserr;
+ 
+-	nlm_debug_print_fh("nlm_file_lookup", f);
++	nlm_debug_print_fh("nlm_lookup_file", f);
+ 
+ 	hash = file_hash(f);
+ 
+@@ -123,6 +125,9 @@ nlm_lookup_file(struct svc_rqst *rqstp, 
+ 
+ 	hlist_add_head(&file->f_list, &nlm_files[hash]);
+ 
++	/* fill in f_iaddr for nlm lock failover */
++	file->f_iaddr = rqstp->rq_daddr;
++
+ found:
+ 	dprintk("lockd: found file %p (count %d)\n", file, file->f_count);
+ 	*result = file;
+@@ -194,6 +199,12 @@ again:
+ 	return 0;
+ }
+ 
++static int
++nlmsvc_always_match(struct nlm_host *dummy1, struct nlm_host *dummy2)
++{
++	return 1;
++}
++
+ /*
+  * Inspect a single file
+  */
+@@ -230,7 +241,8 @@ nlm_file_inuse(struct nlm_file *file)
+  * Loop over all files in the file table.
+  */
+ static int
+-nlm_traverse_files(struct nlm_host *host, nlm_host_match_fn_t match)
++nlm_traverse_files(void *data, nlm_host_match_fn_t match,
++		int (*is_failover_file)(void *data, struct nlm_file *file))
+ {
+ 	struct hlist_node *pos, *next;
+ 	struct nlm_file	*file;
+@@ -244,8 +256,17 @@ nlm_traverse_files(struct nlm_host *host
+ 
+ 			/* Traverse locks, blocks and shares of this file
+ 			 * and update file->f_locks count */
+-			if (nlm_inspect_file(host, file, match))
+-				ret = 1;
++
++			if (likely(is_failover_file == NULL) ||
++				is_failover_file(data, file)) {
++				/*
++				 *  Note that nlm_inspect_file updates f_locks
++				 *  and ret is the number of files that can't
++				 *  be unlocked.
++				 */
++				ret += nlm_inspect_file(data, file, match);
++			} else
++				file->f_locks = nlm_file_inuse(file);
+ 
+ 			mutex_lock(&nlm_file_mutex);
+ 			file->f_count--;
+@@ -337,7 +358,7 @@ void
+ nlmsvc_mark_resources(void)
+ {
+ 	dprintk("lockd: nlmsvc_mark_resources\n");
+-	nlm_traverse_files(NULL, nlmsvc_mark_host);
++	nlm_traverse_files(NULL, nlmsvc_mark_host, NULL);
+ }
+ 
+ /*
+@@ -348,7 +369,7 @@ nlmsvc_free_host_resources(struct nlm_ho
+ {
+ 	dprintk("lockd: nlmsvc_free_host_resources\n");
+ 
+-	if (nlm_traverse_files(host, nlmsvc_same_host)) {
++	if (nlm_traverse_files(host, nlmsvc_same_host, NULL)) {
+ 		printk(KERN_WARNING
+ 			"lockd: couldn't remove all locks held by %s\n",
+ 			host->h_name);
+@@ -368,5 +389,36 @@ nlmsvc_invalidate_all(void)
+ 	 * turn, which is about as inefficient as it gets.
+ 	 * Now we just do it once in nlm_traverse_files.
+ 	 */
+-	nlm_traverse_files(NULL, nlmsvc_is_client);
++	nlm_traverse_files(NULL, nlmsvc_is_client, NULL);
++}
++
++static int
++nlmsvc_failover_file_ok_path(void *datap, struct nlm_file *file)
++{
++	struct nameidata *nd = datap;
++	return nd->mnt == file->f_file->f_path.mnt;
++}
++
++int
++nlmsvc_failover_path(struct nameidata *nd)
++{
++	return nlm_traverse_files(nd, nlmsvc_always_match,
++			nlmsvc_failover_file_ok_path);
++}
++EXPORT_SYMBOL_GPL(nlmsvc_failover_path);
++
++static int
++nlmsvc_failover_file_ok_ip(void *datap, struct nlm_file *file)
++{
++	__be32 *server_addr = datap;
++
++	return file->f_iaddr.addr.s_addr == *server_addr;
++}
++
++int
++nlmsvc_failover_ip(__be32 server_addr)
++{
++	return nlm_traverse_files(&server_addr, nlmsvc_always_match,
++			nlmsvc_failover_file_ok_ip);
+ }
++EXPORT_SYMBOL_GPL(nlmsvc_failover_ip);
+--- linux-o/include/linux/lockd/lockd.h	2008-01-04 10:01:08.000000000 -0500
++++ linux/include/linux/lockd/lockd.h	2008-01-15 11:13:04.000000000 -0500
+@@ -113,6 +113,7 @@ struct nlm_file {
+ 	unsigned int		f_locks;	/* guesstimate # of locks */
+ 	unsigned int		f_count;	/* reference count */
+ 	struct mutex		f_mutex;	/* avoid concurrent access */
++	union svc_addr_u	f_iaddr;	/* server ip for failover */
+ };
+ 
+ /*
+@@ -214,6 +215,12 @@ void		  nlmsvc_mark_resources(void);
+ void		  nlmsvc_free_host_resources(struct nlm_host *);
+ void		  nlmsvc_invalidate_all(void);
+ 
++/*
++ * Cluster failover support
++ */
++int           nlmsvc_failover_path(struct nameidata *nd);
++int           nlmsvc_failover_ip(__be32 server_addr);
++
+ static __inline__ struct inode *
+ nlmsvc_file_inode(struct nlm_file *file)
+ {
diff --git a/a/content_digest b/N1/content_digest
index af5b48f..9a10b95 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -9,10 +9,14 @@
  "ref\0478D14C5.1000804@redhat.com\0"
  "ref\018317.7319.443532.62244@notabene.brown\0"
  "From\0Wendy Cheng <wcheng@redhat.com>\0"
- "Subject\0[Cluster-devel] Re: [PATCH 1/2] NLM failover unlock commands\0"
+ "Subject\0Re: [PATCH 1/2] NLM failover unlock commands\0"
  "Date\0Tue, 15 Jan 2008 17:48:00 -0500\0"
- "To\0cluster-devel.redhat.com\0"
- "\00:1\0"
+ "To\0Neil Brown <neilb@suse.de>"
+ " J. Bruce Fields <bfields@fieldses.org>\0"
+ "Cc\0Christoph Hellwig <hch@infradead.org>"
+  cluster-devel@redhat.com
+ " NFS list <linux-nfs@vger.kernel.org>\0"
+ "\01:1\0"
  "b\0"
  "Revised version of the patch:\n"
  "\n"
@@ -24,14 +28,297 @@
  "\n"
  "Thanks to all for the review !\n"
  "\n"
- "-- Wendy\n"
+ -- Wendy
+ "\01:2\0"
+ "fn\0unlock_v3.patch\0"
+ "b\0"
+ "Two new NFSD procfs files are added:\n"
+ "  /proc/fs/nfsd/unlock_ip\n"
+ "  /proc/fs/nfsd/unlock_filesystem\n"
+ "\n"
+ "They are intended to allow admin or user mode script to release NLM locks\n"
+ "based on either a path name or a server in-bound ip address (ipv4 for now)\n"
+ "as;\n"
+ "\n"
+ "shell> echo 10.1.1.2 > /proc/fs/nfsd/unlock_ip\n"
+ "shell> echo /mnt/sfs1 > /proc/fs/nfsd/unlock_filesystem\n"
+ "\n"
+ "Signed-off-by: S. Wendy Cheng <wcheng@redhat.com>\n"
+ "Signed-off-by: Lon Hohberger  <lhh@redhat.com>\n"
+ "Signed-off-by: Christoph Hellwig <hch@lst.de>\n"
+ "\n"
+ " fs/lockd/svcsubs.c          |   66 +++++++++++++++++++++++++++++++++++++++-----\n"
+ " fs/nfsd/nfsctl.c            |   65 +++++++++++++++++++++++++++++++++++++++++++\n"
+ " include/linux/lockd/lockd.h |    7 ++++\n"
+ " 3 files changed, 131 insertions(+), 7 deletions(-)\n"
  "\n"
- "-------------- next part --------------\n"
- "A non-text attachment was scrubbed...\n"
- "Name: unlock_v3.patch\n"
- "Type: text/x-patch\n"
- "Size: 8335 bytes\n"
- "Desc: not available\n"
- URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20080115/ebf7ec37/attachment.bin>
+ "--- linux-o/fs/nfsd/nfsctl.c\t2008-01-04 10:01:08.000000000 -0500\n"
+ "+++ linux/fs/nfsd/nfsctl.c\t2008-01-15 11:30:19.000000000 -0500\n"
+ "@@ -22,6 +22,7 @@\n"
+ " #include <linux/seq_file.h>\n"
+ " #include <linux/pagemap.h>\n"
+ " #include <linux/init.h>\n"
+ "+#include <linux/inet.h>\n"
+ " #include <linux/string.h>\n"
+ " #include <linux/smp_lock.h>\n"
+ " #include <linux/ctype.h>\n"
+ "@@ -35,6 +36,7 @@\n"
+ " #include <linux/nfsd/cache.h>\n"
+ " #include <linux/nfsd/xdr.h>\n"
+ " #include <linux/nfsd/syscall.h>\n"
+ "+#include <linux/lockd/lockd.h>\n"
+ " \n"
+ " #include <asm/uaccess.h>\n"
+ " \n"
+ "@@ -52,6 +54,8 @@ enum {\n"
+ " \tNFSD_Getfs,\n"
+ " \tNFSD_List,\n"
+ " \tNFSD_Fh,\n"
+ "+\tNFSD_FO_UnlockIP,\n"
+ "+\tNFSD_FO_UnlockFS,\n"
+ " \tNFSD_Threads,\n"
+ " \tNFSD_Pool_Threads,\n"
+ " \tNFSD_Versions,\n"
+ "@@ -88,6 +92,9 @@ static ssize_t write_leasetime(struct fi\n"
+ " static ssize_t write_recoverydir(struct file *file, char *buf, size_t size);\n"
+ " #endif\n"
+ " \n"
+ "+static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size);\n"
+ "+static ssize_t failover_unlock_fs(struct file *file, char *buf, size_t size);\n"
+ "+\n"
+ " static ssize_t (*write_op[])(struct file *, char *, size_t) = {\n"
+ " \t[NFSD_Svc] = write_svc,\n"
+ " \t[NFSD_Add] = write_add,\n"
+ "@@ -97,6 +104,8 @@ static ssize_t (*write_op[])(struct file\n"
+ " \t[NFSD_Getfd] = write_getfd,\n"
+ " \t[NFSD_Getfs] = write_getfs,\n"
+ " \t[NFSD_Fh] = write_filehandle,\n"
+ "+\t[NFSD_FO_UnlockIP] = failover_unlock_ip,\n"
+ "+\t[NFSD_FO_UnlockFS] = failover_unlock_fs,\n"
+ " \t[NFSD_Threads] = write_threads,\n"
+ " \t[NFSD_Pool_Threads] = write_pool_threads,\n"
+ " \t[NFSD_Versions] = write_versions,\n"
+ "@@ -288,6 +297,58 @@ static ssize_t write_getfd(struct file *\n"
+ " \treturn err;\n"
+ " }\n"
+ " \n"
+ "+static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size)\n"
+ "+{\n"
+ "+\t__be32 server_ip;\n"
+ "+\tchar *fo_path, c;\n"
+ "+\tint b1, b2, b3, b4;\n"
+ "+\n"
+ "+\t/* sanity check */\n"
+ "+\tif (size == 0)\n"
+ "+\t\treturn -EINVAL;\n"
+ "+\n"
+ "+\tif (buf[size-1] != '\\n')\n"
+ "+\t\treturn -EINVAL;\n"
+ "+\n"
+ "+\tfo_path = buf;\n"
+ "+\tif (qword_get(&buf, fo_path, size) < 0)\n"
+ "+\t\treturn -EINVAL;\n"
+ "+\n"
+ "+\t/* get ipv4 address */\n"
+ "+\tif (sscanf(fo_path, \"%u.%u.%u.%u%c\", &b1, &b2, &b3, &b4, &c) != 4)\n"
+ "+\t\treturn -EINVAL;\n"
+ "+\tserver_ip = htonl((((((b1<<8)|b2)<<8)|b3)<<8)|b4);\n"
+ "+\n"
+ "+\treturn nlmsvc_failover_ip(server_ip);\n"
+ "+}\n"
+ "+\n"
+ "+static ssize_t failover_unlock_fs(struct file *file, char *buf, size_t size)\n"
+ "+{\n"
+ "+\tstruct nameidata nd;\n"
+ "+\tchar *fo_path;\n"
+ "+\tint error;\n"
+ "+\n"
+ "+\t/* sanity check */\n"
+ "+\tif (size == 0)\n"
+ "+\t\treturn -EINVAL;\n"
+ "+\n"
+ "+\tif (buf[size-1] != '\\n')\n"
+ "+\t\treturn -EINVAL;\n"
+ "+\n"
+ "+\tfo_path = buf;\n"
+ "+\tif (qword_get(&buf, fo_path, size) < 0)\n"
+ "+\t\treturn -EINVAL;\n"
+ "+\n"
+ "+\terror = path_lookup(fo_path, 0, &nd);\n"
+ "+\tif (error)\n"
+ "+\t\treturn error;\n"
+ "+\n"
+ "+\terror = nlmsvc_failover_path(&nd);\n"
+ "+\n"
+ "+\tpath_release(&nd);\n"
+ "+\treturn error;\n"
+ "+}\n"
+ "+\n"
+ " static ssize_t write_filehandle(struct file *file, char *buf, size_t size)\n"
+ " {\n"
+ " \t/* request is:\n"
+ "@@ -646,6 +707,10 @@ static int nfsd_fill_super(struct super_\n"
+ " \t\t[NFSD_Getfd] = {\".getfd\", &transaction_ops, S_IWUSR|S_IRUSR},\n"
+ " \t\t[NFSD_Getfs] = {\".getfs\", &transaction_ops, S_IWUSR|S_IRUSR},\n"
+ " \t\t[NFSD_List] = {\"exports\", &exports_operations, S_IRUGO},\n"
+ "+\t\t[NFSD_FO_UnlockIP] = {\"unlock_ip\",\n"
+ "+\t\t\t\t\t&transaction_ops, S_IWUSR|S_IRUSR},\n"
+ "+\t\t[NFSD_FO_UnlockFS] = {\"unlock_filesystem\",\n"
+ "+\t\t\t\t\t&transaction_ops, S_IWUSR|S_IRUSR},\n"
+ " \t\t[NFSD_Fh] = {\"filehandle\", &transaction_ops, S_IWUSR|S_IRUSR},\n"
+ " \t\t[NFSD_Threads] = {\"threads\", &transaction_ops, S_IWUSR|S_IRUSR},\n"
+ " \t\t[NFSD_Pool_Threads] = {\"pool_threads\", &transaction_ops, S_IWUSR|S_IRUSR},\n"
+ "--- linux-o/fs/lockd/svcsubs.c\t2008-01-04 10:01:08.000000000 -0500\n"
+ "+++ linux/fs/lockd/svcsubs.c\t2008-01-15 11:16:48.000000000 -0500\n"
+ "@@ -18,6 +18,8 @@\n"
+ " #include <linux/lockd/lockd.h>\n"
+ " #include <linux/lockd/share.h>\n"
+ " #include <linux/lockd/sm_inter.h>\n"
+ "+#include <linux/module.h>\n"
+ "+#include <linux/mount.h>\n"
+ " \n"
+ " #define NLMDBG_FACILITY\t\tNLMDBG_SVCSUBS\n"
+ " \n"
+ "@@ -87,7 +89,7 @@ nlm_lookup_file(struct svc_rqst *rqstp, \n"
+ " \tunsigned int\thash;\n"
+ " \t__be32\t\tnfserr;\n"
+ " \n"
+ "-\tnlm_debug_print_fh(\"nlm_file_lookup\", f);\n"
+ "+\tnlm_debug_print_fh(\"nlm_lookup_file\", f);\n"
+ " \n"
+ " \thash = file_hash(f);\n"
+ " \n"
+ "@@ -123,6 +125,9 @@ nlm_lookup_file(struct svc_rqst *rqstp, \n"
+ " \n"
+ " \thlist_add_head(&file->f_list, &nlm_files[hash]);\n"
+ " \n"
+ "+\t/* fill in f_iaddr for nlm lock failover */\n"
+ "+\tfile->f_iaddr = rqstp->rq_daddr;\n"
+ "+\n"
+ " found:\n"
+ " \tdprintk(\"lockd: found file %p (count %d)\\n\", file, file->f_count);\n"
+ " \t*result = file;\n"
+ "@@ -194,6 +199,12 @@ again:\n"
+ " \treturn 0;\n"
+ " }\n"
+ " \n"
+ "+static int\n"
+ "+nlmsvc_always_match(struct nlm_host *dummy1, struct nlm_host *dummy2)\n"
+ "+{\n"
+ "+\treturn 1;\n"
+ "+}\n"
+ "+\n"
+ " /*\n"
+ "  * Inspect a single file\n"
+ "  */\n"
+ "@@ -230,7 +241,8 @@ nlm_file_inuse(struct nlm_file *file)\n"
+ "  * Loop over all files in the file table.\n"
+ "  */\n"
+ " static int\n"
+ "-nlm_traverse_files(struct nlm_host *host, nlm_host_match_fn_t match)\n"
+ "+nlm_traverse_files(void *data, nlm_host_match_fn_t match,\n"
+ "+\t\tint (*is_failover_file)(void *data, struct nlm_file *file))\n"
+ " {\n"
+ " \tstruct hlist_node *pos, *next;\n"
+ " \tstruct nlm_file\t*file;\n"
+ "@@ -244,8 +256,17 @@ nlm_traverse_files(struct nlm_host *host\n"
+ " \n"
+ " \t\t\t/* Traverse locks, blocks and shares of this file\n"
+ " \t\t\t * and update file->f_locks count */\n"
+ "-\t\t\tif (nlm_inspect_file(host, file, match))\n"
+ "-\t\t\t\tret = 1;\n"
+ "+\n"
+ "+\t\t\tif (likely(is_failover_file == NULL) ||\n"
+ "+\t\t\t\tis_failover_file(data, file)) {\n"
+ "+\t\t\t\t/*\n"
+ "+\t\t\t\t *  Note that nlm_inspect_file updates f_locks\n"
+ "+\t\t\t\t *  and ret is the number of files that can't\n"
+ "+\t\t\t\t *  be unlocked.\n"
+ "+\t\t\t\t */\n"
+ "+\t\t\t\tret += nlm_inspect_file(data, file, match);\n"
+ "+\t\t\t} else\n"
+ "+\t\t\t\tfile->f_locks = nlm_file_inuse(file);\n"
+ " \n"
+ " \t\t\tmutex_lock(&nlm_file_mutex);\n"
+ " \t\t\tfile->f_count--;\n"
+ "@@ -337,7 +358,7 @@ void\n"
+ " nlmsvc_mark_resources(void)\n"
+ " {\n"
+ " \tdprintk(\"lockd: nlmsvc_mark_resources\\n\");\n"
+ "-\tnlm_traverse_files(NULL, nlmsvc_mark_host);\n"
+ "+\tnlm_traverse_files(NULL, nlmsvc_mark_host, NULL);\n"
+ " }\n"
+ " \n"
+ " /*\n"
+ "@@ -348,7 +369,7 @@ nlmsvc_free_host_resources(struct nlm_ho\n"
+ " {\n"
+ " \tdprintk(\"lockd: nlmsvc_free_host_resources\\n\");\n"
+ " \n"
+ "-\tif (nlm_traverse_files(host, nlmsvc_same_host)) {\n"
+ "+\tif (nlm_traverse_files(host, nlmsvc_same_host, NULL)) {\n"
+ " \t\tprintk(KERN_WARNING\n"
+ " \t\t\t\"lockd: couldn't remove all locks held by %s\\n\",\n"
+ " \t\t\thost->h_name);\n"
+ "@@ -368,5 +389,36 @@ nlmsvc_invalidate_all(void)\n"
+ " \t * turn, which is about as inefficient as it gets.\n"
+ " \t * Now we just do it once in nlm_traverse_files.\n"
+ " \t */\n"
+ "-\tnlm_traverse_files(NULL, nlmsvc_is_client);\n"
+ "+\tnlm_traverse_files(NULL, nlmsvc_is_client, NULL);\n"
+ "+}\n"
+ "+\n"
+ "+static int\n"
+ "+nlmsvc_failover_file_ok_path(void *datap, struct nlm_file *file)\n"
+ "+{\n"
+ "+\tstruct nameidata *nd = datap;\n"
+ "+\treturn nd->mnt == file->f_file->f_path.mnt;\n"
+ "+}\n"
+ "+\n"
+ "+int\n"
+ "+nlmsvc_failover_path(struct nameidata *nd)\n"
+ "+{\n"
+ "+\treturn nlm_traverse_files(nd, nlmsvc_always_match,\n"
+ "+\t\t\tnlmsvc_failover_file_ok_path);\n"
+ "+}\n"
+ "+EXPORT_SYMBOL_GPL(nlmsvc_failover_path);\n"
+ "+\n"
+ "+static int\n"
+ "+nlmsvc_failover_file_ok_ip(void *datap, struct nlm_file *file)\n"
+ "+{\n"
+ "+\t__be32 *server_addr = datap;\n"
+ "+\n"
+ "+\treturn file->f_iaddr.addr.s_addr == *server_addr;\n"
+ "+}\n"
+ "+\n"
+ "+int\n"
+ "+nlmsvc_failover_ip(__be32 server_addr)\n"
+ "+{\n"
+ "+\treturn nlm_traverse_files(&server_addr, nlmsvc_always_match,\n"
+ "+\t\t\tnlmsvc_failover_file_ok_ip);\n"
+ " }\n"
+ "+EXPORT_SYMBOL_GPL(nlmsvc_failover_ip);\n"
+ "--- linux-o/include/linux/lockd/lockd.h\t2008-01-04 10:01:08.000000000 -0500\n"
+ "+++ linux/include/linux/lockd/lockd.h\t2008-01-15 11:13:04.000000000 -0500\n"
+ "@@ -113,6 +113,7 @@ struct nlm_file {\n"
+ " \tunsigned int\t\tf_locks;\t/* guesstimate # of locks */\n"
+ " \tunsigned int\t\tf_count;\t/* reference count */\n"
+ " \tstruct mutex\t\tf_mutex;\t/* avoid concurrent access */\n"
+ "+\tunion svc_addr_u\tf_iaddr;\t/* server ip for failover */\n"
+ " };\n"
+ " \n"
+ " /*\n"
+ "@@ -214,6 +215,12 @@ void\t\t  nlmsvc_mark_resources(void);\n"
+ " void\t\t  nlmsvc_free_host_resources(struct nlm_host *);\n"
+ " void\t\t  nlmsvc_invalidate_all(void);\n"
+ " \n"
+ "+/*\n"
+ "+ * Cluster failover support\n"
+ "+ */\n"
+ "+int           nlmsvc_failover_path(struct nameidata *nd);\n"
+ "+int           nlmsvc_failover_ip(__be32 server_addr);\n"
+ "+\n"
+ " static __inline__ struct inode *\n"
+ " nlmsvc_file_inode(struct nlm_file *file)\n"
+  {
 
-c0aa007723797bbaf27b4b42d90f298b29c0e98fb5fcc46ff5bd184991f54162
+f5faf59c796ec81994776fbb47a982e28396a40bc6014218fedb4e008190648a

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.