forked from Minki/linux
ceph: clear d_fsinfo pointer under d_lock
To check for a valid dentry lease, we need to get at the ceph_dentry_info. Under rcuwalk though, we may end up with a dentry that is on its way to destruction. Since we need to take the d_lock in dentry_lease_is_valid already, we can just ensure that we clear the d_fsinfo pointer out under the same lock before destroying it. Signed-off-by: Jeff Layton <jlayton@redhat.com> Reviewed-by: Yan, Zheng <zyan@redhat.com>
This commit is contained in:
parent
8aa152c778
commit
5b484a5131
@ -1286,10 +1286,14 @@ static void ceph_d_release(struct dentry *dentry)
|
|||||||
|
|
||||||
dout("d_release %p\n", dentry);
|
dout("d_release %p\n", dentry);
|
||||||
ceph_dentry_lru_del(dentry);
|
ceph_dentry_lru_del(dentry);
|
||||||
|
|
||||||
|
spin_lock(&dentry->d_lock);
|
||||||
|
dentry->d_fsdata = NULL;
|
||||||
|
spin_unlock(&dentry->d_lock);
|
||||||
|
|
||||||
if (di->lease_session)
|
if (di->lease_session)
|
||||||
ceph_put_mds_session(di->lease_session);
|
ceph_put_mds_session(di->lease_session);
|
||||||
kmem_cache_free(ceph_dentry_cachep, di);
|
kmem_cache_free(ceph_dentry_cachep, di);
|
||||||
dentry->d_fsdata = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ceph_snapdir_d_revalidate(struct dentry *dentry,
|
static int ceph_snapdir_d_revalidate(struct dentry *dentry,
|
||||||
|
Loading…
Reference in New Issue
Block a user