Loading src/client/gkfs_functions.cpp +12 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading @@ -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; } } Loading @@ -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()) { Loading Loading
src/client/gkfs_functions.cpp +12 −5 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading @@ -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; } } Loading @@ -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()) { Loading