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

Added: adafs_ll_mkdir() finalized. Bugfix: inodes were not generated

parent b48dd578
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -13,14 +13,15 @@ using namespace std;
/**
 * Initializes the dentry directory to hold future dentries
 * @param inode
 * @return
 * @return err
 */
bool init_dentry_dir(const fuse_ino_t inode) {
    auto d_path = bfs::path(ADAFS_DATA->dentry_path());
    d_path /= to_string(inode);
    bfs::create_directories(d_path);
    // XXX This might not be needed as it is another access to the underlying file system
    return bfs::exists(d_path);
//    return bfs::exists(d_path);
    return 0;
}

/**
+14 −3
Original line number Diff line number Diff line
@@ -106,12 +106,23 @@ int remove_metadata(const fuse_ino_t inode) {
    return 0;
}

/**
 * Creates a new node (file or directory) in the file system. Fills given fuse_entry_param.
 * @param req
 * @param fep
 * @param parent
 * @param name
 * @param mode
 * @return err
 */
int create_node(fuse_req_t& req, struct fuse_entry_param& fep, fuse_ino_t parent, const string& name, mode_t mode) {

    // create metadata of new file (this will also create a new inode number)
    // mode is used here to init metadata
    auto md = make_shared<Metadata>(S_IFREG | mode, fuse_req_ctx(req)->uid, fuse_req_ctx(req)->gid, req);

    auto md = make_shared<Metadata>(mode, fuse_req_ctx(req)->uid, fuse_req_ctx(req)->gid, req);
    if ((mode & S_IFDIR) == S_IFDIR) {
        md->size(
                ADAFS_DATA->blocksize()); // XXX just visual. size computation of directory should be done properly at some point
    }
    // create directory entry (can fail) in adafs
    create_dentry(parent, md->inode_no(), name, mode);

+4 −4
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ class Dentry {

private:
    std::string name_;
    uint64_t inode_;
    fuse_ino_t inode_;
    mode_t mode_; // file type code (6 bits) + permission bits (9 bits rwx(user)rwx(group)rwx(others)

public:
@@ -19,15 +19,15 @@ public:

    Dentry(const std::string& name_);

    Dentry(const std::string &name_, uint64_t inode_, mode_t mode_);
    Dentry(const std::string& name_, fuse_ino_t inode_, mode_t mode_);

    const std::string& name() const;

    void name(const std::string& name_);

    uint64_t inode() const;
    fuse_ino_t inode() const;

    void inode(uint64_t inode_);
    void inode(fuse_ino_t inode_);

    mode_t mode() const;

+1 −1
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ Metadata::Metadata(mode_t mode, uint32_t uid, uint32_t gid, fuse_req_t& req) :
        size_(0),
        blocks_(0) {
    init_ACM_time();
    inode_no_ = Util::generate_inode_no(PRIV_DATA(req)->inode_mutex, PRIV_DATA(req)->inode_count);
    inode_no_ = Util::generate_inode_no(req);
}

Metadata::Metadata(mode_t mode, uid_t uid, gid_t gid, fuse_ino_t inode) :
+5 −1
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ void adafs_ll_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr, int to_
void adafs_ll_create(fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, struct fuse_file_info *fi);
void adafs_ll_mknod(fuse_req_t req, fuse_ino_t parent, const char *name, mode_t mode, dev_t rdev);

void adafs_ll_unlink(fuse_req_t req, fuse_ino_t p_inode, const char *name);
void adafs_ll_unlink(fuse_req_t req, fuse_ino_t parent, const char* name);
void adafs_ll_open(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi);
void adafs_ll_release(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi);

@@ -21,6 +21,10 @@ void adafs_ll_release(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info *fi)
void adafs_ll_lookup(fuse_req_t req, fuse_ino_t parent, const char* name);
void adafs_ll_opendir(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info* fi);
void adafs_ll_readdir(fuse_req_t req, fuse_ino_t ino, size_t size, off_t off, struct fuse_file_info* fi);

void adafs_ll_mkdir(fuse_req_t req, fuse_ino_t parent, const char* name, mode_t mode);

void adafs_ll_rmdir(fuse_req_t req, fuse_ino_t parent, const char* name);
void adafs_ll_releasedir(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info* fi);
// I/O

Loading