From: Christopher Hoffman Date: Mon, 11 Aug 2025 14:33:24 +0000 (+0000) Subject: client: bring client_lock out of statfs helper method X-Git-Tag: testing/wip-vshankar-testing-20250821.112602-debug~20^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dd7bdd32381ec81104f8399904c770f1ba0485b7;p=ceph-ci.git client: bring client_lock out of statfs helper method Signed-off-by: Christopher Hoffman --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 5880b0a9b0f..63e8a2b3f0a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -12529,6 +12529,8 @@ int Client::getcwd(string& dir, const UserPerm& perms) int Client::_statfs(Inode *in, struct statvfs *stbuf, const UserPerm& perms) { + ceph_assert(ceph_mutex_is_locked_by_me(client_lock)); + ldout(cct, 10) << __func__ << dendl; tout(cct) << __func__ << std::endl; unsigned long int total_files_on_fs; @@ -12536,7 +12538,6 @@ int Client::_statfs(Inode *in, struct statvfs *stbuf, ceph_statfs stats; C_SaferCond cond; - std::unique_lock lock(client_lock); const vector &data_pools = mdsmap->get_data_pools(); if (data_pools.size() == 1) { objecter->get_fs_stats(stats, data_pools[0], &cond); @@ -12544,9 +12545,9 @@ int Client::_statfs(Inode *in, struct statvfs *stbuf, objecter->get_fs_stats(stats, std::optional(), &cond); } - lock.unlock(); + client_lock.unlock(); int rval = cond.wait(); - lock.lock(); + client_lock.lock(); ceph_assert(in); // Usually quota_root will == root_ancestor, but if the mount root has no @@ -12970,9 +12971,7 @@ int Client::ll_statfs(Inode *in, struct statvfs *stbuf, const UserPerm& perms) if (!mref_reader.is_state_satisfied()) return -ENOTCONN; - /* Since the only thing this does is wrap a call to statfs, and - statfs takes a lock, it doesn't seem we have a need to split it - out. */ + std::unique_lock cl(client_lock); return _statfs(in, stbuf, perms); } @@ -12982,12 +12981,11 @@ int Client::statfs(const char *path, struct statvfs *stbuf, const UserPerm& perm if (!mref_reader.is_state_satisfied()) return -ENOTCONN; + std::unique_lock cl(client_lock); + walk_dentry_result wdr; - { - std::scoped_lock l(client_lock); - if (int rc = path_walk(cwd, filepath(path), &wdr, perms, {}); rc < 0) { - return rc; - } + if (int rc = path_walk(cwd, filepath(path), &wdr, perms, {}); rc < 0) { + return rc; } auto in = wdr.target.get();