diff options
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/inode.c | 4 | ||||
-rw-r--r-- | fs/ceph/super.c | 5 |
2 files changed, 7 insertions, 2 deletions
diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index 4b5762ef7c2b..ba95eea201bf 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c | |||
@@ -1104,7 +1104,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req, | |||
1104 | pr_err("fill_trace bad get_inode " | 1104 | pr_err("fill_trace bad get_inode " |
1105 | "%llx.%llx\n", vino.ino, vino.snap); | 1105 | "%llx.%llx\n", vino.ino, vino.snap); |
1106 | err = PTR_ERR(in); | 1106 | err = PTR_ERR(in); |
1107 | d_delete(dn); | 1107 | d_drop(dn); |
1108 | goto done; | 1108 | goto done; |
1109 | } | 1109 | } |
1110 | dn = splice_dentry(dn, in, &have_lease, true); | 1110 | dn = splice_dentry(dn, in, &have_lease, true); |
@@ -1277,7 +1277,7 @@ retry_lookup: | |||
1277 | in = ceph_get_inode(parent->d_sb, vino); | 1277 | in = ceph_get_inode(parent->d_sb, vino); |
1278 | if (IS_ERR(in)) { | 1278 | if (IS_ERR(in)) { |
1279 | dout("new_inode badness\n"); | 1279 | dout("new_inode badness\n"); |
1280 | d_delete(dn); | 1280 | d_drop(dn); |
1281 | dput(dn); | 1281 | dput(dn); |
1282 | err = PTR_ERR(in); | 1282 | err = PTR_ERR(in); |
1283 | goto out; | 1283 | goto out; |
diff --git a/fs/ceph/super.c b/fs/ceph/super.c index 2f586b0e5e0f..2eb43f211325 100644 --- a/fs/ceph/super.c +++ b/fs/ceph/super.c | |||
@@ -618,6 +618,11 @@ bad_cap: | |||
618 | 618 | ||
619 | static void destroy_caches(void) | 619 | static void destroy_caches(void) |
620 | { | 620 | { |
621 | /* | ||
622 | * Make sure all delayed rcu free inodes are flushed before we | ||
623 | * destroy cache. | ||
624 | */ | ||
625 | rcu_barrier(); | ||
621 | kmem_cache_destroy(ceph_inode_cachep); | 626 | kmem_cache_destroy(ceph_inode_cachep); |
622 | kmem_cache_destroy(ceph_cap_cachep); | 627 | kmem_cache_destroy(ceph_cap_cachep); |
623 | kmem_cache_destroy(ceph_dentry_cachep); | 628 | kmem_cache_destroy(ceph_dentry_cachep); |