diff options
author | Yan, Zheng <zheng.z.yan@intel.com> | 2013-07-24 00:22:11 -0400 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-08-09 20:55:32 -0400 |
commit | 6f60f889470aecf747610279545c054a99aadca3 (patch) | |
tree | 60f5781c7673d1d0e06ef1b658e652b2738daf24 /fs/ceph/inode.c | |
parent | 4d1829a59de402fc95daf4576c51aa0a7439aee8 (diff) |
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.c | 8 |
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) | |||
61 | return inode; | 61 | return inode; |
62 | } | 62 | } |
63 | 63 | ||
64 | struct inode *ceph_lookup_inode(struct super_block *sb, struct ceph_vino vino) | ||
65 | { | ||
66 | struct inode *inode; | ||
67 | ino_t t = ceph_vino_to_ino(vino); | ||
68 | inode = ilookup5_nowait(sb, t, ceph_ino_compare, &vino); | ||
69 | return inode; | ||
70 | } | ||
71 | |||
64 | /* | 72 | /* |
65 | * get/constuct snapdir inode for a given directory | 73 | * get/constuct snapdir inode for a given directory |
66 | */ | 74 | */ |