冰天雪地裸身跪求...linux内核写大于2G文件的方法..
内核模块当写日志文件大于2G的时候就无法继续写入了....我是启用内核线程的方法写的..系统是CENTOS6.0 X86_64位的平台.线程函数如下:int threadfunc(void *data){
mm_segment_t fs;
//int temp=0;
loff_t pos=0;
filp = filp_open("/home/accsess",O_RDWR | O_CREAT | O_APPEND,0777);
if(IS_ERR(filp))
{
printk("open error...\n");
return 0;
}
fs=get_fs();
set_fs(KERNEL_DS);
while(1){
if(kthread_should_stop())
break;
wait_for_completion(&myWait);
printk(KERN_ALERT "start log\n");
pos=0;
//filp->f_op->write(filp,LOG_BUFF+writestart,writesize,&filp->f_pos);
vfs_write(filp,LOG_BUFF+writestart,writesize,&pos);
memset(LOG_BUFF+writestart,writesize,0);
//set_current_state(TASK_INTERRUPTIBLE);
}
set_fs(fs);
filp_close(filp,NULL);
return 0;
}
本帖最后由 q198816 于 2014-05-12 17:09 编辑
//filp->f_op->write(filp,LOG_BUFF+writestart,writesize,&filp->f_pos);
这个函数我也试过不行.
我网上查询了下写大于2G日志的方法解决方案都是 应用程序的解决办法是gcc 编译的时候加个参数 就可以了而且一般是32位系统才会出现.可是没有听说过内核出现这种问题.
或者编译内核模块的话 可以加个什么参数解决?
我文件偏移的几个整数都是unsigned long long的
我实在想不出是什么问题了 这个应该不会吧?具体返回什么错?是ulimit的限制么? filp_open加上O_LARGEFILE标志。
看代码,难道是一次性写入>2G的内存?? 谢谢4楼按你的方法解决了...不过我当时忘记回复了...以前没写过大文件... 看了下内核代码,64位内核会为每个open系统调用自动加上这个标志, 32位内核不会加。
没有这个标志的时候 , pos+count 不能大于MAX_NON_LFS(2G)否则会出错返回EFBIG或者写不进去。
所以64位下应用层不加这个标志应该也没问题,
页:
[1]