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)
committerMiklos Szeredi <miklos@szeredi.hu>
Mon, 14 Mar 2016 14:02:51 +0000 (15:02 +0100)
commit744742d692e37ad5c20630e57d526c8f2e2fe3c9
treeef5965099fadc7d4c199a104e4715256afc53e9f
parent7cabc61e01a0a8b663bd2b4c982aa53048218734
fuse: Add reference counting for fuse_io_priv

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>
fs/fuse/cuse.c
fs/fuse/file.c
fs/fuse/fuse_i.h