From: David Jeffery <djeffery@redhat.com>
To: Trond Myklebust <trond.myklebust@primarydata.com>
Cc: Linux NFS Mailing List <linux-nfs@vger.kernel.org>
Subject: Re: [PATCH] nfs: Always try and release an NFS file lock, even after receiving a SIGKILL
Date: Thu, 21 Aug 2014 14:15:52 -0400 [thread overview]
Message-ID: <53F63758.70306@redhat.com> (raw)
In-Reply-To: <CAHQdGtRw0V=mAuXs=UL7aJxxvKo26xqVoyOwR7r+9PrGPNmn_g@mail.gmail.com>
On 08/21/2014 11:50 AM, Trond Myklebust wrote:
> On Thu, Aug 21, 2014 at 11:40 AM, David Jeffery <djeffery@redhat.com> wrote:
>> On 08/20/2014 08:28 PM, Trond Myklebust wrote:
>>>
>>> What guarantees that this does not lead to silent corruption of the file
>>> if there are outstanding write requests?
>>>
>>
>> Do you have a particular scenario in mind you are concerned about?
>>
>> Right before the code the patch modifies, nfs_sync_mapping() is called.
>> Any writes started before the unlock operation began have already been
>> flushed, so we shouldn't have a corruption case of writes from before
>> the unlock began being sent after the unlock is complete.
>>
>> Are you concerned about some other nfs4 writes being started while we
>> initially waited on the counter? Such a write racing with the unlock
>
> No. I'm worried about the writes that have been started, but which are
> now completing in the background while the lock is being freed.
>
>> going ahead instead of erroring out could initially fail from a wrong
>> state ID, but should retry with the new state. Is there something I've
>> overlooked?
>
> Loss of lock atomicity due to the fact that the writes are completing
> after the lock was released.
>
I don't think my patches break lock atomicity, unless I've completely
misunderstood nfs_sync_mapping()'s behavior.
The background writes should have already been waited for by
nfs_sync_mapping() at the beginning of do_unlk(). nfs_sync_mapping()
would call nfs_wb_all() which calls sync_inode() with WB_SYNC_ALL, so
it's going to push out any dirty data and wait for any writes to
complete. Only after the writes are complete do we go on to call
nfs_iocounter_wait().
If there is a write causing us to want to wait in nfs_iocounter_wait()
and which my patches no longer wait for, the write was done after
nfs_sync_mapping() started, which means the write occurred after the
unlock-initiating call began. Such a write should have no atomicity
guarantee with holding the lock, and may complete before or after the
lock is released. The writes which require atomicity are already
completed before getting to the call of nfs_iocounter_wait() and the
code my patch changes.
next prev parent reply other threads:[~2014-08-21 18:19 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1136742914.14501494.1407251366067.JavaMail.zimbra@redhat.com>
2014-08-05 15:17 ` [PATCH] nfs: Always try and release an NFS file lock, even after receiving a SIGKILL David Jeffery
2014-08-21 0:28 ` Trond Myklebust
2014-08-21 15:40 ` David Jeffery
2014-08-21 15:50 ` Trond Myklebust
2014-08-21 18:15 ` David Jeffery [this message]
2014-08-21 18:41 ` Trond Myklebust
2014-08-29 15:34 ` Benjamin Coddington
2014-08-29 15:51 ` Trond Myklebust
2014-08-29 16:31 ` Benjamin Coddington
2014-08-29 19:02 ` Trond Myklebust
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=53F63758.70306@redhat.com \
--to=djeffery@redhat.com \
--cc=linux-nfs@vger.kernel.org \
--cc=trond.myklebust@primarydata.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.