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>
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
Reference in New Issue
Block a user