为什么我的文件系统的readdir方法返回的目录大小不正确?

时间:2018-10-05 02:17:07

标签: filesystems inode readdir

这是我的操作系统课程中的一项家庭作业问题,我应该为一个简单的文件系统修复create和readdir方法。我已经修复了create方法(文件使用ls -als正确报告大小),但是目录报告了我的inode结构*的大小,但是其中包含许多文件。虽然可以,但我觉得我可以更精确。我想我想跟随目录数据块中的指针,然后对子文件的i_sizes求和,但是如果我想嵌套目录怎么办?我真的很感谢有关如何实现此目标的一些指导,

我的Readdir方法:

static int
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
vvsfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
#else
vvsfs_readdir(struct file *filp, struct dir_context *ctx)
#endif
{
    struct inode *i;
    struct vvsfs_inode dirdata;
    int num_dirs;
    struct vvsfs_dir_entry *dent;
    int error, k;

    if (DEBUG) printk("vvsfs - readdir\n");

#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
    i = filp->f_dentry->d_inode;
#else
    i = file_inode(filp);
#endif
    vvsfs_readblock(i->i_sb, i->i_ino, &dirdata);
    num_dirs = dirdata.size / sizeof(struct vvsfs_dir_entry);

    if (DEBUG) printk("Number of entries %d fpos %Ld\n", num_dirs, filp->f_pos);

    error = 0;
    k=0;
    dent = (struct vvsfs_dir_entry *) &dirdata.data;
    while (!error && filp->f_pos < dirdata.size && k < num_dirs) 
    {
        printk("adding name : %s ino : %d\n",dent->name, dent->inode_number);
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
        error = filldir(dirent, 
            dent->name, strlen(dent->name), filp->f_pos, dent->inode_number,DT_REG);
        if (error)
            break;
        filp->f_pos += sizeof(struct vvsfs_dir_entry);

#else
        if (dent->inode_number) 
        {
            if (!dir_emit (ctx, dent->name, strnlen (dent->name, MAXNAME),
                dent->inode_number, DT_UNKNOWN)) return 0;
        }
        ctx->pos += sizeof(struct vvsfs_dir_entry);
#endif
        k++;
        dent++;
    }
    // update_atime(i);
    // Sizes updated here
    i->i_size = dirdata.size;   
    printk("inode size is now %d", i->i_size);
    mark_inode_dirty(i);


    printk("done readdir\n");

    return 0;
}

我简单的inode结构

struct vvsfs_inode
{
    int is_empty;
    int is_directory;
    int size;
    char data[MAXFILESIZE];
};

0 个答案:

没有答案