使用filp_open创建文件后系统启动后无法查看该文件的问题求助
内核态创建/tmp文件失败的问题分析与修复
核心问题点
1. 错误判断逻辑失效
你的file_open函数在filp为错误指针时返回NULL,但主代码里只用IS_ERR(fp)判断错误——IS_ERR仅能识别指向错误码的指针(如PTR_ERR返回的负数地址),无法检测NULL。这导致即使文件打开失败,printk也不会触发,你看不到任何错误提示。
2. /tmp目录挂载时机不匹配
内核启动阶段,/tmp通常还未挂载tmpfs(多数系统会在用户态初始化阶段完成挂载)。此时你创建的文件实际写入根文件系统的/tmp目录,但后续tmpfs挂载后会覆盖该目录,导致系统启动后看不到文件。
3. 父目录存在性未验证
如果根文件系统中原本没有/tmp目录,O_CREAT仅能创建文件,无法自动创建父目录,会直接导致文件创建失败。
修复方案
修正错误判断逻辑
修改file_open函数,直接返回filp(无论是否为错误指针),让调用者通过IS_ERR统一判断:
struct file *file_open(const char *path, int flags, int rights) { struct file *filp = NULL; mm_segment_t oldfs; oldfs = get_fs(); set_fs(get_ds()); filp = filp_open(path, flags, rights); set_fs(oldfs); return filp; // 直接返回,由调用者处理错误 }
同时更新主代码的错误处理,添加错误码打印:
struct file *fp; fp = file_open("/tmp/sample-logfile", O_CREAT|O_WRONLY|O_TRUNC, 0666); if (IS_ERR(fp)) { printk(KERN_EMERG "Create record file error! Err code: %ld\n", PTR_ERR(fp)); } else { file_close(fp); }
调整文件路径或执行时机
- 如果必须在内核启动早期执行,改用根文件系统中已存在的目录(如
/var/log),避免依赖未挂载的tmpfs。 - 若要使用
/tmp,确保代码在用户态完成tmpfs挂载后再执行(比如通过内核模块加载时机控制)。
确保父目录存在
在创建文件前,先验证/tmp目录是否存在,若不存在可通过kern_path等内核API创建目录(需额外处理),或提前在根文件系统中创建该目录。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

