Skip to content

Commit 23b6b43

Browse files
committed
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 <[email protected]>
1 parent cbf1c5b commit 23b6b43

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

src/client/Client.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7722,6 +7722,11 @@ int Client::path_walk(InodeRef dirinode, const filepath& origpath, walk_dentry_r
77227722
ldout(cct, 10) << " " << i << " " << *diri << " " << dname << dendl;
77237723
ldout(cct, 20) << " (path is " << path << ")" << dendl;
77247724
InodeRef next;
7725+
if (!diri.get()->is_dir()) {
7726+
ldout(cct, 20) << diri.get() << " is not a dir inode, name " << dname.c_str() << dendl;
7727+
rc = -ENOTDIR;
7728+
goto out;
7729+
}
77257730
if (should_check_perms()) {
77267731
int r = may_lookup(diri.get(), perms);
77277732
if (r < 0) {

0 commit comments

Comments
 (0)