Re: [PATCH 0/5] fuse: handle release synchronously (v4)
From: Maxim Patlasov
Date: Thu Oct 16 2014 - 06:31:31 EST
Hi Miklos,
On 10/09/2014 12:14 PM, Miklos Szeredi wrote:
On Wed, Oct 1, 2014 at 1:28 PM, Maxim Patlasov <mpatlasov@xxxxxxxxxxxxx> wrote:
Given those patches must die, do you have any ideas how to resolve that
"spurious EBUSY" problem?
Check the "sync_release" branch of fuse:
git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git sync_release
And same branch name for libfuse:
git://git.code.sf.net/p/fuse/fuse sync_release
What it does is send RELEASE from ->flush() after checking the
refcount of file (being careful about RCU accesses).
Lightly tested, more testing, as well as review, is welcome.
Thank you very much for efforts, highly appreciated! I've had a close
look at your patches and found a few issues. Most of them can be easily
fixed, but one puzzles me: the way how you detect last flush is not race
free. Something as simple as:
int main(int argc, char *argv[])
{
int fd = open(argv[1], O_RDWR);
fork();
}
may easily dive into fuse_try_sync_release() concurrently and both
observe file->f_count == 2. Then both return falling back to sending the
release asynchronously. This makes sync/async behaviour unpredictable
even for well-behaved applications which don't do any esoteric things
like racing i/o with close or exiting while a descriptor is in-flight in
a unix domain socket.
I cannot see any way to recognise last flush without help of VFS layer,
can you?
Thanks,
Maxim
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/