<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux-toradex.git/fs/fuse/fuse_i.h, branch v4.4.124</title>
<subtitle>Linux kernel for Apalis and Colibri modules</subtitle>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/'/>
<entry>
<title>fuse: Add reference counting for fuse_io_priv</title>
<updated>2016-04-12T16:08:58+00:00</updated>
<author>
<name>Seth Forshee</name>
<email>seth.forshee@canonical.com</email>
</author>
<published>2016-03-11T16:35:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=37bd8c883ea5f3b90ae1788a1f76c93cb0dbeba5'/>
<id>37bd8c883ea5f3b90ae1788a1f76c93cb0dbeba5</id>
<content type='text'>
commit 744742d692e37ad5c20630e57d526c8f2e2fe3c9 upstream.

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")
Signed-off-by: Seth Forshee &lt;seth.forshee@canonical.com&gt;
Signed-off-by: Miklos Szeredi &lt;mszeredi@redhat.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit 744742d692e37ad5c20630e57d526c8f2e2fe3c9 upstream.

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")
Signed-off-by: Seth Forshee &lt;seth.forshee@canonical.com&gt;
Signed-off-by: Miklos Szeredi &lt;mszeredi@redhat.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>fuse: separate pqueue for clones</title>
<updated>2015-07-01T14:26:09+00:00</updated>
<author>
<name>Miklos Szeredi</name>
<email>mszeredi@suse.cz</email>
</author>
<published>2015-07-01T14:26:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=c3696046beb3a4479715b48f67f6a8a3aef4b3bb'/>
<id>c3696046beb3a4479715b48f67f6a8a3aef4b3bb</id>
<content type='text'>
Make each fuse device clone refer to a separate processing queue.  The only
constraint on userspace code is that the request answer must be written to
the same device clone as it was read off.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Make each fuse device clone refer to a separate processing queue.  The only
constraint on userspace code is that the request answer must be written to
the same device clone as it was read off.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>fuse: introduce per-instance fuse_dev structure</title>
<updated>2015-07-01T14:26:08+00:00</updated>
<author>
<name>Miklos Szeredi</name>
<email>mszeredi@suse.cz</email>
</author>
<published>2015-07-01T14:26:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=cc080e9e9be16ccf26135d366d7d2b65209f1d56'/>
<id>cc080e9e9be16ccf26135d366d7d2b65209f1d56</id>
<content type='text'>
Allow fuse device clones to refer to be distinguished.  This patch just
adds the infrastructure by associating a separate "struct fuse_dev" with
each clone.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Allow fuse device clones to refer to be distinguished.  This patch just
adds the infrastructure by associating a separate "struct fuse_dev" with
each clone.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>fuse: add req flag for private list</title>
<updated>2015-07-01T14:26:06+00:00</updated>
<author>
<name>Miklos Szeredi</name>
<email>mszeredi@suse.cz</email>
</author>
<published>2015-07-01T14:26:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=77cd9d488b32d19be852ad4d310ef13701557d61'/>
<id>77cd9d488b32d19be852ad4d310ef13701557d61</id>
<content type='text'>
When an unlocked request is aborted, it is moved from fpq-&gt;io to a private
list.  Then, after unlocking fpq-&gt;lock, the private list is processed and
the requests are finished off.

To protect the private list, we need to mark the request with a flag, so if
in the meantime the request is unlocked the list is not corrupted.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
When an unlocked request is aborted, it is moved from fpq-&gt;io to a private
list.  Then, after unlocking fpq-&gt;lock, the private list is processed and
the requests are finished off.

To protect the private list, we need to mark the request with a flag, so if
in the meantime the request is unlocked the list is not corrupted.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>fuse: pqueue locking</title>
<updated>2015-07-01T14:26:06+00:00</updated>
<author>
<name>Miklos Szeredi</name>
<email>mszeredi@suse.cz</email>
</author>
<published>2015-07-01T14:26:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=45a91cb1a4fd9bb0e53c95e3dc9185dd5b5ba245'/>
<id>45a91cb1a4fd9bb0e53c95e3dc9185dd5b5ba245</id>
<content type='text'>
Add a fpq-&gt;lock for protecting members of struct fuse_pqueue and FR_LOCKED
request flag.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add a fpq-&gt;lock for protecting members of struct fuse_pqueue and FR_LOCKED
request flag.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>fuse: duplicate -&gt;connected in pqueue</title>
<updated>2015-07-01T14:26:04+00:00</updated>
<author>
<name>Miklos Szeredi</name>
<email>mszeredi@suse.cz</email>
</author>
<published>2015-07-01T14:26:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=e96edd94d0887707fc41c5d21d5b488edcd31689'/>
<id>e96edd94d0887707fc41c5d21d5b488edcd31689</id>
<content type='text'>
This will allow checking -&gt;connected just with the processing queue lock.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This will allow checking -&gt;connected just with the processing queue lock.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>fuse: separate out processing queue</title>
<updated>2015-07-01T14:26:04+00:00</updated>
<author>
<name>Miklos Szeredi</name>
<email>mszeredi@suse.cz</email>
</author>
<published>2015-07-01T14:26:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=3a2b5b9cd9610f789f5e5f91a010d9fa3ca78632'/>
<id>3a2b5b9cd9610f789f5e5f91a010d9fa3ca78632</id>
<content type='text'>
This is just two fields: fc-&gt;io and fc-&gt;processing.

This patch just rearranges the fields, no functional change.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This is just two fields: fc-&gt;io and fc-&gt;processing.

This patch just rearranges the fields, no functional change.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>fuse: duplicate -&gt;connected in iqueue</title>
<updated>2015-07-01T14:26:01+00:00</updated>
<author>
<name>Miklos Szeredi</name>
<email>mszeredi@suse.cz</email>
</author>
<published>2015-07-01T14:26:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=e16714d8756dc1237a66994e139b61feebcf707a'/>
<id>e16714d8756dc1237a66994e139b61feebcf707a</id>
<content type='text'>
This will allow checking -&gt;connected just with the input queue lock.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This will allow checking -&gt;connected just with the input queue lock.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>fuse: separate out input queue</title>
<updated>2015-07-01T14:26:01+00:00</updated>
<author>
<name>Miklos Szeredi</name>
<email>mszeredi@suse.cz</email>
</author>
<published>2015-07-01T14:26:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=f88996a93324483ff3ec027312bbacacf97a555b'/>
<id>f88996a93324483ff3ec027312bbacacf97a555b</id>
<content type='text'>
The input queue contains normal requests (fc-&gt;pending), forgets
(fc-&gt;forget_*) and interrupts (fc-&gt;interrupts).  There's also fc-&gt;waitq and
fc-&gt;fasync for waking up the readers of the fuse device when a request is
available.

The fc-&gt;reqctr is also moved to the input queue (assigned to the request
when the request is added to the input queue.

This patch just rearranges the fields, no functional change.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The input queue contains normal requests (fc-&gt;pending), forgets
(fc-&gt;forget_*) and interrupts (fc-&gt;interrupts).  There's also fc-&gt;waitq and
fc-&gt;fasync for waking up the readers of the fuse device when a request is
available.

The fc-&gt;reqctr is also moved to the input queue (assigned to the request
when the request is added to the input queue.

This patch just rearranges the fields, no functional change.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
Reviewed-by: Ashish Samant &lt;ashish.samant@oracle.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>fuse: req state use flags</title>
<updated>2015-07-01T14:26:01+00:00</updated>
<author>
<name>Miklos Szeredi</name>
<email>mszeredi@suse.cz</email>
</author>
<published>2015-07-01T14:26:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.toradex.cn/cgit/linux-toradex.git/commit/?id=33e14b4dfdc477344efbcd9b4218f2b350f0f893'/>
<id>33e14b4dfdc477344efbcd9b4218f2b350f0f893</id>
<content type='text'>
Use flags for representing the state in fuse_req.  This is needed since
req-&gt;list will be protected by different locks in different states, hence
we'll want the state itself to be split into distinct bits, each protected
with the relevant lock in that state.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Use flags for representing the state in fuse_req.  This is needed since
req-&gt;list will be protected by different locks in different states, hence
we'll want the state itself to be split into distinct bits, each protected
with the relevant lock in that state.

Signed-off-by: Miklos Szeredi &lt;mszeredi@suse.cz&gt;
</pre>
</div>
</content>
</entry>
</feed>
