Loading fs/CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,6 @@ find_package(FUSE3 REQUIRED) 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/metadata.h src/metadata.cpp src/metadata_ops.h src/metadata_ops.cpp src/dentry_ops.cpp src/dentry_ops.h) set(SOURCE_FILES src/main.cpp src/main.h src/fuse_ops.h src/util.cpp src/metadata.h src/metadata.cpp src/metadata_ops.h src/metadata_ops.cpp src/dentry_ops.cpp src/dentry_ops.h src/configure.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 fs/src/dentry_ops.cpp +21 −4 Original line number Diff line number Diff line Loading @@ -12,9 +12,26 @@ using namespace std; * @return */ bool init_dentry(const unsigned long& hash) { auto path = bfs::path(ADAFS_DATA->dentry_path); path.append(to_string(hash)); bfs::create_directories(path); auto d_path = bfs::path(ADAFS_DATA->dentry_path); d_path /= to_string(hash); bfs::create_directories(d_path); return bfs::exists(path); return bfs::exists(d_path); } /** * Check if the file name can be found in the directory entries of parent_dir_hash * @param parent_dir_hash * @param fname * @return */ bool verify_dentry(const bfs::path& path) { auto d_path = bfs::path(ADAFS_DATA->dentry_path); if (path.has_parent_path()) { // non-root d_path /= to_string(ADAFS_DATA->hashf(path.parent_path().string())); d_path /= path.filename(); // root } else { d_path /= to_string(ADAFS_DATA->hashf(path.string())); } // if file path exists leaf name is a valid dentry of parent_dir return bfs::exists(d_path); } No newline at end of file fs/src/dentry_ops.h +2 −0 Original line number Diff line number Diff line Loading @@ -9,4 +9,6 @@ bool init_dentry(const unsigned long& hash); bool verify_dentry(const bfs::path& path); #endif //FS_DENTRY_OPS_H fs/src/main.cpp +29 −31 Original line number Diff line number Diff line Loading @@ -9,30 +9,23 @@ static struct fuse_operations adafs_ops; using namespace std; int adafs_getattr(const char *path, struct stat *attr, struct fuse_file_info *fi){ //FUSE_UNKNOWN_INO errorcode if attr->st_ino could not be resolved by VFS (This is unverified information // but Fuse initializes it with this value initially fuse.c:3303 // if (attr->st_ino == -1) { // ADAFS_DATA->logger->info("st_ino = -1: "s + to_string(attr->st_ino)); // } else { // ADAFS_DATA->logger->info("st_ino != -1: "s + to_string(attr->st_ino)); // } // ADAFS_DATA->logger->info("adafs_getattr_enter1"s); // ADAFS_DATA->logger->info("st_ino: "s + to_string(attr->st_ino)); // ADAFS_DATA->logger->info("adafs_getattr_enter2"s); int adafs_getattr(const char *p, struct stat *attr, struct fuse_file_info *fi){ // call lookup for *path, return int (use errorcodes), put pointer to Metadata object in parameter // if exist (i.e. == 0) use Metadata object, else return ENOENT // auto path_s = bfs::path(path); // ADAFS_DATA->logger->info(path_s); // ADAFS_DATA->logger->flush(); auto md = make_shared<Metadata>(); // md->mode(S_IFDIR | 0755); // md->inode_no(1); // get_metadata(*md, path_s); // read_all_metadata(*md, 1, fpath); if (strcmp(path, "/") == 0) { auto path = bfs::path(p); auto md = make_shared<Metadata>(); if (get_metadata(*md, path) != -ENOENT) { attr->st_ino = md->inode_no(); attr->st_mode = md->mode(); attr->st_nlink = md->link_count(); Loading @@ -47,11 +40,11 @@ int adafs_getattr(const char *path, struct stat *attr, struct fuse_file_info *fi return 0; } if (strcmp(path, "/file") == 0) { if (strcmp(p, "/file") == 0) { attr->st_mode = S_IFDIR | 0755; return 0; } if (strcmp(path, "/file/file2") == 0) { if (strcmp(p, "/file/file2") == 0) { auto p_dir = make_shared<struct stat>(); lstat("/", p_dir.get()); ADAFS_DATA->logger->info(p_dir->st_ino); Loading @@ -66,19 +59,21 @@ int adafs_getattr(const char *path, struct stat *attr, struct fuse_file_info *fi } void *adafs_init(struct fuse_conn_info *conn, struct fuse_config *cfg) { // ADAFS_DATA->logger->info("init function"s); // ADAFS_DATA->logger->info("uid_: {}", fuse_get_context()->uid); // ADAFS_DATA->logger->info("gid_: {}", fuse_get_context()->gid); // ADAFS_DATA->logger->info("pid: {0:d}", fuse_get_context()->pid); // ADAFS_DATA->logger->info("rootdir: {}", ((struct adafs_data*)fuse_get_context()->private_data)->rootdir); //Initialize directory structure for metadata. XXX We need this later for lowlevel when we split dentry from inodes boost::filesystem::create_directories(ADAFS_DATA->rootdir + "/meta/dentries"s); boost::filesystem::create_directories(ADAFS_DATA->rootdir + "/meta/inodes"s); boost::filesystem::create_directories(ADAFS_DATA->rootdir + "/data/chunks"s); ADAFS_DATA->logger->info("Fuse init() enter"s); // Make sure directory structure exists bfs::create_directories(ADAFS_DATA->dentry_path); bfs::create_directories(ADAFS_DATA->inode_path); bfs::create_directories(ADAFS_DATA->chunk_path); bfs::create_directories(ADAFS_DATA->mgmt_path); // Check if fs already has some data and read the inode count if (bfs::exists(ADAFS_DATA->mgmt_path + "/inode_count")) util::read_inode_cnt(); else util::init_inode_no(); // XXX Dunno if this is of any use cfg->use_ino = 1; cfg->readdir_ino = 1; //Init file system configuration ADAFS_DATA->blocksize = 4096; Loading @@ -94,6 +89,7 @@ void *adafs_init(struct fuse_conn_info *conn, struct fuse_config *cfg) { ADAFS_DATA->logger->info("Root metadata not found. Initializing..."s); md->init_ACM_time(); md->mode(S_IFDIR | 0755); // XXX The gid and uid is the root user for some reason. Should be the user that mounted fuse. md->uid(fuse_get_context()->uid); md->gid(fuse_get_context()->gid); md->inode_no(ADAFS_ROOT_INODE); Loading @@ -109,6 +105,7 @@ void *adafs_init(struct fuse_conn_info *conn, struct fuse_config *cfg) { } void adafs_destroy(void *adafs_data) { util::write_inode_cnt(); delete ADAFS_DATA; } Loading Loading @@ -144,9 +141,10 @@ int main(int argc, char *argv[]) { argv[argc-1] = NULL; argc--; //set all paths a_data->inode_path = a_data->rootdir + "meta/inodes"s; a_data->dentry_path = a_data->rootdir + "meta/dentries"s; a_data->chunk_path = a_data->rootdir + "data/chunks"s; a_data->inode_path = a_data->rootdir + "/meta/inodes"s; a_data->dentry_path = a_data->rootdir + "/meta/dentries"s; a_data->chunk_path = a_data->rootdir + "/data/chunks"s; a_data->mgmt_path = a_data->rootdir + "/mgmt"s; //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. Loading fs/src/main.h +7 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ struct adafs_data { std::string inode_path; // used std::string dentry_path; // used std::string chunk_path; // unused std::string mgmt_path; // Caching std::unordered_map<std::string, std::string> hashmap; Loading @@ -35,7 +36,7 @@ struct adafs_data { // Housekeeping std::shared_ptr<spdlog::logger> logger; std::int64_t inode_count; uint64_t inode_count; std::mutex inode_mutex; // Later the blocksize will likely be coupled to the chunks to allow individually big chunk sizes. int32_t blocksize; Loading @@ -47,9 +48,13 @@ struct adafs_data { namespace util { boost::filesystem::path adafs_fullpath(const std::string& path); int reset_inode_no(); int init_inode_no(); ino_t generate_inode_no(); int read_inode_cnt(); int write_inode_cnt(); } #endif //MAIN_H Loading
fs/CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -16,6 +16,6 @@ find_package(FUSE3 REQUIRED) 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/metadata.h src/metadata.cpp src/metadata_ops.h src/metadata_ops.cpp src/dentry_ops.cpp src/dentry_ops.h) set(SOURCE_FILES src/main.cpp src/main.h src/fuse_ops.h src/util.cpp src/metadata.h src/metadata.cpp src/metadata_ops.h src/metadata_ops.cpp src/dentry_ops.cpp src/dentry_ops.h src/configure.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
fs/src/dentry_ops.cpp +21 −4 Original line number Diff line number Diff line Loading @@ -12,9 +12,26 @@ using namespace std; * @return */ bool init_dentry(const unsigned long& hash) { auto path = bfs::path(ADAFS_DATA->dentry_path); path.append(to_string(hash)); bfs::create_directories(path); auto d_path = bfs::path(ADAFS_DATA->dentry_path); d_path /= to_string(hash); bfs::create_directories(d_path); return bfs::exists(path); return bfs::exists(d_path); } /** * Check if the file name can be found in the directory entries of parent_dir_hash * @param parent_dir_hash * @param fname * @return */ bool verify_dentry(const bfs::path& path) { auto d_path = bfs::path(ADAFS_DATA->dentry_path); if (path.has_parent_path()) { // non-root d_path /= to_string(ADAFS_DATA->hashf(path.parent_path().string())); d_path /= path.filename(); // root } else { d_path /= to_string(ADAFS_DATA->hashf(path.string())); } // if file path exists leaf name is a valid dentry of parent_dir return bfs::exists(d_path); } No newline at end of file
fs/src/dentry_ops.h +2 −0 Original line number Diff line number Diff line Loading @@ -9,4 +9,6 @@ bool init_dentry(const unsigned long& hash); bool verify_dentry(const bfs::path& path); #endif //FS_DENTRY_OPS_H
fs/src/main.cpp +29 −31 Original line number Diff line number Diff line Loading @@ -9,30 +9,23 @@ static struct fuse_operations adafs_ops; using namespace std; int adafs_getattr(const char *path, struct stat *attr, struct fuse_file_info *fi){ //FUSE_UNKNOWN_INO errorcode if attr->st_ino could not be resolved by VFS (This is unverified information // but Fuse initializes it with this value initially fuse.c:3303 // if (attr->st_ino == -1) { // ADAFS_DATA->logger->info("st_ino = -1: "s + to_string(attr->st_ino)); // } else { // ADAFS_DATA->logger->info("st_ino != -1: "s + to_string(attr->st_ino)); // } // ADAFS_DATA->logger->info("adafs_getattr_enter1"s); // ADAFS_DATA->logger->info("st_ino: "s + to_string(attr->st_ino)); // ADAFS_DATA->logger->info("adafs_getattr_enter2"s); int adafs_getattr(const char *p, struct stat *attr, struct fuse_file_info *fi){ // call lookup for *path, return int (use errorcodes), put pointer to Metadata object in parameter // if exist (i.e. == 0) use Metadata object, else return ENOENT // auto path_s = bfs::path(path); // ADAFS_DATA->logger->info(path_s); // ADAFS_DATA->logger->flush(); auto md = make_shared<Metadata>(); // md->mode(S_IFDIR | 0755); // md->inode_no(1); // get_metadata(*md, path_s); // read_all_metadata(*md, 1, fpath); if (strcmp(path, "/") == 0) { auto path = bfs::path(p); auto md = make_shared<Metadata>(); if (get_metadata(*md, path) != -ENOENT) { attr->st_ino = md->inode_no(); attr->st_mode = md->mode(); attr->st_nlink = md->link_count(); Loading @@ -47,11 +40,11 @@ int adafs_getattr(const char *path, struct stat *attr, struct fuse_file_info *fi return 0; } if (strcmp(path, "/file") == 0) { if (strcmp(p, "/file") == 0) { attr->st_mode = S_IFDIR | 0755; return 0; } if (strcmp(path, "/file/file2") == 0) { if (strcmp(p, "/file/file2") == 0) { auto p_dir = make_shared<struct stat>(); lstat("/", p_dir.get()); ADAFS_DATA->logger->info(p_dir->st_ino); Loading @@ -66,19 +59,21 @@ int adafs_getattr(const char *path, struct stat *attr, struct fuse_file_info *fi } void *adafs_init(struct fuse_conn_info *conn, struct fuse_config *cfg) { // ADAFS_DATA->logger->info("init function"s); // ADAFS_DATA->logger->info("uid_: {}", fuse_get_context()->uid); // ADAFS_DATA->logger->info("gid_: {}", fuse_get_context()->gid); // ADAFS_DATA->logger->info("pid: {0:d}", fuse_get_context()->pid); // ADAFS_DATA->logger->info("rootdir: {}", ((struct adafs_data*)fuse_get_context()->private_data)->rootdir); //Initialize directory structure for metadata. XXX We need this later for lowlevel when we split dentry from inodes boost::filesystem::create_directories(ADAFS_DATA->rootdir + "/meta/dentries"s); boost::filesystem::create_directories(ADAFS_DATA->rootdir + "/meta/inodes"s); boost::filesystem::create_directories(ADAFS_DATA->rootdir + "/data/chunks"s); ADAFS_DATA->logger->info("Fuse init() enter"s); // Make sure directory structure exists bfs::create_directories(ADAFS_DATA->dentry_path); bfs::create_directories(ADAFS_DATA->inode_path); bfs::create_directories(ADAFS_DATA->chunk_path); bfs::create_directories(ADAFS_DATA->mgmt_path); // Check if fs already has some data and read the inode count if (bfs::exists(ADAFS_DATA->mgmt_path + "/inode_count")) util::read_inode_cnt(); else util::init_inode_no(); // XXX Dunno if this is of any use cfg->use_ino = 1; cfg->readdir_ino = 1; //Init file system configuration ADAFS_DATA->blocksize = 4096; Loading @@ -94,6 +89,7 @@ void *adafs_init(struct fuse_conn_info *conn, struct fuse_config *cfg) { ADAFS_DATA->logger->info("Root metadata not found. Initializing..."s); md->init_ACM_time(); md->mode(S_IFDIR | 0755); // XXX The gid and uid is the root user for some reason. Should be the user that mounted fuse. md->uid(fuse_get_context()->uid); md->gid(fuse_get_context()->gid); md->inode_no(ADAFS_ROOT_INODE); Loading @@ -109,6 +105,7 @@ void *adafs_init(struct fuse_conn_info *conn, struct fuse_config *cfg) { } void adafs_destroy(void *adafs_data) { util::write_inode_cnt(); delete ADAFS_DATA; } Loading Loading @@ -144,9 +141,10 @@ int main(int argc, char *argv[]) { argv[argc-1] = NULL; argc--; //set all paths a_data->inode_path = a_data->rootdir + "meta/inodes"s; a_data->dentry_path = a_data->rootdir + "meta/dentries"s; a_data->chunk_path = a_data->rootdir + "data/chunks"s; a_data->inode_path = a_data->rootdir + "/meta/inodes"s; a_data->dentry_path = a_data->rootdir + "/meta/dentries"s; a_data->chunk_path = a_data->rootdir + "/data/chunks"s; a_data->mgmt_path = a_data->rootdir + "/mgmt"s; //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. Loading
fs/src/main.h +7 −2 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ struct adafs_data { std::string inode_path; // used std::string dentry_path; // used std::string chunk_path; // unused std::string mgmt_path; // Caching std::unordered_map<std::string, std::string> hashmap; Loading @@ -35,7 +36,7 @@ struct adafs_data { // Housekeeping std::shared_ptr<spdlog::logger> logger; std::int64_t inode_count; uint64_t inode_count; std::mutex inode_mutex; // Later the blocksize will likely be coupled to the chunks to allow individually big chunk sizes. int32_t blocksize; Loading @@ -47,9 +48,13 @@ struct adafs_data { namespace util { boost::filesystem::path adafs_fullpath(const std::string& path); int reset_inode_no(); int init_inode_no(); ino_t generate_inode_no(); int read_inode_cnt(); int write_inode_cnt(); } #endif //MAIN_H