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
相关产品推荐
相关产品推荐

