summaryrefslogtreecommitdiffstats
path: root/fs/fuse/fuse_i.h
diff options
context:
space:
mode:
authorMiklos Szeredi2014-12-12 09:49:04 +0100
committerMiklos Szeredi2014-12-12 09:49:04 +0100
commitbaebccbe997d5023289e0fc9b4d0d71c6fc17a79 (patch)
tree19cb0ed831569c140cd82c8cf5bac413e4c92803 /fs/fuse/fuse_i.h
parentfuse: flush requests on umount (diff)
downloadkernel-qcow2-linux-baebccbe997d5023289e0fc9b4d0d71c6fc17a79.tar.gz
kernel-qcow2-linux-baebccbe997d5023289e0fc9b4d0d71c6fc17a79.tar.xz
kernel-qcow2-linux-baebccbe997d5023289e0fc9b4d0d71c6fc17a79.zip
fuse: hold inode instead of path after release
path_put() in release could trigger a DESTROY request in fuseblk. The possible deadlock was worked around by doing the path_put() with schedule_work(). This complexity isn't needed if we just hold the inode instead of the path. Since we now flush all requests before destroying the super block we can be sure that all held inodes will be dropped. Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'fs/fuse/fuse_i.h')
-rw-r--r--fs/fuse/fuse_i.h7
1 files changed, 2 insertions, 5 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index fbc63ab149b6..416fee2ee1bc 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -305,11 +305,8 @@ struct fuse_req {
/** Data for asynchronous requests */
union {
struct {
- union {
- struct fuse_release_in in;
- struct work_struct work;
- };
- struct path path;
+ struct fuse_release_in in;
+ struct inode *inode;
} release;
struct fuse_init_in init_in;
struct fuse_init_out init_out;