Bug #6914 » 0001-ceph-check-inode-caps-in-ceph_d_revalidate.patch
fs/ceph/caps.c | ||
---|---|---|
return !RB_EMPTY_ROOT(&ci->i_caps) || ci->i_cap_exporting_mds >= 0;
|
||
}
|
||
int ceph_is_any_caps(struct inode *inode)
|
||
{
|
||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||
int ret;
|
||
spin_lock(&ci->i_ceph_lock);
|
||
ret = __ceph_is_any_caps(ci);
|
||
spin_unlock(&ci->i_ceph_lock);
|
||
return ret;
|
||
}
|
||
/*
|
||
* Remove a cap. Take steps to deal with a racing iterate_session_caps.
|
||
*
|
fs/ceph/dir.c | ||
---|---|---|
valid = 1;
|
||
} else if (dentry_lease_is_valid(dentry) ||
|
||
dir_lease_is_valid(dir, dentry)) {
|
||
valid = 1;
|
||
if (dentry->d_inode)
|
||
valid = ceph_is_any_caps(dentry->d_inode);
|
||
else
|
||
valid = 1;
|
||
}
|
||
dout("d_revalidate %p %s\n", dentry, valid ? "valid" : "invalid");
|
||
if (valid)
|
||
if (valid) {
|
||
ceph_dentry_lru_touch(dentry);
|
||
else
|
||
} else {
|
||
ceph_dir_clear_complete(dir);
|
||
d_drop(dentry);
|
||
}
|
||
iput(dir);
|
||
return valid;
|
||
}
|
fs/ceph/super.h | ||
---|---|---|
extern void __ceph_remove_cap(struct ceph_cap *cap, bool queue_release);
|
||
extern void ceph_put_cap(struct ceph_mds_client *mdsc,
|
||
struct ceph_cap *cap);
|
||
extern int ceph_is_any_caps(struct inode *inode);
|
||
extern void __queue_cap_release(struct ceph_mds_session *session, u64 ino,
|
||
u64 cap_id, u32 migrate_seq, u32 issue_seq);
|