Commit fd1f61fd authored by Marc Vef's avatar Marc Vef
Browse files

Lookup for dentry, read metadata for path implemented, cleanup

parent e22e0efe
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+21 −4
Original line number Diff line number Diff line
@@ -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
+2 −0
Original line number Diff line number Diff line
@@ -9,4 +9,6 @@

bool init_dentry(const unsigned long& hash);

bool verify_dentry(const bfs::path& path);

#endif //FS_DENTRY_OPS_H
+29 −31
Original line number Diff line number Diff line
@@ -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();
@@ -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);
@@ -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;
@@ -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);
@@ -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;
}

@@ -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.
+7 −2
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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