Signed-off-by: Fotis Xenakis <[email protected]>
---
 fs/virtiofs/virtiofs_dax.cc    |  4 ++--
 fs/virtiofs/virtiofs_i.hh      |  8 +++++---
 fs/virtiofs/virtiofs_vfsops.cc | 16 ++++++++++------
 fs/virtiofs/virtiofs_vnops.cc  | 11 ++++++-----
 4 files changed, 23 insertions(+), 16 deletions(-)

diff --git a/fs/virtiofs/virtiofs_dax.cc b/fs/virtiofs/virtiofs_dax.cc
index 8e612eb5..38ccdc39 100644
--- a/fs/virtiofs/virtiofs_dax.cc
+++ b/fs/virtiofs/virtiofs_dax.cc
@@ -194,7 +194,7 @@ int dax_manager::map_ll(uint64_t nodeid, uint64_t 
file_handle, chunk nchunks,
                    "moffset=%lld)\n", nodeid, in_args->foffset, in_args->len,
                    in_args->moffset);
     auto error = fuse_req_send_and_receive_reply(&_drv, FUSE_SETUPMAPPING,
-        nodeid, in_args.get(), sizeof(*in_args), nullptr, 0);
+        nodeid, in_args.get(), sizeof(*in_args), nullptr, 0).second;
     if (error) {
         kprintf("[virtiofs] inode %lld, mapping setup failed\n", nodeid);
         return error;
@@ -230,7 +230,7 @@ int dax_manager::unmap_ll(chunk nchunks, chunk mstart)
     virtiofs_debug("inode %lld, removing mapping (moffset=%lld, len=%lld)\n",
         nodeid, r_one->moffset, r_one->len);
     auto error = fuse_req_send_and_receive_reply(&_drv, FUSE_REMOVEMAPPING,
-        nodeid, in_args.get(), in_args_size, nullptr, 0);
+        nodeid, in_args.get(), in_args_size, nullptr, 0).second;
     if (error) {
         kprintf("[virtiofs] inode %lld, mapping removal failed\n", nodeid);
         return error;
diff --git a/fs/virtiofs/virtiofs_i.hh b/fs/virtiofs/virtiofs_i.hh
index e879546d..1d1b04bc 100644
--- a/fs/virtiofs/virtiofs_i.hh
+++ b/fs/virtiofs/virtiofs_i.hh
@@ -8,10 +8,12 @@
 #ifndef VIRTIOFS_IO_H
 #define VIRTIOFS_IO_H
 
+#include <utility>
+
 #include "drivers/virtio-fs.hh"
 
-int fuse_req_send_and_receive_reply(virtio::fs* drv, uint32_t opcode,
-    uint64_t nodeid, void* input_args_data, size_t input_args_size,
-    void* output_args_data, size_t output_args_size);
+std::pair<size_t, int> fuse_req_send_and_receive_reply(virtio::fs* drv,
+    uint32_t opcode, uint64_t nodeid, void* input_args_data,
+    size_t input_args_size, void* output_args_data, size_t output_args_size);
 
 #endif
diff --git a/fs/virtiofs/virtiofs_vfsops.cc b/fs/virtiofs/virtiofs_vfsops.cc
index be4a32e6..64855b73 100644
--- a/fs/virtiofs/virtiofs_vfsops.cc
+++ b/fs/virtiofs/virtiofs_vfsops.cc
@@ -10,6 +10,7 @@
 #include <mutex>
 #include <new>
 #include <sys/types.h>
+#include <utility>
 
 #include <api/assert.h>
 #include <osv/debug.h>
@@ -32,14 +33,14 @@ static struct {
     mutex lock;
 } dax_managers;
 
-int fuse_req_send_and_receive_reply(virtio::fs* drv, uint32_t opcode,
-    uint64_t nodeid, void* input_args_data, size_t input_args_size,
-    void* output_args_data, size_t output_args_size)
+std::pair<size_t, int> fuse_req_send_and_receive_reply(virtio::fs* drv,
+    uint32_t opcode, uint64_t nodeid, void* input_args_data,
+    size_t input_args_size, void* output_args_data, size_t output_args_size)
 {
     std::unique_ptr<fuse_request> req {
         new (std::nothrow) fuse_request(sched::thread::current())};
     if (!req) {
-        return ENOMEM;
+        return std::make_pair(0, ENOMEM);
     }
     req->in_header.len = sizeof(req->in_header) + input_args_size;
     req->in_header.opcode = opcode;
@@ -57,9 +58,11 @@ int fuse_req_send_and_receive_reply(virtio::fs* drv, 
uint32_t opcode,
     drv->make_request(*req);
     req->wait();
 
+    // return the length of the response's payload
+    size_t len = req->out_header.len - sizeof(fuse_out_header);
     int error = -req->out_header.error;
 
-    return error;
+    return std::make_pair(len, error);
 }
 
 void virtiofs_set_vnode(struct vnode* vnode, struct virtiofs_inode* inode)
@@ -107,7 +110,8 @@ static int virtiofs_mount(struct mount* mp, const char* 
dev, int flags,
 
     auto* drv = static_cast<virtio::fs*>(device->private_data);
     error = fuse_req_send_and_receive_reply(drv, FUSE_INIT, FUSE_ROOT_ID,
-        in_args.get(), sizeof(*in_args), out_args.get(), sizeof(*out_args));
+        in_args.get(), sizeof(*in_args), out_args.get(),
+        sizeof(*out_args)).second;
     if (error) {
         kprintf("[virtiofs] Failed to initialize fuse filesystem!\n");
         return error;
diff --git a/fs/virtiofs/virtiofs_vnops.cc b/fs/virtiofs/virtiofs_vnops.cc
index 10571a8d..1e3cf99e 100644
--- a/fs/virtiofs/virtiofs_vnops.cc
+++ b/fs/virtiofs/virtiofs_vnops.cc
@@ -62,7 +62,7 @@ static int virtiofs_lookup(struct vnode* vnode, char* name, 
struct vnode** vpp)
     auto* drv = m_data->drv;
     auto error = fuse_req_send_and_receive_reply(drv, FUSE_LOOKUP,
         inode->nodeid, in_args.get(), in_args_len, out_args.get(),
-        sizeof(*out_args));
+        sizeof(*out_args)).second;
     if (error) {
         kprintf("[virtiofs] inode %lld, lookup failed to find %s\n",
             inode->nodeid, name);
@@ -114,7 +114,7 @@ static int virtiofs_open(struct file* fp)
     auto* drv = m_data->drv;
     auto error = fuse_req_send_and_receive_reply(drv, FUSE_OPEN,
         inode->nodeid, in_args.get(), sizeof(*in_args), out_args.get(),
-        sizeof(*out_args));
+        sizeof(*out_args)).second;
     if (error) {
         kprintf("[virtiofs] inode %lld, open failed\n", inode->nodeid);
         return error;
@@ -149,7 +149,7 @@ static int virtiofs_close(struct vnode* vnode, struct file* 
fp)
     auto* m_data = static_cast<virtiofs_mount_data*>(vnode->v_mount->m_data);
     auto* drv = m_data->drv;
     auto error = fuse_req_send_and_receive_reply(drv, FUSE_RELEASE,
-        inode->nodeid, in_args.get(), sizeof(*in_args), nullptr, 0);
+        inode->nodeid, in_args.get(), sizeof(*in_args), nullptr, 0).second;
     if (error) {
         kprintf("[virtiofs] inode %lld, close failed\n", inode->nodeid);
         return error;
@@ -177,7 +177,7 @@ static int virtiofs_readlink(struct vnode* vnode, struct 
uio* uio)
     auto* m_data = static_cast<virtiofs_mount_data*>(vnode->v_mount->m_data);
     auto* drv = m_data->drv;
     auto error = fuse_req_send_and_receive_reply(drv, FUSE_READLINK,
-        inode->nodeid, nullptr, 0, link_path.get(), PATH_MAX);
+        inode->nodeid, nullptr, 0, link_path.get(), PATH_MAX).second;
     if (error) {
         kprintf("[virtiofs] inode %lld, readlink failed\n", inode->nodeid);
         return error;
@@ -207,7 +207,8 @@ static int virtiofs_read_fallback(virtiofs_inode& inode, 
u64 file_handle,
     virtiofs_debug("inode %lld, reading %lld bytes at offset %lld\n",
         inode.nodeid, read_amt, uio.uio_offset);
     auto error = fuse_req_send_and_receive_reply(&drv, FUSE_READ,
-        inode.nodeid, in_args.get(), sizeof(*in_args), buf.get(), read_amt);
+        inode.nodeid, in_args.get(), sizeof(*in_args), buf.get(),
+        read_amt).second;
     if (error) {
         kprintf("[virtiofs] inode %lld, read failed\n", inode.nodeid);
         return error;
-- 
2.27.0

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/AM0PR03MB6292EFEA10E0C7A9B7BFF516A67A0%40AM0PR03MB6292.eurprd03.prod.outlook.com.

Reply via email to