【问题标题】:inode i_private field to store private data用于存储私有数据的 inode i_private 字段
【发布时间】:2014-07-30 10:56:14
【问题描述】:

如果我需要存储特定于 inode 的数据,我可以使用这个字段吗? 上下文是我正在编写的一个 linux 模块,它需要为每个 inode 保存一个特定的结构(该模块的每个设备都有一个 inode)。

我知道在文件描述符中,我可以将数据存储在 private_data 字段中。 i_private 是 inode 的“对应”字段吗?

【问题讨论】:

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


    【解决方案1】:

    此字段由 fs 驱动程序使用。 ext4.h 节选:

    static inline ext4_io_end_t *ext4_inode_aio(struct inode *inode)
    {
        return inode->i_private;
    }
    
    static inline void ext4_inode_aio_set(struct inode *inode, ext4_io_end_t *io)
    {
        inode->i_private = io;
    }
    

    所以,如果您正在编写自己的文件系统,那完全没问题。但是,如果您使用现有文件系统中的 inode,则不应这样做,因为您会损坏 inode。

    【讨论】:

    • 是否有一个字段,例如文件描述符结构中的 private_data,可以用来存储我自己的数据而不会损坏 inode?​​span>
    • 你在用 inode 做什么?
    • 我正在创建一个名为“abc”的字符设备模块。而且我需要为每个设备存储一个结构('abc0'、'abc1'、...),因此每个将在特定设备上调用 open() 的用户都将获得设备的相应结构。即如果 2 个进程调用 open(abc0,..) 他们可以访问相同的结构。
    • 这正是我想到的实现方式(通过将数据插入inode)。如果有一个标准的,更优雅的方式,我全力以赴。
    • 您可以将struct cdev 嵌入到您的结构中,并在inode->i_cdev 上使用container_of 以使您的结构与已注册的字符设备相关联。在 LDD3 中查找示例,章节 about registrationopen/release methods
    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 2012-03-22
    • 2011-10-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多