diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2013-10-04 05:21:39 +0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-10-25 07:45:13 +0400 |
commit | dd3e2c55a45fe75f3213b17b74f9a32380f4e84b (patch) | |
tree | e422d9dda0c7e3bde8bb0fa7026730ef7b0a96f4 | |
parent | 1adfcb03e31ba0d6be5fddf773da4357d0792cbb (diff) | |
download | linux-dd3e2c55a45fe75f3213b17b74f9a32380f4e84b.tar.xz |
fuse: rcu-delay freeing fuse_conn
makes ->permission() and ->d_revalidate() safety in RCU mode independent
from vfsmount_lock.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/fuse/cuse.c | 2 | ||||
-rw-r--r-- | fs/fuse/fuse_i.h | 2 | ||||
-rw-r--r-- | fs/fuse/inode.c | 2 |
3 files changed, 4 insertions, 2 deletions
diff --git a/fs/fuse/cuse.c b/fs/fuse/cuse.c index adbfd66b380f..8ca88d716dd3 100644 --- a/fs/fuse/cuse.c +++ b/fs/fuse/cuse.c @@ -473,7 +473,7 @@ err: static void cuse_fc_release(struct fuse_conn *fc) { struct cuse_conn *cc = fc_to_cc(fc); - kfree(cc); + kfree_rcu(cc, fc.rcu); } /** diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index fe446c222e3f..4715674f050c 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -377,6 +377,8 @@ struct fuse_conn { /** Refcount */ atomic_t count; + struct rcu_head rcu; + /** The user id for this mount */ kuid_t user_id; diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 1c15613c64f8..d468643a68b2 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c @@ -918,7 +918,7 @@ static void fuse_send_init(struct fuse_conn *fc, struct fuse_req *req) static void fuse_free_conn(struct fuse_conn *fc) { - kfree(fc); + kfree_rcu(fc, rcu); } static int fuse_bdi_init(struct fuse_conn *fc, struct super_block *sb) |