]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
vfs_ceph_new: use low-level APIs for disk_free
authorShachar Sharon <ssharon@redhat.com>
Sun, 16 Jun 2024 11:50:08 +0000 (14:50 +0300)
committerGünther Deschner <gd@samba.org>
Mon, 29 Jul 2024 14:51:36 +0000 (14:51 +0000)
Start using libcephfs low-level APIs: get reference to root inode and
use it to query statfs. Requires an explicit put-inode to avoid resource
leakage by libcephfs.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15686

Signed-off-by: Shachar Sharon <ssharon@redhat.com>
Reviewed-by: Guenther Deschner <gd@samba.org>
Reviewed-by: Anoop C S <anoopcs@samba.org>
source3/modules/vfs_ceph_new.c

index 313dcb5ac642cff5a4d09a05f9b74a625f0398ca..722a2aed4f492ab664642de84df2fd64dd82b6d0 100644 (file)
@@ -344,19 +344,26 @@ 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;
 
-       ret = ceph_statfs(handle->data, smb_fname->base_name, &statvfs_buf);
-       if (ret < 0) {
-               DBG_DEBUG("[CEPH] ceph_statfs returned %d\n", ret);
-               return (uint64_t)status_code(ret);
+       ret = ceph_ll_lookup_root(handle->data, &inode);
+       if (ret != 0) {
+               DBG_DEBUG("[CEPH] ceph_ll_lookup_root returned %d\n", ret);
+               errno = -ret;
+               return (uint64_t)(-1);
        }
-       /*
-        * Provide all the correct values.
-        */
-       *bsize = statvfs_buf.f_bsize;
-       *dfree = statvfs_buf.f_bavail;
-       *dsize = statvfs_buf.f_blocks;
+       ret = ceph_ll_statfs(handle->data, inode, &statvfs_buf);
+       ceph_ll_put(handle->data, inode);
+       if (ret != 0) {
+               DBG_DEBUG("[CEPH] ceph_ll_statfs returned %d\n", ret);
+               errno = -ret;
+               return (uint64_t)(-1);
+       }
+       *bsize = (uint64_t)statvfs_buf.f_bsize;
+       *dfree = (uint64_t)statvfs_buf.f_bavail;
+       *dsize = (uint64_t)statvfs_buf.f_blocks;
+
        DBG_DEBUG("[CEPH] bsize: %llu, dfree: %llu, dsize: %llu\n",
                  llu(*bsize),
                  llu(*dfree),