From: Xavi Hernandez Date: Tue, 18 Feb 2025 14:28:45 +0000 (+0000) Subject: libcephfs_proxy: implement client side async rw operation X-Git-Tag: v20.3.0~362^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6b2c7422d1a933bbba44c432cb0a816f5f0c902c;p=ceph.git libcephfs_proxy: implement client side async rw operation Signed-off-by: Xavi Hernandez --- diff --git a/src/libcephfs_proxy/libcephfs_proxy.c b/src/libcephfs_proxy/libcephfs_proxy.c index b71ba92a2885c..cacc5200c19b3 100644 --- a/src/libcephfs_proxy/libcephfs_proxy.c +++ b/src/libcephfs_proxy/libcephfs_proxy.c @@ -181,7 +181,7 @@ __public int ceph_create(struct ceph_mount_info **cmount, const char *const id) sd = err; proxy_link_negotiate_init(&ceph_mount->neg, 0, PROXY_FEAT_ALL, 0, - PROXY_FEAT_ASYNC_CBK); + PROXY_FEAT_ASYNC_IO); err = proxy_link_handshake_client(&ceph_mount->link, sd, &ceph_mount->neg, @@ -911,3 +911,38 @@ __public UserPerm *ceph_mount_perms(struct ceph_mount_info *cmount) return value_ptr(ans.userperm); } + +__public int64_t ceph_ll_nonblocking_readv_writev( + struct ceph_mount_info *cmount, struct ceph_ll_io_info *io_info) +{ + CEPH_REQ(ceph_ll_nonblocking_readv_writev, req, + io_info->write ? io_info->iovcnt : 0, ans, 0); + int32_t i, err; + + if ((cmount->neg.v1.enabled & PROXY_FEAT_ASYNC_IO) == 0) { + return -EOPNOTSUPP; + } + + req.info = ptr_checksum(&cmount->async.random, io_info); + req.fh = (uintptr_t)io_info->fh; + req.off = io_info->off; + req.size = 0; + req.write = io_info->write; + req.fsync = io_info->fsync; + req.syncdataonly = io_info->syncdataonly; + + for (i = 0; i < io_info->iovcnt; i++) { + if (io_info->write) { + CEPH_BUFF_ADD(req, io_info->iov[i].iov_base, + io_info->iov[i].iov_len); + } + req.size += io_info->iov[i].iov_len; + } + + err = CEPH_PROCESS(cmount, LIBCEPHFSD_OP_LL_NONBLOCKING_RW, req, ans); + if (err < 0) { + return err; + } + + return ans.res; +} diff --git a/src/libcephfs_proxy/proxy.h b/src/libcephfs_proxy/proxy.h index 699e35ab87235..8b2ea8abfcf5a 100644 --- a/src/libcephfs_proxy/proxy.h +++ b/src/libcephfs_proxy/proxy.h @@ -26,6 +26,9 @@ ((_type *)((uintptr_t)(_ptr) - offset_of(_type, _field))) enum { + /* Support for ceph_ll_nonblocking_readv_writev */ + PROXY_FEAT_ASYNC_IO = 0x00000001, + /* Mask of all features requiring the asynchronous callback handling. */ PROXY_FEAT_ASYNC_CBK = 0x00000001, diff --git a/src/libcephfs_proxy/proxy_requests.h b/src/libcephfs_proxy/proxy_requests.h index 7552af6b3390d..c18a9f7823e3a 100644 --- a/src/libcephfs_proxy/proxy_requests.h +++ b/src/libcephfs_proxy/proxy_requests.h @@ -40,7 +40,7 @@ #define CEPH_DATA(_name, _data, _data_count) \ proxy_##_name##_##_data##_t _data; \ - struct iovec _data##_iov[_data_count + 1]; \ + struct iovec _data##_iov[(_data_count) + 1]; \ int32_t _data##_count = 0; \ CEPH_BUFF_ADD(_data, &_data, sizeof(_data))