• M
    fuse: check connected before queueing on fpq->io · 80ef0867
    Miklos Szeredi 提交于
    A request could end up on the fpq->io list after fuse_abort_conn() has
    reset fpq->connected and aborted requests on that list:
    
    Thread-1			  Thread-2
    ========			  ========
    ->fuse_simple_request()           ->shutdown
      ->__fuse_request_send()
        ->queue_request()		->fuse_abort_conn()
    ->fuse_dev_do_read()                ->acquire(fpq->lock)
      ->wait_for(fpq->lock) 	  ->set err to all req's in fpq->io
    				  ->release(fpq->lock)
      ->acquire(fpq->lock)
      ->add req to fpq->io
    
    After the userspace copy is done the request will be ended, but
    req->out.h.error will remain uninitialized.  Also the copy might block
    despite being already aborted.
    
    Fix both issues by not allowing the request to be queued on the fpq->io
    list after fuse_abort_conn() has processed this list.
    Reported-by: NPradeep P V K <pragalla@codeaurora.org>
    Fixes: fd22d62e ("fuse: no fc->lock for iqueue parts")
    Cc: <stable@vger.kernel.org> # v4.2
    Signed-off-by: NMiklos Szeredi <mszeredi@redhat.com>
    80ef0867
dev.c 51.9 KB