From: "J. Bruce Fields" <bfields@fieldses.org>
To: Wendy Cheng <s.wendy.cheng@gmail.com>
Cc: Christoph Hellwig <hch@lst.de>,
nfs@lists.sourceforge.net, linux-nfs@vger.kernel.org,
Lon Hohberger <lhh@redhat.com>
Subject: Re: [PATCH] lockd: unlock lockd locks held for a certain filesystem
Date: Wed, 23 Apr 2008 17:02:27 -0400 [thread overview]
Message-ID: <20080423210227.GF8302@fieldses.org> (raw)
In-Reply-To: <480F9E6F.4070204@gmail.com>
On Wed, Apr 23, 2008 at 04:39:11PM -0400, Wendy Cheng wrote:
> #if defined(BRUCE_CHECK_THIS_OUT)
> error = nlmsvc_failover_path(nd.path.mnt->mnt_sb);
> #else
> error = nlmsvc_failover_path(nd.mnt->mnt_sb);
> #endif
The vfsmount and dentry got moved into the path argument sometime in the
last kernel version or so. Is there a macro defining the latter as a
shortcut for the former? I didn't see one.
--b.
>
> -- Wendy
>
> ---------- based on the following email ----------------------------
>
> J. Bruce Fields wrote:
>> On Wed, Apr 23, 2008 at 09:44:22AM +0200, Christoph Hellwig wrote:
>>
>>> Please don't pass down the nameidata, but just the super_block. That's
>>> all we need in the lower layer functions.
>>>
>>
>> Yep, I agree that's nicer; here's the result.
>>
>> --b.
>>
>> commit 26a816586b71877d8a84fbb436373099384e328b
>> Author: Wendy Cheng <wcheng@redhat.com>
>> Date: Thu Jan 17 11:10:12 2008 -0500
>>
>> lockd: unlock lockd locks held for a certain filesystem
>> Add /proc/fs/nfsd/unlock_filesystem, which allows e.g.:
>> shell> echo /mnt/sfs1 > /proc/fs/nfsd/unlock_filesystem
>> so that a filesystem can be unmounted before allowing a peer
>> nfsd to
>> take over nfs service for the filesystem.
>> Signed-off-by: S. Wendy Cheng <wcheng@redhat.com>
>> Cc: Lon Hohberger <lhh@redhat.com>
>> Cc: Christoph Hellwig <hch@lst.de>
>> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
>> fs/lockd/svcsubs.c | 66
>> +++++++++++++++++++++++++++++++++++++++-----
>> fs/nfsd/nfsctl.c | 65 +++++++++++++++++++++++++++++++++++++++++++
>> include/linux/lockd/lockd.h | 7 ++++
>> 3 files changed, 131 insertions(+), 7 deletions(-)
>>
>> diff --git a/fs/lockd/svcsubs.c b/fs/lockd/svcsubs.c
>> index e12daba..dcdcff6 100644
>> --- a/fs/lockd/svcsubs.c
>> +++ b/fs/lockd/svcsubs.c
>> @@ -196,6 +196,12 @@ again:
>> return 0;
>> }
>> +static int
>> +nlmsvc_always_match(void *dummy1, struct nlm_host *dummy2)
>> +{
>> + return 1;
>> +}
>> +
>> /*
>> * Inspect a single file
>> */
>> @@ -232,7 +238,8 @@ nlm_file_inuse(struct nlm_file *file)
>> * Loop over all files in the file table.
>> */
>> static int
>> -nlm_traverse_files(void *data, 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;
>> @@ -241,6 +248,8 @@ nlm_traverse_files(void *data, nlm_host_match_fn_t match)
>> mutex_lock(&nlm_file_mutex);
>> for (i = 0; i < FILE_NRHASH; i++) {
>> hlist_for_each_entry_safe(file, pos, next, &nlm_files[i], f_list) {
>> + if (is_failover_file && !is_failover_file(data, file))
>> + continue;
>> file->f_count++;
>> mutex_unlock(&nlm_file_mutex);
>> @@ -345,7 +354,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);
>> }
>> /*
>> @@ -356,7 +365,7 @@ nlmsvc_free_host_resources(struct nlm_host *host)
>> {
>> 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);
>> @@ -376,8 +385,27 @@ 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 super_block *sb = datap;
>> +
>> + return sb == file->f_file->f_path.mnt->mnt_sb;
>> +}
>> +
>> +int
>> +nlmsvc_failover_path(struct super_block *sb)
>> +{
>> + int ret;
>> +
>> + ret = nlm_traverse_files(sb, nlmsvc_always_match,
>> + nlmsvc_failover_file_ok_path);
>> + return ret ? -EIO : 0;
>> }
>> +EXPORT_SYMBOL_GPL(nlmsvc_failover_path);
>> static int
>> nlmsvc_failover_file_ok_ip(void *datap, struct nlm_host *host)
>> @@ -391,7 +419,8 @@ int
>> nlmsvc_failover_ip(__be32 server_addr)
>> {
>> int ret;
>> - ret = nlm_traverse_files(&server_addr, nlmsvc_failover_file_ok_ip);
>> + ret = nlm_traverse_files(&server_addr, nlmsvc_failover_file_ok_ip,
>> + NULL);
>> return ret ? -EIO : 0;
>> }
>> diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
>> index 02c3949..b4ca5c9 100644
>> --- a/fs/nfsd/nfsctl.c
>> +++ b/fs/nfsd/nfsctl.c
>> @@ -55,6 +55,7 @@ enum {
>> NFSD_List,
>> NFSD_Fh,
>> NFSD_FO_UnlockIP,
>> + NFSD_FO_UnlockFS,
>> NFSD_Threads,
>> NFSD_Pool_Threads,
>> NFSD_Versions,
>> @@ -92,6 +93,7 @@ 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,
>> @@ -103,6 +105,7 @@ static ssize_t (*write_op[])(struct file *, char *, size_t) = {
>> [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,
>> @@ -319,6 +322,33 @@ static ssize_t failover_unlock_ip(struct file *file, char *buf, size_t size)
>> 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.mnt->mnt_sb);
>> +
>> + path_put(&nd.path);
>> + return error;
>> +}
>> +
>> static ssize_t write_filehandle(struct file *file, char *buf, size_t size)
>> {
>> /* request is:
>> @@ -729,6 +759,8 @@ static int nfsd_fill_super(struct super_block * sb, void * data, int silent)
>> [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},
>> diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h
>> index f06d2db..7cd9c8e 100644
>> --- a/include/linux/lockd/lockd.h
>> +++ b/include/linux/lockd/lockd.h
>> @@ -220,6 +220,7 @@ void nlmsvc_invalidate_all(void);
>> /*
>> * Cluster failover support
>> */
>> +int nlmsvc_failover_path(struct super_block *sb);
>> int nlmsvc_failover_ip(__be32 server_addr);
>> static __inline__ struct inode *
>>
>
next prev parent reply other threads:[~2008-04-23 21:02 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-16 9:17 [NFS] Forcefully resetting a lock Erik Hensema / HostingXS Internet Services
[not found] ` <200804161117.24734.hensema-yolSOB3tinz/D1n+0JDH9g@public.gmane.org>
2008-04-16 11:44 ` Jeff Layton
2008-04-16 15:15 ` Wendy Cheng
2008-04-16 18:42 ` J. Bruce Fields
2008-04-16 19:39 ` Wendy Cheng
2008-04-17 21:52 ` J. Bruce Fields
2008-04-18 14:02 ` Wendy Cheng
2008-04-18 18:19 ` J. Bruce Fields
2008-04-22 23:15 ` J. Bruce Fields
2008-04-22 23:17 ` [NFS] [PATCH] lockd: unlock lockd locks associated with a given server ip J. Bruce Fields
2008-04-22 23:18 ` [NFS] [PATCH] lockd: unlock lockd locks held for a certain filesystem J. Bruce Fields
2008-04-23 2:57 ` Wendy Cheng
2008-04-23 7:44 ` Christoph Hellwig
2008-04-23 17:12 ` J. Bruce Fields
2008-04-23 17:52 ` Christoph Hellwig
2008-04-23 20:01 ` J. Bruce Fields
2008-04-23 20:39 ` Wendy Cheng
2008-04-23 21:02 ` J. Bruce Fields [this message]
2008-04-23 21:17 ` Wendy Cheng
2008-04-23 21:39 ` J. Bruce Fields
2008-04-23 21:44 ` Wendy Cheng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080423210227.GF8302@fieldses.org \
--to=bfields@fieldses.org \
--cc=hch@lst.de \
--cc=lhh@redhat.com \
--cc=linux-nfs@vger.kernel.org \
--cc=nfs@lists.sourceforge.net \
--cc=s.wendy.cheng@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.