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