fuse: fix background request if not connected
authorMiklos Szeredi <mszeredi@suse.cz>
Wed, 1 Jul 2015 14:25:56 +0000 (16:25 +0200)
committerMiklos Szeredi <mszeredi@suse.cz>
Wed, 1 Jul 2015 14:25:56 +0000 (16:25 +0200)
request_end() expects fc->num_background and fc->active_background to have
been incremented, which is not the case in fuse_request_send_nowait()
failure path.  So instead just call the ->end() callback (which is actually
set by all callers).

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Reviewed-by: Ashish Samant <ashish.samant@oracle.com>
fs/fuse/dev.c

index c8b68ab2e574a86f13fab97f9ed47b14a4e139d6..6aa4803510e7e0df1ad2317c24d781ecd5bfbfd0 100644 (file)
@@ -604,13 +604,16 @@ static void fuse_request_send_nowait_locked(struct fuse_conn *fc,
 
 static void fuse_request_send_nowait(struct fuse_conn *fc, struct fuse_req *req)
 {
+       BUG_ON(!req->end);
        spin_lock(&fc->lock);
        if (fc->connected) {
                fuse_request_send_nowait_locked(fc, req);
                spin_unlock(&fc->lock);
        } else {
+               spin_unlock(&fc->lock);
                req->out.h.error = -ENOTCONN;
-               request_end(fc, req);
+               req->end(fc, req);
+               fuse_put_request(fc, req);
        }
 }