Signed-off-by: Fotis Xenakis <fo...@windowslive.com>
---
 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 osv-dev+unsubscr...@googlegroups.com.
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