fuse: Add reference counting for fuse_io_priv
authorSeth Forshee <seth.forshee@canonical.com>
Fri, 11 Mar 2016 16:35:34 +0000 (10:35 -0600)
committerSasha Levin <sasha.levin@oracle.com>
Mon, 18 Apr 2016 12:50:57 +0000 (08:50 -0400)
commitbbd5f23b1eaba29f46f97846b361fab4c5becc78
tree0e772134de47d1665e1a279abfc79059448d8794
parent19167d65fabb60ff11fc5f9c4a5248c17a12f615
fuse: Add reference counting for fuse_io_priv

[ Upstream commit 744742d692e37ad5c20630e57d526c8f2e2fe3c9 ]

The 'reqs' member of fuse_io_priv serves two purposes. First is to track
the number of oustanding async requests to the server and to signal that
the io request is completed. The second is to be a reference count on the
structure to know when it can be freed.

For sync io requests these purposes can be at odds.  fuse_direct_IO() wants
to block until the request is done, and since the signal is sent when
'reqs' reaches 0 it cannot keep a reference to the object. Yet it needs to
use the object after the userspace server has completed processing
requests. This leads to some handshaking and special casing that it
needlessly complicated and responsible for at least one race condition.

It's much cleaner and safer to maintain a separate reference count for the
object lifecycle and to let 'reqs' just be a count of outstanding requests
to the userspace server. Then we can know for sure when it is safe to free
the object without any handshaking or special cases.

The catch here is that most of the time these objects are stack allocated
and should not be freed. Initializing these objects with a single reference
that is never released prevents accidental attempts to free the objects.

Fixes: 9d5722b7777e ("fuse: handle synchronous iocbs internally")
Cc: stable@vger.kernel.org # v4.1+
Signed-off-by: Seth Forshee <seth.forshee@canonical.com>
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
fs/fuse/cuse.c
fs/fuse/file.c
fs/fuse/fuse_i.h