将内核内存写入ext2块

时间:2011-10-26 09:12:46

标签: c filesystems linux-kernel ext2

对于大学作业,我们必须修改ext2文件系统,以便在文件小于60字节的情况下将文件存储在inode的块指针中,并在文件大于此时移动到常规块存储。

我从2.6 linux内核源代码(按照指示)复制了ext2代码并从那里开始。

当文件大于60字节时,我需要将当前在inode的块指针数组中的任何数据复制到实际块中。所以,我需要将内核内存写入ext2块。对do_sync_write的简单调用在这里不起作用,因为它占用了用户空间。

我已经看过do_sync_write的实现了,我不确定如何复制它的功能,而是使用内核内存。

这是我当前对此特定部分的实现(不起作用):

ssize_t extmod_write(struct file *filp, const char *buf,
            size_t len, loff_t *ppos)
{
...
printk(KERN_INFO "Switching to regular file");
temp = kmalloc(inode->i_size, GFP_KERNEL);
memcpy(temp, EXT2_I(inode)->i_data, inode->i_size);

/* Need to clear the block pointers before they are allocated by kernel */
memset(EXT2_I(inode)->i_data, 0, sizeof(EXT2_I(inode)->i_data));

if (do_sync_write(filp, temp, inode->i_size, &dummy) < 0) {
    printk(KERN_INFO "DAMN! Writing current buffer failed");
    return -EINVAL;
}
kfree(temp);
return do_sync_write(filp, buf, len, ppos);

编辑:

我查看了符号链接。基本上,ext2具有“快速符号链接”的概念;即链接名称长度小于60个字节。如果它是一个快速符号链接,则数据存储在块指针中。这很容易做到,我已经为常规文件实现了这一点。如果链接不是快速符号链接,则数据的处理方式与常规文件相同。我想我已经回到原点了。

2 个答案:

答案 0 :(得分:1)

我设法搞清楚了。它需要获取struct buffer_head个实例并在其中读取/写入数据。通过循环逻辑块编号并使用ext2_get_block来检索块(必要时分配它们)然后使用sb_getblk来获取实际缓冲区并写入它。我在my blog上发布了一个实现。

答案 1 :(得分:1)

哑巴的家庭作业。

代码不起作用。试试mmap()并死掉。