From: "J. Bruce Fields" <bfields@fieldses.org>
To: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Jeff Layton <jlayton@poochiereds.net>,
"Kirill A. Shutemov" <kirill@shutemov.name>,
linux-fsdevel <linux-fsdevel@vger.kernel.org>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
Christoph Hellwig <hch@lst.de>,
Dave Chinner <david@fromorbit.com>,
Sasha Levin <sasha.levin@oracle.com>
Subject: Re: [GIT PULL] please pull file-locking related changes for v3.20
Date: Tue, 17 Feb 2015 14:08:44 -0500 [thread overview]
Message-ID: <20150217190844.GC27900@fieldses.org> (raw)
In-Reply-To: <CA+55aFxCo82EuWjFjri+VYwRr65sO-cRBn+ZJupBMd13PmgEOQ@mail.gmail.com>
On Mon, Feb 16, 2015 at 11:24:03AM -0800, Linus Torvalds wrote:
> On Mon, Feb 16, 2015 at 10:46 AM, Linus Torvalds
> <torvalds@linux-foundation.org> wrote:
> >
> > This code is so broken that my initial reaction is "We need to just
> > revert the crap".
>
> How the hell is flock_lock_file() supposed to work at all, btw?
>
> Say we have an existing flock, and now do a new one that conflicts. I
> see what looks like three separate bugs.
>
> - We go through the first loop, find a lock of another type, and
> delete it in preparation for replacing it
>
> - we *drop* the lock context spinlock.
>
> - BUG #1? So now there is no lock at all, and somebody can come in
> and see that unlocked state. Is that really valid?
>
> - another thread comes in while the first thread dropped the lock
> context lock, and wants to add its own lock. It doesn't see the
> deleted or pending locks, so it just adds it
>
> - the first thread gets the context spinlock again, and adds the lock
> that replaced the original
>
> - BUG #2? So now there are *two* locks on the thing, and the next
> time you do an unlock (or when you close the file), it will only
> remove/replace the first one.
>
> Both of those bugs are due to the whole "drop the lock in the middle",
> which is pretty much always a mistake. BUG#2 could easily explain the
> warning Kirill reports, afaik.
>
> BUG#3 seems to be independent, and is about somebody replacing an
> existing lock, but the new lock conflicts. Again, the first loop will
> remove the old lock, and then the second loop will see the conflict,
> and return an error (and we may then end up waiting for it for the
> FILE_LOCK_DEFERRED case). Now the original lock is gone. Is that
> really right? That sounds bogus. *Failing* to insert a flock causing
> the old flock to go away?
>From flock(2):
Converting a lock (shared to exclusive, or vice versa) is not
guaranteed to be atomic: the existing lock is first removed,
and then a new lock is established. Between these two steps, a
pending lock request by another process may be granted, with
the result that the conversion either blocks, or fails if
LOCK_NB was specified.
I also checked Michael Kerrisk's book quickly and see similar language
plus "... the conversion will fail and the process will lose its
original lock".
I don't have a quick way to check BSD, but it looks to me like this is
the way Linux has always behaved.
I agree that it's weird, but I think it's what we're stuck with.
--b.
next prev parent reply other threads:[~2015-02-17 19:08 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-09 10:55 [GIT PULL] please pull file-locking related changes for v3.20 Jeff Layton
2015-02-16 13:32 ` Kirill A. Shutemov
2015-02-16 14:00 ` Jeff Layton
2015-02-16 18:46 ` Linus Torvalds
2015-02-16 19:24 ` Linus Torvalds
2015-02-16 19:59 ` Jeff Layton
2015-02-17 0:02 ` Jeff Layton
2015-02-17 0:21 ` Linus Torvalds
2015-02-17 0:35 ` Jeff Layton
2015-02-17 19:08 ` J. Bruce Fields [this message]
2015-02-17 19:13 ` Linus Torvalds
2015-02-17 19:27 ` Jeff Layton
2015-02-17 19:41 ` Linus Torvalds
2015-02-17 19:45 ` J. Bruce Fields
2015-02-17 20:12 ` Jeff Layton
2015-02-17 20:17 ` Linus Torvalds
2015-02-17 19:29 ` Linus Torvalds
2015-02-26 11:00 ` One Thousand Gnomes
2015-02-26 14:45 ` J. Bruce Fields
2015-02-26 15:09 ` 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=20150217190844.GC27900@fieldses.org \
--to=bfields@fieldses.org \
--cc=david@fromorbit.com \
--cc=hch@lst.de \
--cc=jlayton@poochiereds.net \
--cc=kirill@shutemov.name \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=sasha.levin@oracle.com \
--cc=torvalds@linux-foundation.org \
/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).