You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

file_operations::readdir()去向及Linux 6.X内核模块适配咨询

适配Linux 6.X内核的自定义目录遍历函数注册方法

在Linux 6.X内核中,file_operations里的readdir接口已被iterate或iterate_shared替代,具体适配步骤如下:

1. 调整函数签名

旧版my_readdir的签名一般是:

int my_readdir(struct file *filp, void *dirent, filldir_t filldir);

需要改成iterate_shared(推荐只读场景使用,线程安全)的签名:

loff_t my_iterate_shared(struct file *filp, struct dir_context *ctx);

如果你的文件系统需要支持可写的遍历场景,也可以用iterate接口,签名相同。

2. 移植函数逻辑

原来的filldir调用需要替换为dir_context结构体中的ctx->actor方法,同时用ctx->pos替代原来的位置参数。举个简单的移植示例:

// 旧版readdir中的填充逻辑
filldir(dirent, "test.txt", 8, pos, ino, DT_REG);

// 新版iterate_shared中的对应逻辑
if (!dir_emit(ctx, "test.txt", 8, ctx->pos, ino, DT_REG))
    return ctx->pos; // 填充失败直接返回当前位置
ctx->pos++; // 更新遍历位置

dir_emit是内核提供的封装函数,帮你调用ctx->actor并处理返回值,比直接调用ctx->actor更简洁。

3. 更新file_operations结构体

把原来指向my_readdir的.readdir字段,替换为指向新函数的.iterate_shared(或.iterate)字段:

static const struct file_operations my_fops = {
    .iterate_shared = my_iterate_shared, // 替换原.readdir
    .create = my_create, // 你已修复的create接口
    .mkdir = my_mkdir,   // 你已修复的mkdir接口
    // 其他原有字段
};

关键说明

dir_context结构体整合了旧版的filldir_t回调、遍历位置和其他上下文信息,是6.X内核中目录遍历的标准上下文载体。使用iterate_shared可以避免遍历过程中目录被修改导致的问题,是大多数场景下的首选。

内容的提问来源于stack exchange,提问作者fadedbee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:52:53