diff mbox

Ceph: Make sure stale dentries should be unhashed successfully in time.

Message ID 43180B106D8B514FB730205E2D1199E40399EC68@EX02.corp.qihoo.net (mailing list archive)
State New, archived
Headers show

Commit Message

陈玉鹏 March 2, 2018, 7:38 a.m. UTC
Prior to kernel v3.19, d_invalidate() might not unhash stale dentries due to reference count,
so the stale dentries are left in the memory, causing a delayed expiration.

Fixes: http://tracker.ceph.com/issues/23097

Signed-off-by: Yupeng Chen <chenyupeng-it@360.cn>
---
 fs/ceph/inode.c | 4 ++++
 1 file changed, 4 insertions(+)

-- 
1.8.3.1
diff mbox

Patch

diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c
index c6ec5aa..70a38f2 100644
--- a/fs/ceph/inode.c
+++ b/fs/ceph/inode.c
@@ -1345,6 +1345,10 @@  int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req)
 			     dn, d_inode(dn), ceph_vinop(d_inode(dn)),
 			     ceph_vinop(in));
 			d_invalidate(dn);
+			/* Prito to v3.19,d_invalidate might unhash the dentry unsuccessfully.*/
+			if (!d_unhashed(dn)) {
+				d_drop(dn);
+			}
 			have_lease = false;
 		}