lseek64是否会产生任何特定于设备的操作?

时间:2012-03-05 09:08:04

标签: c linux-kernel linux-device-driver

我注意到当我在块设备驱动文件(/ dev / mybd)上调用lseek64时,它总是失败。 (我可以在/ dev / mybd上打开,读取和写入)。

但是,如果我可以在/ dev / sdb上使用相同的参数lseek64,这是一个sata磁盘,它总是成功。

lseek是否需要任何块设备支持?或者它是一个纯内核函数?

2 个答案:

答案 0 :(得分:3)

查看代码,阻止设备的默认搜索位于fs/block_dev.c

static loff_t block_llseek(struct file *file, loff_t offset, int origin)
{
        struct inode *bd_inode = file->f_mapping->host;
        loff_t size;
        loff_t retval;

        mutex_lock(&bd_inode->i_mutex);
        size = i_size_read(bd_inode);

        retval = -EINVAL;
        switch (origin) {
                case SEEK_END:
                        offset += size;
                        break;
                case SEEK_CUR:
                        offset += file->f_pos;
                case SEEK_SET:
                        break;
                default:
                        goto out;
        }
        if (offset >= 0 && offset <= size) {
                if (offset != file->f_pos) {
                        file->f_pos = offset;
                }
                retval = offset;
        }
out:
        mutex_unlock(&bd_inode->i_mutex);
        return retval;
}

不调用特定的块设备。唯一的特殊要求是i_size_read,这只是一些SMP魔法。

答案 1 :(得分:0)

lseek是一个系统调用。它是内核特定的。您必须为您的设备实现此功能,并应在llseek调用中添加设备驱动程序的“file_operations”结构。

在file_operation结构中,所有与设备相关的功能都将与相关的系统调用进行映射。像read,write,open都将与特定的设备驱动程序代码链接。因此,无论何时调用这些函数,内核都将运行与调用链接的设备驱动程序代码。如果设备驱动程序从未实现调用,则相应的值将指定为NULL。在这种情况下,如果调用NULL指定的调用,则调用将始终失败。

但是在lseek中,如果'file_operations'结构链接为NULL,则内核将处理指向文件位置的'file'结构指针。这可能会产生不可预测的结果。但无论如何,这个电话会起作用(根据o'relley出版的linux设备驱动程序)。

所以我不确定这里真正的问题是什么。所以如果你还没有真正实现lseek调用,请再次实现并尝试。