diff for duplicates of <478F7DE4.30404@redhat.com> diff --git a/a/1.txt b/N1/1.txt index a9db8c1..b5802de 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -4,11 +4,3 @@ Wendy Cheng wrote: > in the Documentation directory. Sorry, forgot to attach the patch. Here it is ... Wendy - --------------- next part -------------- -A non-text attachment was scrubbed... -Name: unlock_v4.patch -Type: text/x-patch -Size: 8610 bytes -Desc: not available -URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20080117/ea248495/attachment.bin> diff --git a/N1/2.hdr b/N1/2.hdr new file mode 100644 index 0000000..918d8ef --- /dev/null +++ b/N1/2.hdr @@ -0,0 +1,5 @@ +Content-Type: text/x-patch; + name="unlock_v4.patch" +Content-Transfer-Encoding: 7bit +Content-Disposition: inline; + filename="unlock_v4.patch" diff --git a/N1/2.txt b/N1/2.txt new file mode 100644 index 0000000..7e250a4 --- /dev/null +++ b/N1/2.txt @@ -0,0 +1,296 @@ +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 + +The expected sequence of events can be: +1. Tear down the IP address +2. Unexport the path +3. Write IP to /proc/fs/nfsd/unlock_ip to unlock files +4. If unmount required, write path name to + /proc/fs/nfsd/unlock_filesystem, then unmount. +5. Signal peer to begin take-over. + +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 c05677c..59c04d8 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -12,24 +12,319 @@ "ref\0478F78E8.40601@redhat.com\0" "ref\0478F7D96.1060602@redhat.com\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\0Thu, 17 Jan 2008 11:10:12 -0500\0" - "To\0cluster-devel.redhat.com\0" - "\00:1\0" + "To\0J. Bruce Fields <bfields@fieldses.org>\0" + "Cc\0Neil Brown <neilb@suse.de>" + Christoph Hellwig <hch@infradead.org> + NFS list <linux-nfs@vger.kernel.org> + " cluster-devel@redhat.com\0" + "\01:1\0" "b\0" "Wendy Cheng wrote:\n" "> Add a more detailed description into the top of the patch itself. I'm \n" "> working on the resume patch now - it will include an overall write-up \n" "> in the Documentation directory.\n" "\n" - "Sorry, forgot to attach the patch. Here it is ... Wendy\n" + Sorry, forgot to attach the patch. Here it is ... Wendy + "\01:2\0" + "fn\0unlock_v4.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" + "The expected sequence of events can be:\n" + "1. Tear down the IP address\n" + "2. Unexport the path\n" + "3. Write IP to /proc/fs/nfsd/unlock_ip to unlock files\n" + "4. If unmount required, write path name to \n" + " /proc/fs/nfsd/unlock_filesystem, then unmount.\n" + "5. Signal peer to begin take-over. \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_v4.patch\n" - "Type: text/x-patch\n" - "Size: 8610 bytes\n" - "Desc: not available\n" - URL: <http://listman.redhat.com/archives/cluster-devel/attachments/20080117/ea248495/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" + { -c942a1a5aa7546171ca64c188cfc34df8480f2bdb5e1e3377043654423e830cc +894b09c6a7016a231df67435ec9c0c3c57053aea1934a38f0436e26f2dc023a3
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.