ceph: use I_COMPLETE inode flag instead of D_COMPLETE flag
commit c6ffe10015
moved the flag that tracks if the dcache contents
for a directory are complete to dentry. The problem is there are
lots of places that use ceph_dir_{set,clear,test}_complete() while
holding i_ceph_lock. but ceph_dir_{set,clear,test}_complete() may
sleep because they call dput().
This patch basically reverts that commit. For ceph_d_prune(), it's
called with both the dentry to prune and the parent dentry are
locked. So it's safe to access the parent dentry's d_inode and
clear I_COMPLETE flag.
Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
Reviewed-by: Sage Weil <sage@inktank.com>
This commit is contained in:
@@ -490,15 +490,17 @@ static void __check_cap_issue(struct ceph_inode_info *ci, struct ceph_cap *cap,
|
||||
ci->i_rdcache_gen++;
|
||||
|
||||
/*
|
||||
* if we are newly issued FILE_SHARED, clear D_COMPLETE; we
|
||||
* if we are newly issued FILE_SHARED, clear I_COMPLETE; we
|
||||
* don't know what happened to this directory while we didn't
|
||||
* have the cap.
|
||||
*/
|
||||
if ((issued & CEPH_CAP_FILE_SHARED) &&
|
||||
(had & CEPH_CAP_FILE_SHARED) == 0) {
|
||||
ci->i_shared_gen++;
|
||||
if (S_ISDIR(ci->vfs_inode.i_mode))
|
||||
ceph_dir_clear_complete(&ci->vfs_inode);
|
||||
if (S_ISDIR(ci->vfs_inode.i_mode)) {
|
||||
dout(" marking %p NOT complete\n", &ci->vfs_inode);
|
||||
ci->i_ceph_flags &= ~CEPH_I_COMPLETE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user