Signed-off-by: Fotis Xenakis <[email protected]>
---
 drivers/virtio-fs.cc           | 2 +-
 drivers/virtio-fs.hh           | 7 +++++++
 fs/virtiofs/virtiofs_vfsops.cc | 8 +++++++-
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/virtio-fs.cc b/drivers/virtio-fs.cc
index b7363040..ca9b00fc 100644
--- a/drivers/virtio-fs.cc
+++ b/drivers/virtio-fs.cc
@@ -103,7 +103,7 @@ bool fs::ack_irq()
 }
 
 fs::fs(virtio_device& virtio_dev)
-    : virtio_driver(virtio_dev)
+    : virtio_driver(virtio_dev), _map_align(-1)
 {
     _driver_name = "virtio-fs";
     _id = _instance++;
diff --git a/drivers/virtio-fs.hh b/drivers/virtio-fs.hh
index d1c116de..fdbab5d0 100644
--- a/drivers/virtio-fs.hh
+++ b/drivers/virtio-fs.hh
@@ -44,6 +44,12 @@ public:
     dax_window* get_dax() {
         return (_dax.addr != mmio_nullptr) ? &_dax : nullptr;
     }
+    // Set map alignment for DAX window. @map_align should be
+    // log2(byte_alignment), e.g. 12 for a 4096 byte alignment.
+    void set_map_alignment(int map_align) { _map_align = map_align; }
+    // Returns the map alignment for the DAX window as preiously set with
+    // set_map_alignment(), or < 0 if it has not been set.
+    int get_map_alignment() const { return _map_align; }
 
     void req_done();
     int64_t size();
@@ -63,6 +69,7 @@ private:
     std::string _driver_name;
     fs_config _config;
     dax_window _dax;
+    int _map_align;
 
     // maintains the virtio instance number for multiple drives
     static int _instance;
diff --git a/fs/virtiofs/virtiofs_vfsops.cc b/fs/virtiofs/virtiofs_vfsops.cc
index 968f93fc..85cbf868 100644
--- a/fs/virtiofs/virtiofs_vfsops.cc
+++ b/fs/virtiofs/virtiofs_vfsops.cc
@@ -12,6 +12,7 @@
 #include <iostream>
 #include "virtiofs.hh"
 #include "virtiofs_i.hh"
+#include "drivers/virtio-fs.hh"
 
 static std::atomic<uint64_t> fuse_unique_id(1);
 
@@ -85,7 +86,7 @@ static int virtiofs_mount(struct mount* mp, const char* dev, 
int flags,
     in_args->major = FUSE_KERNEL_VERSION;
     in_args->minor = FUSE_KERNEL_MINOR_VERSION;
     in_args->max_readahead = PAGE_SIZE;
-    in_args->flags = 0; // TODO: Verify that we need not set any flag
+    in_args->flags |= FUSE_MAP_ALIGNMENT;
 
     auto* strategy = static_cast<fuse_strategy*>(device->private_data);
     error = fuse_req_send_and_receive_reply(strategy, FUSE_INIT, FUSE_ROOT_ID,
@@ -99,6 +100,11 @@ static int virtiofs_mount(struct mount* mp, const char* 
dev, int flags,
     virtiofs_debug("Initialized fuse filesystem with version major: %d, "
                    "minor: %d\n", out_args->major, out_args->minor);
 
+    if (out_args->flags & FUSE_MAP_ALIGNMENT) {
+        auto* drv = static_cast<virtio::fs*>(strategy->drv);
+        drv->set_map_alignment(out_args->map_alignment);
+    }
+
     auto* root_node {new (std::nothrow) virtiofs_inode()};
     if (!root_node) {
         return ENOMEM;
-- 
2.26.2

-- 
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/VI1PR03MB4383AE2F61F985FAA55C0826A6BB0%40VI1PR03MB4383.eurprd03.prod.outlook.com.

Reply via email to