Signed-off-by: Fotis Xenakis <fo...@windowslive.com>
---
 drivers/virtio-fs.cc           | 67 ++++++++++++++--------------------
 drivers/virtio-fs.hh           |  8 +++-
 fs/virtiofs/virtiofs_vfsops.cc |  2 +-
 3 files changed, 34 insertions(+), 43 deletions(-)

diff --git a/drivers/virtio-fs.cc b/drivers/virtio-fs.cc
index e0e090bc..b1b622e4 100644
--- a/drivers/virtio-fs.cc
+++ b/drivers/virtio-fs.cc
@@ -5,28 +5,20 @@
  * BSD license as described in the LICENSE file in the top-level directory.
  */
 
-#include <sys/cdefs.h>
-
-#include "drivers/virtio.hh"
-#include "drivers/virtio-fs.hh"
-#include <osv/interrupt.hh>
-
-#include <osv/mempool.hh>
-#include <osv/mmu.hh>
-
 #include <string>
-#include <string.h>
-#include <map>
-#include <errno.h>
-#include <osv/debug.h>
-
-#include <osv/sched.hh>
-#include "osv/trace.hh"
-#include "osv/aligned_new.hh"
 
+#include <osv/debug.h>
 #include <osv/device.h>
+#include <osv/interrupt.hh>
+#include <osv/mmio.hh>
+#include <osv/msi.hh>
+#include <osv/sched.hh>
 
-using namespace memory;
+#include "drivers/pci-device.hh"
+#include "drivers/virtio.hh"
+#include "drivers/virtio-fs.hh"
+#include "drivers/virtio-vring.hh"
+#include "fs/virtiofs/fuse_kernel.h"
 
 using fuse_request = virtio::fs::fuse_request;
 
@@ -48,25 +40,25 @@ void fs::fuse_request::done()
     }
 }
 
-static void fuse_req_enqueue_input(vring* queue, fuse_request* req)
+static void fuse_req_enqueue_input(vring& queue, fuse_request& req)
 {
     // Header goes first
-    queue->add_out_sg(&req->in_header, sizeof(struct fuse_in_header));
+    queue.add_out_sg(&req.in_header, sizeof(struct fuse_in_header));
 
     // Add fuse in arguments as out sg
-    if (req->input_args_size > 0) {
-        queue->add_out_sg(req->input_args_data, req->input_args_size);
+    if (req.input_args_size > 0) {
+        queue.add_out_sg(req.input_args_data, req.input_args_size);
     }
 }
 
-static void fuse_req_enqueue_output(vring* queue, fuse_request* req)
+static void fuse_req_enqueue_output(vring& queue, fuse_request& req)
 {
     // Header goes first
-    queue->add_in_sg(&req->out_header, sizeof(struct fuse_out_header));
+    queue.add_in_sg(&req.out_header, sizeof(struct fuse_out_header));
 
     // Add fuse out arguments as in sg
-    if (req->output_args_size > 0) {
-        queue->add_in_sg(req->output_args_data, req->output_args_size);
+    if (req.output_args_size > 0) {
+        queue.add_in_sg(req.output_args_data, req.output_args_size);
     }
 }
 
@@ -194,7 +186,7 @@ void fs::req_done()
     auto* queue = get_virt_queue(VQ_REQUEST);
 
     while (true) {
-        virtio_driver::wait_for_queue(queue, &vring::used_ring_not_empty);
+        wait_for_queue(queue, &vring::used_ring_not_empty);
 
         fuse_request* req;
         u32 len;
@@ -210,26 +202,21 @@ void fs::req_done()
     }
 }
 
-int fs::make_request(fuse_request* req)
+int fs::make_request(fuse_request& req)
 {
-    // The lock is here for parallel requests protection
-    WITH_LOCK(_lock) {
-        if (!req) {
-            return EIO;
-        }
-
-        auto* queue = get_virt_queue(VQ_REQUEST);
+    auto* queue = get_virt_queue(VQ_REQUEST);
 
+    WITH_LOCK(_lock) {
         queue->init_sg();
 
-        fuse_req_enqueue_input(queue, req);
-        fuse_req_enqueue_output(queue, req);
+        fuse_req_enqueue_input(*queue, req);
+        fuse_req_enqueue_output(*queue, req);
 
-        queue->add_buf_wait(req);
+        queue->add_buf_wait(&req);
         queue->kick();
-
-        return 0;
     }
+
+    return 0;
 }
 
 hw_driver* fs::probe(hw_device* dev)
diff --git a/drivers/virtio-fs.hh b/drivers/virtio-fs.hh
index 88a16939..c7a71b17 100644
--- a/drivers/virtio-fs.hh
+++ b/drivers/virtio-fs.hh
@@ -10,9 +10,12 @@
 
 #include <functional>
 
+#include <osv/mmio.hh>
 #include <osv/mutex.h>
 #include <osv/waitqueue.hh>
 
+#include "drivers/device.hh"
+#include "drivers/driver.hh"
 #include "drivers/virtio.hh"
 #include "drivers/virtio-device.hh"
 #include "fs/virtiofs/fuse_kernel.h"
@@ -67,7 +70,7 @@ public:
     virtual std::string get_name() const { return _driver_name; }
     void read_config();
 
-    int make_request(fuse_request*);
+    int make_request(fuse_request&);
     dax_window* get_dax() {
         return (_dax.addr != mmio_nullptr) ? &_dax : nullptr;
     }
@@ -94,8 +97,9 @@ private:
     // maintains the virtio instance number for multiple drives
     static int _instance;
     int _id;
+
     // This mutex protects parallel make_request invocations
-    mutex _lock;
+    mutex _lock;    // TODO: Maintain one mutex per virtqueue
 };
 
 }
diff --git a/fs/virtiofs/virtiofs_vfsops.cc b/fs/virtiofs/virtiofs_vfsops.cc
index b60a766b..3dc575c4 100644
--- a/fs/virtiofs/virtiofs_vfsops.cc
+++ b/fs/virtiofs/virtiofs_vfsops.cc
@@ -52,7 +52,7 @@ int fuse_req_send_and_receive_reply(virtio::fs* drv, uint32_t 
opcode,
     req->output_args_size = output_args_size;
 
     assert(drv);
-    drv->make_request(req.get());
+    drv->make_request(*req);
     req->wait();
 
     int error = -req->out_header.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 osv-dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/osv-dev/AM0PR03MB629203A23A47480E05C4479DA6620%40AM0PR03MB6292.eurprd03.prod.outlook.com.

Reply via email to