Commit 4bf56e36 authored by Ramon Nou's avatar Ramon Nou
Browse files

mmap prot

parent 0958ef3f
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@
#include <client/cache.hpp>
#include <string>
#include <string_view>
#include <set>
#include <tuple>

#include <common/path_util.hpp>
#ifdef GKFS_ENABLE_CLIENT_METRICS
@@ -63,6 +65,7 @@ extern "C" {
#include <sys/statfs.h>
#include <sys/statvfs.h>
#include <linux/stat.h>
#include <sys/mman.h>
}

using namespace std;
@@ -86,7 +89,8 @@ struct dirent_extended {
namespace {

// set to store void * addr, fd, length and offset
std::set<std::tuple<void*, int, size_t, off_t>> mmap_set;
// set to store void * addr, fd, length, offset, prot
std::set<std::tuple<void*, int, size_t, off_t, int>> mmap_set;
/**
 * Checks if metadata for parent directory exists (can be disabled with
 * GKFS_CREATE_CHECK_PARENTS). errno may be set
@@ -2044,11 +2048,11 @@ gkfs_mmap(void* addr, size_t length, int prot, int flags, int fd,
        return MAP_FAILED;
    }
    // store info on mmap_set
    mmap_set.insert(std::make_tuple(ptr, fd, length, offset));
    mmap_set.insert(std::make_tuple(ptr, fd, length, offset, prot));
    auto ret = gkfs::syscall::gkfs_pread(fd, ptr, length, offset);
    if(ret == -1) {
        free(ptr);
        mmap_set.erase(std::make_tuple(ptr, fd, length, offset));
        mmap_set.erase(std::make_tuple(ptr, fd, length, offset, prot));
        return MAP_FAILED;
    }
    return ptr;
@@ -2064,7 +2068,10 @@ gkfs_msync(void* addr, size_t length, int flags) {
        if(std::get<0>(tuple) == addr) {
            int fd = std::get<1>(tuple);
            off_t offset = std::get<3>(tuple);
            int prot = std::get<4>(tuple);
            if(prot & PROT_WRITE) {
                gkfs::syscall::gkfs_pwrite(fd, addr, length, offset);
            }
            return 0;
        }
    }
@@ -2085,7 +2092,7 @@ gkfs_munmap(void* addr, size_t length) {

        auto it = std::find_if(
                mmap_set.begin(), mmap_set.end(),
                [&addr](const std::tuple<void*, int, size_t, off_t>& t) {
                [&addr](const std::tuple<void*, int, size_t, off_t, int>& t) {
                    return std::get<0>(t) == addr;
                });
        if(it != mmap_set.end()) {