Project

General

Profile

Bug #6914 » 0001-ceph-check-inode-caps-in-ceph_d_revalidate.patch

Zheng Yan, 12/24/2013 09:41 PM

View differences:

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);
(4-4/7)