From 4cc3e3dd22a3333cdcb1bc4dca22454f6f4824cb Mon Sep 17 00:00:00 2001 From: Shweta Sodani Date: Thu, 20 Nov 2025 16:14:26 +0530 Subject: [PATCH] vfs_ceph_new: use vfs_ceph_iget/vfs_ceph_iput in vfs_ceph_disk_free MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently inode of root is using to report stats that works fine for share of root volume. But for subvolume share it reports incorrect information. Hence choose the inode based on path, so that it will report stats information correctly. Bug:https://bugzilla.samba.org/show_bug.cgi?id=15954 Signed-off-by: Shweta Sodani Reviewed-by: Xavi Hernandez Reviewed-by: Anoop C S Reviewed-by: Guenther Deschner Autobuild-User(master): Günther Deschner Autobuild-Date(master): Mon Nov 24 18:03:08 UTC 2025 on atb-devel-224 (cherry picked from commit f2ccf020046bc4f0465dfa8b5a8737b018fa66ac) --- source3/modules/vfs_ceph_new.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/source3/modules/vfs_ceph_new.c b/source3/modules/vfs_ceph_new.c index 3cd7cb8cb4e..6ea8e56c155 100644 --- a/source3/modules/vfs_ceph_new.c +++ b/source3/modules/vfs_ceph_new.c @@ -872,13 +872,14 @@ static int vfs_ceph_ll_statfs(const struct vfs_handle_struct *handle, struct statvfs *stbuf) { struct vfs_ceph_config *config = NULL; + int ret = -1; SMB_VFS_HANDLE_GET_DATA(handle, config, struct vfs_ceph_config, return -ENOMEM); - DBG_DEBUG("[CEPH] ceph_ll_statfs: ino=%" PRIu64 "\n", iref->ino); - - return config->ceph_ll_statfs_fn(config->mount, iref->inode, stbuf); + ret = config->ceph_ll_statfs_fn(config->mount, iref->inode, stbuf); + DBG_DEBUG("[CEPH] ceph_ll_statfs: ino=%" PRIu64 " ret=%d\n", iref->ino, ret); + return ret; } static int vfs_ceph_ll_getattr2(const struct vfs_handle_struct *handle, @@ -2034,25 +2035,21 @@ static uint64_t vfs_ceph_disk_free(struct vfs_handle_struct *handle, uint64_t *dsize) { struct statvfs statvfs_buf = { 0 }; - struct Inode *inode = NULL; int ret; struct vfs_ceph_config *config = NULL; + struct vfs_ceph_iref iref = {0}; SMB_VFS_HANDLE_GET_DATA(handle, config, struct vfs_ceph_config, return -ENOMEM); - ret = config->ceph_ll_lookup_root_fn(config->mount, &inode); + ret = vfs_ceph_iget(handle, smb_fname->base_name, 0, &iref); if (ret != 0) { - DBG_DEBUG("[CEPH] disk_free: ceph_ll_lookup_root returned ret=%d\n", - ret); errno = -ret; return (uint64_t)(-1); } - ret = config->ceph_ll_statfs_fn(config->mount, inode, &statvfs_buf); - config->ceph_ll_put_fn(config->mount, inode); + ret = vfs_ceph_ll_statfs(handle, &iref, &statvfs_buf); + vfs_ceph_iput(handle, &iref); if (ret != 0) { - DBG_DEBUG("[CEPH] disk_free: ceph_ll_statfs returned ino=%p" - " ret=%d\n", inode, ret); errno = -ret; return (uint64_t)(-1); } -- 2.52.0