]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
libcephfs_proxy: implement the async rw callback
authorXavi Hernandez <xhernandez@gmail.com>
Tue, 18 Feb 2025 14:24:56 +0000 (14:24 +0000)
committerXavi Hernandez <xhernandez@gmail.com>
Wed, 19 Feb 2025 19:11:24 +0000 (20:11 +0100)
Signed-off-by: Xavi Hernandez <xhernandez@gmail.com>
src/libcephfs_proxy/proxy_async.c

index fad6370dd094f8d6372b0dd1c0bbb05e115c9f2b..629a9feda5da4dac7e66550a960e9f84e0010134 100644 (file)
 typedef int32_t (*proxy_cbk_handler_t)(proxy_async_t *, proxy_cbk_t *, void *,
                                       uint32_t);
 
+static int32_t libcephfsd_cbk_nonblocking_rw(proxy_async_t *async,
+                                            proxy_cbk_t *cbk, void *data,
+                                            uint32_t size)
+{
+       struct ceph_ll_io_info *info;
+       const struct iovec *iov;
+       int32_t err, count;
+
+       err = ptr_check(&async->random, cbk->ll_nonblocking_rw.info,
+                       (void **)&info);
+       if (err < 0) {
+               return err;
+       }
+
+       info->result = cbk->ll_nonblocking_rw.res;
+
+       if ((size >= 0) && !info->write) {
+               iov = info->iov;
+               count = info->iovcnt;
+               while (size > 0) {
+                       if (count == 0) {
+                               proxy_log(LOG_ERR, 0, "Excess data received");
+                               break;
+                       }
+                       if (size < iov->iov_len) {
+                               memcpy(iov->iov_base, data, size);
+                               break;
+                       }
+
+                       memcpy(iov->iov_base, data, iov->iov_len);
+                       data += iov->iov_len;
+                       size -= iov->iov_len;
+                       iov++;
+                       count--;
+               }
+       }
+
+       info->callback(info);
+
+       return 0;
+}
+
 static proxy_cbk_handler_t libcephfsd_cbk_handlers[LIBCEPHFSD_CBK_TOTAL_OPS] = {
+       [LIBCEPHFSD_CBK_LL_NONBLOCKING_RW] = libcephfsd_cbk_nonblocking_rw,
 };
 
 static void *