Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updation of number of inode links not persisted #22

Open
OmSaran opened this issue Nov 19, 2021 · 4 comments
Open

Updation of number of inode links not persisted #22

OmSaran opened this issue Nov 19, 2021 · 4 comments

Comments

@OmSaran
Copy link
Contributor

OmSaran commented Nov 19, 2021

Consider the example scenario:
A new filesystem that has only /mlfs

  1. Check the number of nlinks for /mlfs, it returns 1
  2. Create a directory /mlfs/A
  3. Check the number of nlinks again, it returns 2 (from DRAM)
  4. First 3 steps run in the same process.
  5. In a new program check the number of nlinks for /mlfs it returns 1 (This should be 2)

If my understanding is correct we have not persisted it during log digestion.

I attempted a fix for this here: #21

Here's the sample program I used to test it:

create.c

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <assert.h>

#include <mlfs/mlfs_interface.h>

#define PARENT_DIR "/mlfs"
#define CHILD_DIR "/mlfs/A"

int main() {
    init_fs();
    int ret;
    struct stat statbuf;

    lstat(PARENT_DIR, &statbuf);
    printf("nlinks before creating = %ld\n", statbuf.st_nlink);

    ret = mkdir(CHILD_DIR, 0777);
    assert(ret == 0);

    lstat(PARENT_DIR, &statbuf);
    printf("nlinks after creating = %ld\n", statbuf.st_nlink);
    shutdown_fs();
}

check.c

#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <assert.h>
#include <unistd.h>

#include <mlfs/mlfs_interface.h>

#define PARENT_DIR "/mlfs"
#define CHILD_DIR "/mlfs/A"

int main() {
    init_fs();

    int ret;
    struct stat statbuf;

    ret = access(CHILD_DIR, F_OK);
    assert(ret == 0);

    printf("%s exists!\n", CHILD_DIR);

    assert(lstat(PARENT_DIR, &statbuf) == 0);
    printf("nlinks = %ld\n", statbuf.st_nlink);

    shutdown_fs();
}
@cmolder
Copy link
Contributor

cmolder commented Nov 20, 2021

The access control group has had a similar issue with some custom inode params. We've been adding user/group/permission fields to the inode/stat and, although they are processed properly in-memory (e.g. mlfs_object_create) when writing to a new file, these fields revert to zero when we close and reopen the same file later. It seems like these changes aren't being conveyed to the disk during digestion.

@OmSaran
Copy link
Contributor Author

OmSaran commented Nov 20, 2021

Based on my understanding, it is updated in the cache properly in LibFS, but during digestion, some inode updates (particularly nlinks in my case) are not being captured/digested. I guess you have the same issue after adding new attributes to the inode.

If my understanding is correct, you could attempt to add corresponding updates at the same place where I have added the fix for nlinks. The PR is here: #21

@cmolder
Copy link
Contributor

cmolder commented Nov 21, 2021

Implementing #21 worked for me, at least for the other fields. Thanks!

@wreda
Copy link
Contributor

wreda commented Nov 30, 2021

Thanks for the fix. This is now merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants