From 11a08c5871d0ba46ed289a9642c77e81c6c56c87 Mon Sep 17 00:00:00 2001 From: Dhairya Parmar Date: Tue, 8 Apr 2025 19:22:05 +0530 Subject: [PATCH] client: do not open dir for a non-dir inode adds an extra ref to the root which leads to ref leaks: 2025-03-26T15:37:55.162+0530 7fadb8d41640 1 client.4293 dump_inode: DISCONNECTED inode 0x1 #0x1 ref 2 0x1.head(faked_ino=0 nref=2 ll_ref=0 cap_refs={1024=0} open={} mode=41777 size=0/0 nlink=1 btime=2025-03-26T15:37:39.967146+0530 mtime=2025-03-26T15:37:45.113229+0530 ctime=2025-03-26T15:37:45.136266+0530 change_attr=3 caps=pAsLsXs(0=pAsLsXs) COMPLETE has_dir_layout 0x7fad78006970) which leads to: 2025-03-26T15:37:55.162+0530 7fadb8d41640 2 client.4293 cache still has 1+1 items, waiting (for caps to release?) Fixes: https://tracker.ceph.com/issues/70553 Signed-off-by: Dhairya Parmar (cherry picked from commit 23b6b435835a095ceb10de92c3153ec1351d259c) --- src/client/Client.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/client/Client.cc b/src/client/Client.cc index e76cd9abc50..74933349247 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -7703,6 +7703,11 @@ int Client::path_walk(InodeRef dirinode, const filepath& origpath, walk_dentry_r ldout(cct, 10) << " " << i << " " << *diri << " " << dname << dendl; ldout(cct, 20) << " (path is " << path << ")" << dendl; InodeRef next; + if (!diri.get()->is_dir()) { + ldout(cct, 20) << diri.get() << " is not a dir inode, name " << dname.c_str() << dendl; + rc = -ENOTDIR; + goto out; + } if (should_check_perms()) { int r = may_lookup(diri.get(), perms); if (r < 0) { -- 2.39.5