2012-03-05 19 views
1

我注意到,当我在我的块设备驱动程序文件(/ dev/mybd)上调用lseek64时,它总是失败。 (我可以打开,在/ dev/mybd上读写)。lseek64是否会引发任何设备特定的操作?

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

lseek是否需要任何块设备支持?或者它是一个纯粹的内核功能?

+1

是的。你尝试了什么? – 2012-03-05 09:09:16

+0

@BasileStarynkevitch那么我应该怎么做才能让我的设备驱动程序支持lseek? – yangsuli 2012-03-05 09:13:32

+0

我不是内核专家。你读过http://www.makelinux.net/ldd3/chp-16-sect-2 – 2012-03-05 09:17:53

回答

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魔术。

0

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

在file_operation结构中,所有与设备相关的函数都将与相关的系统调用进行映射。像读取,写入,打开所有将与特定的设备驱动程序代码链接。因此,无论何时调用这些函数,内核都会运行与该调用链接的设备驱动程序代码。如果设备驱动程序从不实现一个调用,则相应的值将被指定为NULL。在这种情况下,如果您调用NULL指定的调用,则调用将始终失败。

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

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

相关问题