From: Marc Eshel <eshel@almaden.ibm.com>
To: David Teigland <teigland@redhat.com>
Cc: "J. Bruce Fields" <bfields@fieldses.org>,
linux-fsdevel@vger.kernel.org, nfs@lists.sourceforge.net
Subject: Re: [PATCH 10/10] gfs2: nfs lock support for gfs2
Date: Wed, 06 Dec 2006 22:47:46 -0800 [thread overview]
Message-ID: <4577B912.2030500@almaden.ibm.com> (raw)
In-Reply-To: <20061206205822.GB25322@redhat.com>
Here is a rewrite of gdlm_plock_callback(). We still need to add the
lock cancel.
Marc.
int gdlm_plock_callback(struct plock_op *op)
{
struct file *file;
struct file_lock *fl;
int (*notify)(void *, void *, int) = NULL;
int rv;
spin_lock(&ops_lock);
if (!list_empty(&op->list)) {
printk(KERN_INFO "plock op on list\n");
list_del(&op->list);
}
spin_unlock(&ops_lock);
rv = op->info.rv;
/* check if the following 2 are still valid or make a copy */
file = op->info.file;
fl = op->info.fl;
notify = op->info.callback;
if (!rv) { /* got fs lock */
rv = posix_lock_file(file, fl);
if (rv) { /* did not get posix lock */
notify(fl, NULL, rv);
log_error("gdlm_plock: vfs lock error file %p fl %p",
file, fl);
/* XXX: We need to cancel the fs lock here: */
printk("gfs2 lock posix lock request failed\n");
}
else { /* got posix lock */
if (notify(fl, NULL, 0)) {
/* XXX: We need to cancel the fs lock here: */
printk("gfs2 lock granted after lock request failed;
dangling lock!\n");
}
}
}
else { /* did not get fs lock */
notify(fl, NULL, rv);
}
kfree(op);
return rv;
}
David Teigland wrote:
>On Wed, Dec 06, 2006 at 02:57:22PM -0500, J. Bruce Fields wrote:
>
>
>>On Wed, Dec 06, 2006 at 09:49:51AM -0600, David Teigland wrote:
>>
>>
>>>The gfs side looks fine to me. Did you forget to call fl_notify from
>>>gdlm_plock_callback() or am I missing something?
>>>
>>>
>>Yes, looks like we missed something, thanks. This code's an rfc (not
>>even tested), so don't apply it yet! What we should have there is
>>something like:
>>
>> rv = op->info.rv;
>>
>> if (fl_notify(fl, NULL, rv)) {
>> /* XXX: We need to cancel the lock here: */
>> printk("gfs2 lock granted after lock request failed; dangling lock!\n");
>> }
>>
>> if (!rv) {
>> /* check if the following are still valid or make a copy */
>> file = op->info.file;
>> fl = op->info.fl;
>>
>> if (posix_lock_file_wait(file, fl) < 0)
>> log_error("gdlm_plock: vfs lock error file %p fl %p",
>> file, fl);
>> }
>>
>>Note there's a race condition--that calls fl_notify before actually
>>getting the lock locally. I don't *think* that's a problem, as long as
>>it's the filesystem and not the local lock list that's authoritative
>>when it comes to who gets a posix lock.
>>
>>
>
>agree
>
>
>
>>The more annoying problem is the need to cancel the GFS lock when
>>fl_notify fails; is that something that it's possible for GFS to do?
>>
>>It can fail because lockd has a timeout--it waits a few seconds for the
>>callback, then gives up and returns a failure to the user. If that
>>happens after your userspace posix lock manager acquires the lock (but
>>before fl_notify is called) then you've got to cancel it somehow.
>>
>>
>
>I'd think we could just send an unlock for it at that point. Set up an op
>with GDLM_PLOCK_OP_UNLOCK and the same fields as the lock you're removing
>and call send_op(). We probably need to flag this internal-unlock op so
>that when the result arrives, device_write() delists and frees it itself.
>
>(I wouldn't call this "canceling", I think of cancel as trying to force a
>blocked request to return/fail prematurely.)
>
>Dave
>
>
>
next prev parent reply other threads:[~2006-12-07 6:50 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-06 5:34 asynchronous locks for cluster exports J. Bruce Fields
[not found] ` <8eb625184e6025f7f3d081dfe0a805abdd62a068.1165380892.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 1/10] lockd: add new export operation for nfsv4/lockd locking J. Bruce Fields
2006-12-06 5:34 ` J. Bruce Fields
2006-12-09 5:53 ` Wendy Cheng
2006-12-10 18:31 ` J. Bruce Fields
[not found] ` <cc7b88076df17bb41ac5d536de174b44eda6b73c.1165380893.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 2/10] nfsd4: Convert NFSv4 to new lock interface J. Bruce Fields
2006-12-06 5:34 ` J. Bruce Fields
[not found] ` <610c7d52f6363606200fa1016804e7116d580c36.1165380893.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 3/10] lockd: request deferral routine J. Bruce Fields
2006-12-06 5:34 ` J. Bruce Fields
[not found] ` <665bfdae3a5b77bb7755f4735069b7188f815d89.1165380893.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 4/10] locks: add fl_notify arguments J. Bruce Fields
2006-12-06 5:34 ` J. Bruce Fields
[not found] ` <e9e7fa0047137e5c988edaacc3dc70a84eb02efb.1165380893.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 5/10] lockd: handle fl_notify callbacks J. Bruce Fields
2006-12-06 5:34 ` J. Bruce Fields
[not found] ` <b24eab1e47a44c1855d47d54b2858a7e5c2d4653.1165380893.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 6/10] lockd: pass cookie in nlmsvc_testlock J. Bruce Fields
2006-12-06 5:34 ` J. Bruce Fields
[not found] ` <c214e0a0062abdbb72f0810c25ab7688e51b4dbd.1165380893.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 7/10] lockd: handle test_lock deferrals J. Bruce Fields
2006-12-06 5:34 ` J. Bruce Fields
[not found] ` <aee338c430e7f0a9afe63ea80d0278b97b01eeee.1165380893.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 8/10] lockd: always preallocate block in nlmsvc_lock() J. Bruce Fields
2006-12-06 5:34 ` J. Bruce Fields
[not found] ` <4fbe0004219a67cb6da4d1b3a1cfd16a9cb09ed7.1165380893.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 9/10] lockd: add code to handle deferred lock requests J. Bruce Fields
2006-12-06 5:34 ` J. Bruce Fields
[not found] ` <70549752c06e54117024429649fd7aa813f21bec.1165380893.git.bfields@citi.umich.edu>
2006-12-06 5:34 ` [PATCH 10/10] gfs2: nfs lock support for gfs2 J. Bruce Fields
2006-12-06 6:00 ` [NFS] " Wendy Cheng
2006-12-06 13:26 ` Wendy Cheng
2006-12-06 5:34 ` J. Bruce Fields
2006-12-06 12:02 ` Steven Whitehouse
2006-12-06 15:49 ` David Teigland
2006-12-06 19:57 ` J. Bruce Fields
2006-12-06 20:08 ` [NFS] " J. Bruce Fields
2006-12-06 20:58 ` David Teigland
2006-12-06 21:23 ` J. Bruce Fields
2006-12-06 21:42 ` David Teigland
2006-12-06 22:00 ` [NFS] " J. Bruce Fields
2006-12-07 15:30 ` David Teigland
2006-12-08 17:35 ` [NFS] " J. Bruce Fields
2006-12-07 6:47 ` Marc Eshel [this message]
2006-12-07 15:23 ` J. Bruce Fields
2006-12-07 15:43 ` [NFS] " Marc Eshel
2006-12-07 16:21 ` J. Bruce Fields
2006-12-07 18:52 ` [NFS] " Trond Myklebust
2006-12-14 23:04 ` [PATCH 1/10] lockd: add new export operation for nfsv4/lockd locking J. Bruce Fields
2006-12-15 5:52 ` Marc Eshel
2006-12-15 7:40 ` Christoph Hellwig
2006-12-07 16:51 ` asynchronous locks for cluster exports Christoph Hellwig
2006-12-14 22:51 ` J. Bruce Fields
2006-12-15 19:51 ` J. Bruce Fields
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=4577B912.2030500@almaden.ibm.com \
--to=eshel@almaden.ibm.com \
--cc=bfields@fieldses.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=nfs@lists.sourceforge.net \
--cc=teigland@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).