Loading fs/.gitignore +1 −0 Original line number Diff line number Diff line Loading @@ -13,4 +13,5 @@ build/ ######### cmake-build-debug/ cmake-build-release/ playground/ fs/CMakeLists.txt +7 −4 Original line number Diff line number Diff line Loading @@ -3,19 +3,22 @@ project(fs VERSION 0.0.1) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FILE_OFFSET_BITS=64") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall --pedantic -g") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall --pedantic -g -pg") set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_EXPORT_COMPILE_COMMANDS 1) find_package(FUSE3 REQUIRED) # boost dependencies #TODO VERSION UNTESTED. I USE 1.62 # required packages find_package(FUSE3 REQUIRED) # boost dependencies, system is required for filesystem #TODO VERSION UNTESTED. I USE 1.62 find_package(Boost 1.56.0 COMPONENTS system filesystem serialization) include_directories(${FUSE3_INCLUDE_DIR} include/) set(SOURCE_FILES src/main.cpp src/main.h src/fuse_ops.h src/util.cpp src/classes/metadata.h src/classes/metadata.cpp src/adafs_ops/metadata_ops.h src/adafs_ops/metadata_ops.cpp src/adafs_ops/dentry_ops.cpp src/adafs_ops/dentry_ops.h src/configure.h src/fuse_ops/file.cpp src/fuse_ops/directory.cpp src/fuse_ops/access.cpp src/fuse_ops/sync.cpp src/adafs_ops/access.cpp src/adafs_ops/access.h src/fuse_ops/fs.cpp src/fuse_ops/io.cpp src/adafs_ops/io.cpp src/adafs_ops/io.h) add_executable(adafs ${SOURCE_FILES} src/main.cpp) target_link_libraries(adafs ${FUSE3_LIBRARIES} -lpthread -lboost_system -lboost_filesystem -lboost_serialization) No newline at end of file target_link_libraries(adafs ${FUSE3_LIBRARIES} -lpthread -lboost_system -lboost_filesystem -lboost_serialization -pg) No newline at end of file fs/src/fuse_ops/file.cpp +25 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,24 @@ int adafs_getattr(const char* p, struct stat* attr, struct fuse_file_info* fi) { auto path = bfs::path(p); auto md = make_shared<Metadata>(); // uncomment when mdtest.files should return 0 without actually checking if its there // if (path.filename().string().find("file.mdtest") == 0) { // auto md = make_unique<Metadata>(S_IFREG | 664); // md->init_ACM_time(); // attr->st_ino = md->inode_no(); // attr->st_mode = md->mode(); // attr->st_nlink = md->link_count(); // attr->st_uid = md->uid(); // attr->st_gid = md->gid(); // attr->st_size = md->size(); // attr->st_blksize = ADAFS_DATA->blocksize; // attr->st_blocks = md->blocks(); // attr->st_atim.tv_sec = md->atime(); // attr->st_mtim.tv_sec = md->mtime(); // attr->st_ctim.tv_sec = md->ctime(); // return 0; // } if (get_metadata(*md, path) != -ENOENT) { attr->st_ino = md->inode_no(); attr->st_mode = md->mode(); Loading Loading @@ -54,6 +72,9 @@ int adafs_mknod(const char* p, mode_t mode, dev_t dev) { ADAFS_DATA->logger->debug("##### FUSE FUNC ###### adafs_mknod() enter: name '{}' mode {} dev {}", p, mode, dev); // XXX Errorhandling and beware of transactions. saving dentry and metadata have to be atomic auto path = bfs::path(p); // uncomment if file creates done with mdtest should return immediately without creating the file // if (path.filename().string().find("file.mdtest") == 0) // return 0; // XXX check if file exists (how can we omit this? Let's just try to create it and see if it fails) Loading Loading @@ -114,6 +135,9 @@ int adafs_open(const char* p, struct fuse_file_info* fi) { #ifdef CHECK_ACCESS // XXX error handling auto path = bfs::path(p); // uncomment if file creates done with mdtest should return immediately without creating the file // if (path.filename().string().find("file.mdtest") == 0) // return 0; auto md = make_shared<Metadata>(); get_metadata(*md, path); Loading Loading @@ -191,7 +215,7 @@ int adafs_utimens(const char* p, const struct timespec tv[2], struct fuse_file_i * file. The return value of release is ignored. */ int adafs_release(const char* p, struct fuse_file_info* fi) { ADAFS_DATA->logger->info("##### FUSE FUNC ###### adafs_release() enter: name '{}'", p); ADAFS_DATA->logger->debug("##### FUSE FUNC ###### adafs_release() enter: name '{}'", p); // XXX Dunno what this function is for yet return 0; } No newline at end of file fs/src/main.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -57,13 +57,11 @@ void* adafs_init(struct fuse_conn_info* conn, struct fuse_config* cfg) { ADAFS_DATA->logger->debug("Metadata object exists"s); #endif return ADAFS_DATA; } void adafs_destroy(void* adafs_data) { util::write_inode_cnt(); delete ADAFS_DATA; } Loading Loading @@ -131,5 +129,9 @@ int main(int argc, char* argv[]) { //print version cout << "Fuse library version: "s + to_string(FUSE_MAJOR_VERSION) + to_string(FUSE_MINOR_VERSION) << endl; //init fuse and give the private data struct for further reference. return fuse_main(argc, argv, &adafs_ops, a_data.get()); cout << "initializing fuse..." << endl; auto err = fuse_main(argc, argv, &adafs_ops, a_data.get()); cout << "about to close fuse" << endl; return err; } Loading
fs/.gitignore +1 −0 Original line number Diff line number Diff line Loading @@ -13,4 +13,5 @@ build/ ######### cmake-build-debug/ cmake-build-release/ playground/
fs/CMakeLists.txt +7 −4 Original line number Diff line number Diff line Loading @@ -3,19 +3,22 @@ project(fs VERSION 0.0.1) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_FILE_OFFSET_BITS=64") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall --pedantic -g") set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall --pedantic -g -pg") set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH}) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) set(CMAKE_EXPORT_COMPILE_COMMANDS 1) find_package(FUSE3 REQUIRED) # boost dependencies #TODO VERSION UNTESTED. I USE 1.62 # required packages find_package(FUSE3 REQUIRED) # boost dependencies, system is required for filesystem #TODO VERSION UNTESTED. I USE 1.62 find_package(Boost 1.56.0 COMPONENTS system filesystem serialization) include_directories(${FUSE3_INCLUDE_DIR} include/) set(SOURCE_FILES src/main.cpp src/main.h src/fuse_ops.h src/util.cpp src/classes/metadata.h src/classes/metadata.cpp src/adafs_ops/metadata_ops.h src/adafs_ops/metadata_ops.cpp src/adafs_ops/dentry_ops.cpp src/adafs_ops/dentry_ops.h src/configure.h src/fuse_ops/file.cpp src/fuse_ops/directory.cpp src/fuse_ops/access.cpp src/fuse_ops/sync.cpp src/adafs_ops/access.cpp src/adafs_ops/access.h src/fuse_ops/fs.cpp src/fuse_ops/io.cpp src/adafs_ops/io.cpp src/adafs_ops/io.h) add_executable(adafs ${SOURCE_FILES} src/main.cpp) target_link_libraries(adafs ${FUSE3_LIBRARIES} -lpthread -lboost_system -lboost_filesystem -lboost_serialization) No newline at end of file target_link_libraries(adafs ${FUSE3_LIBRARIES} -lpthread -lboost_system -lboost_filesystem -lboost_serialization -pg) No newline at end of file
fs/src/fuse_ops/file.cpp +25 −1 Original line number Diff line number Diff line Loading @@ -26,6 +26,24 @@ int adafs_getattr(const char* p, struct stat* attr, struct fuse_file_info* fi) { auto path = bfs::path(p); auto md = make_shared<Metadata>(); // uncomment when mdtest.files should return 0 without actually checking if its there // if (path.filename().string().find("file.mdtest") == 0) { // auto md = make_unique<Metadata>(S_IFREG | 664); // md->init_ACM_time(); // attr->st_ino = md->inode_no(); // attr->st_mode = md->mode(); // attr->st_nlink = md->link_count(); // attr->st_uid = md->uid(); // attr->st_gid = md->gid(); // attr->st_size = md->size(); // attr->st_blksize = ADAFS_DATA->blocksize; // attr->st_blocks = md->blocks(); // attr->st_atim.tv_sec = md->atime(); // attr->st_mtim.tv_sec = md->mtime(); // attr->st_ctim.tv_sec = md->ctime(); // return 0; // } if (get_metadata(*md, path) != -ENOENT) { attr->st_ino = md->inode_no(); attr->st_mode = md->mode(); Loading Loading @@ -54,6 +72,9 @@ int adafs_mknod(const char* p, mode_t mode, dev_t dev) { ADAFS_DATA->logger->debug("##### FUSE FUNC ###### adafs_mknod() enter: name '{}' mode {} dev {}", p, mode, dev); // XXX Errorhandling and beware of transactions. saving dentry and metadata have to be atomic auto path = bfs::path(p); // uncomment if file creates done with mdtest should return immediately without creating the file // if (path.filename().string().find("file.mdtest") == 0) // return 0; // XXX check if file exists (how can we omit this? Let's just try to create it and see if it fails) Loading Loading @@ -114,6 +135,9 @@ int adafs_open(const char* p, struct fuse_file_info* fi) { #ifdef CHECK_ACCESS // XXX error handling auto path = bfs::path(p); // uncomment if file creates done with mdtest should return immediately without creating the file // if (path.filename().string().find("file.mdtest") == 0) // return 0; auto md = make_shared<Metadata>(); get_metadata(*md, path); Loading Loading @@ -191,7 +215,7 @@ int adafs_utimens(const char* p, const struct timespec tv[2], struct fuse_file_i * file. The return value of release is ignored. */ int adafs_release(const char* p, struct fuse_file_info* fi) { ADAFS_DATA->logger->info("##### FUSE FUNC ###### adafs_release() enter: name '{}'", p); ADAFS_DATA->logger->debug("##### FUSE FUNC ###### adafs_release() enter: name '{}'", p); // XXX Dunno what this function is for yet return 0; } No newline at end of file
fs/src/main.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -57,13 +57,11 @@ void* adafs_init(struct fuse_conn_info* conn, struct fuse_config* cfg) { ADAFS_DATA->logger->debug("Metadata object exists"s); #endif return ADAFS_DATA; } void adafs_destroy(void* adafs_data) { util::write_inode_cnt(); delete ADAFS_DATA; } Loading Loading @@ -131,5 +129,9 @@ int main(int argc, char* argv[]) { //print version cout << "Fuse library version: "s + to_string(FUSE_MAJOR_VERSION) + to_string(FUSE_MINOR_VERSION) << endl; //init fuse and give the private data struct for further reference. return fuse_main(argc, argv, &adafs_ops, a_data.get()); cout << "initializing fuse..." << endl; auto err = fuse_main(argc, argv, &adafs_ops, a_data.get()); cout << "about to close fuse" << endl; return err; }