diff options
author | Jeff Layton <jlayton@redhat.com> | 2016-07-01 09:39:20 -0400 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2016-07-28 03:00:39 +0200 |
commit | 5b484a513149f53613d376a9d1cd0391de099fb4 (patch) | |
tree | 0ee1d9977b0ba7ec005647ec6086414979eca3c0 /fs/ceph/dir.c | |
parent | 8aa152c77890abd0731f119e4e6662375503e288 (diff) | |
download | op-kernel-dev-5b484a513149f53613d376a9d1cd0391de099fb4.zip op-kernel-dev-5b484a513149f53613d376a9d1cd0391de099fb4.tar.gz |
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>
Diffstat (limited to 'fs/ceph/dir.c')
-rw-r--r-- | fs/ceph/dir.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index 8ff7bcc..904dc67 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -1286,10 +1286,14 @@ static void ceph_d_release(struct dentry *dentry) dout("d_release %p\n", dentry); ceph_dentry_lru_del(dentry); + + spin_lock(&dentry->d_lock); + dentry->d_fsdata = NULL; + spin_unlock(&dentry->d_lock); + if (di->lease_session) ceph_put_mds_session(di->lease_session); kmem_cache_free(ceph_dentry_cachep, di); - dentry->d_fsdata = NULL; } static int ceph_snapdir_d_revalidate(struct dentry *dentry, |