summaryrefslogtreecommitdiff
path: root/fs/ceph/inode.c
diff options
context:
space:
mode:
authorYan, Zheng <zheng.z.yan@intel.com>2013-07-24 08:22:11 +0400
committerSage Weil <sage@inktank.com>2013-08-10 04:55:32 +0400
commit6f60f889470aecf747610279545c054a99aadca3 (patch)
tree60f5781c7673d1d0e06ef1b658e652b2738daf24 /fs/ceph/inode.c
parent4d1829a59de402fc95daf4576c51aa0a7439aee8 (diff)
downloadlinux-6f60f889470aecf747610279545c054a99aadca3.tar.xz
ceph: fix freeing inode vs removing session caps race
remove_session_caps() uses iterate_session_caps() to remove caps, but iterate_session_caps() skips inodes that are being deleted. So session->s_nr_caps can be non-zero after iterate_session_caps() return. We can fix the issue by waiting until deletions are complete. __wait_on_freeing_inode() is designed for the job, but it is not exported, so we use lookup inode function to access it. Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Diffstat (limited to 'fs/ceph/inode.c')
-rw-r--r--fs/ceph/inode.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index 55aaddb4047e..3b0abed667c2 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -61,6 +61,14 @@ struct inode *ceph_get_inode(struct super_block *sb, struct ceph_vino vino)
return inode;
}
+struct inode *ceph_lookup_inode(struct super_block *sb, struct ceph_vino vino)
+{
+ struct inode *inode;
+ ino_t t = ceph_vino_to_ino(vino);
+ inode = ilookup5_nowait(sb, t, ceph_ino_compare, &vino);
+ return inode;
+}
+
/*
* get/constuct snapdir inode for a given directory
*/