Понимать код файловой системы на основе leveldb - PullRequest
0 голосов
/ 04 сентября 2018

Я прочитал код levelfs - файловой системы fuse, использующей хранилище ключей-значений leveldb. В файле levelfs.c я не понимаю, почему они реализуют функцию levelfs_getattr (), как показано ниже:

static int
levelfs_getattr(const char *path, struct stat *stbuf)
{
int res;
db_iter_t *it;
const char *key, *val;
char *base_key;
size_t base_key_len, klen, vlen;
struct fuse_context *fuse_ctx = fuse_get_context();

memset(stbuf, sizeof(struct stat), 0);
stbuf->st_uid = fuse_ctx->uid;
stbuf->st_gid = fuse_ctx->gid;

/* root directory */
if (strcmp(path, "/") == 0) {
    stbuf->st_mode = S_IFDIR | 0755;
    stbuf->st_nlink = 2;
    return 0;
}
/* empty dir */
if (newdirs_exists(path)) {
    stbuf->st_mode = S_IFDIR | 0755;
    stbuf->st_nlink = 2;
    return 0;
}

res = -ENOENT;
base_key = path_to_key(path, &base_key_len, 0);
it = db_iter_seek(CTX_DB, base_key, base_key_len);

while ((key = db_iter_next(it, &klen)) != NULL) {
    if (base_key_len == klen) {
        /* exact match = file */
        stbuf->st_mode = S_IFREG | 0666;
        stbuf->st_nlink = 1;
        val = db_iter_value(it, &vlen);
        stbuf->st_size = vlen;
        res = 0;
        break;
    } else if (sepcmp(key+base_key_len, klen - base_key_len) == 0) {
        /* sublevel = directory */
        stbuf->st_mode = S_IFDIR | 0755;
        stbuf->st_nlink = 2;
        res = 0;
        break;
    }
}   
db_iter_close(it);
free(base_key);

return res;
}

Почему они используют итератор для получения размера файла вместо использования db_get () для получения размера файла?

...