Commit feab6ac2 authored by Yan, Zheng's avatar Yan, Zheng Committed by Ilya Dryomov

ceph: fix dir_lease_is_valid()

It should call __ceph_dentry_dir_lease_touch() under dentry->d_lock.
Besides, ceph_dentry(dentry) can be NULL when called by LOOKUP_RCU
d_revalidate()
Signed-off-by: default avatar"Yan, Zheng" <zyan@redhat.com>
Reviewed-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 543212b3
...@@ -1512,18 +1512,26 @@ static int __dir_lease_try_check(const struct dentry *dentry) ...@@ -1512,18 +1512,26 @@ static int __dir_lease_try_check(const struct dentry *dentry)
static int dir_lease_is_valid(struct inode *dir, struct dentry *dentry) static int dir_lease_is_valid(struct inode *dir, struct dentry *dentry)
{ {
struct ceph_inode_info *ci = ceph_inode(dir); struct ceph_inode_info *ci = ceph_inode(dir);
struct ceph_dentry_info *di = ceph_dentry(dentry); int valid;
int valid = 0; int shared_gen;
spin_lock(&ci->i_ceph_lock); spin_lock(&ci->i_ceph_lock);
if (atomic_read(&ci->i_shared_gen) == di->lease_shared_gen) valid = __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1);
valid = __ceph_caps_issued_mask(ci, CEPH_CAP_FILE_SHARED, 1); shared_gen = atomic_read(&ci->i_shared_gen);
spin_unlock(&ci->i_ceph_lock); spin_unlock(&ci->i_ceph_lock);
if (valid) if (valid) {
__ceph_dentry_dir_lease_touch(di); struct ceph_dentry_info *di;
dout("dir_lease_is_valid dir %p v%u dentry %p v%u = %d\n", spin_lock(&dentry->d_lock);
dir, (unsigned)atomic_read(&ci->i_shared_gen), di = ceph_dentry(dentry);
dentry, (unsigned)di->lease_shared_gen, valid); if (dir == d_inode(dentry->d_parent) &&
di && di->lease_shared_gen == shared_gen)
__ceph_dentry_dir_lease_touch(di);
else
valid = 0;
spin_unlock(&dentry->d_lock);
}
dout("dir_lease_is_valid dir %p v%u dentry %p = %d\n",
dir, (unsigned)atomic_read(&ci->i_shared_gen), dentry, valid);
return valid; return valid;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment