fuse: call fuse_abort_conn() in dev release
authorMiklos Szeredi <mszeredi@suse.cz>
Wed, 1 Jul 2015 14:25:57 +0000 (16:25 +0200)
committerMiklos Szeredi <mszeredi@suse.cz>
Wed, 1 Jul 2015 14:25:57 +0000 (16:25 +0200)
fuse_abort_conn() does all the work done by fuse_dev_release() and more.
"More" consists of:

end_io_requests(fc);
wake_up_all(&fc->waitq);
kill_fasync(&fc->fasync, SIGIO, POLL_IN);

All of which should be no-op (WARN_ON's added).

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

index de110de881f7274d397060428d798813199d1c6d..e5901bf8d600d527c414a1e6446ff838825922ff 100644 (file)
@@ -2199,14 +2199,9 @@ int fuse_dev_release(struct inode *inode, struct file *file)
 {
        struct fuse_conn *fc = fuse_get_conn(file);
        if (fc) {
-               spin_lock(&fc->lock);
-               fc->connected = 0;
-               fc->blocked = 0;
-               fuse_set_initialized(fc);
-               end_queued_requests(fc);
-               end_polls(fc);
-               wake_up_all(&fc->blocked_waitq);
-               spin_unlock(&fc->lock);
+               WARN_ON(!list_empty(&fc->io));
+               WARN_ON(fc->fasync != NULL);
+               fuse_abort_conn(fc);
                fuse_conn_put(fc);
        }