]> git.karo-electronics.de Git - karo-tx-linux.git/commit
fuse: flush background queue on connection close
authorMiklos Szeredi <mszeredi@suse.cz>
Tue, 7 Sep 2010 11:42:41 +0000 (13:42 +0200)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Thu, 6 Jan 2011 23:07:41 +0000 (18:07 -0500)
commitd12738a6a29d69f00840113a93c5c55be8c6af97
treedd098f453a585f4616ef910d1dba3154ef2274c8
parent329d5e1242c4c6c0747070b0797f940b7ddb3d0b
fuse: flush background queue on connection close

commit 595afaf9e6ee1b48e13ec4b8bcc8c7dee888161a upstream.

David Bartly reported that fuse can hang in fuse_get_req_nofail() when
the connection to the filesystem server is no longer active.

If bg_queue is not empty then flush_bg_queue() called from
request_end() can put more requests on to the pending queue.  If this
happens while ending requests on the processing queue then those
background requests will be queued to the pending list and never
ended.

Another problem is that fuse_dev_release() didn't wake up processes
sleeping on blocked_waitq.

Solve this by:

 a) flushing the background queue before calling end_requests() on the
    pending and processing queues

 b) setting blocked = 0 and waking up processes waiting on
    blocked_waitq()

Thanks to David for an excellent bug report.

Reported-by: David Bartley <andareed@gmail.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
fs/fuse/dev.c