免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1811 | 回复: 5
打印 上一主题 下一主题

[内核模块] 冰天雪地裸身跪求...linux内核写大于2G文件的方法.. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-12 17:04 |只看该作者 |倒序浏览
内核模块当写日志文件大于2G的时候就无法继续写入了....我是启用内核线程的方法写的..系统是CENTOS6.0 X86_64位的平台.
线程函数如下:
  1. int threadfunc(void *data){
  2.         mm_segment_t fs;
  3.         //int temp=0;
  4.         loff_t pos=0;
  5.         filp = filp_open("/home/accsess",O_RDWR | O_CREAT | O_APPEND,0777);
  6.         if(IS_ERR(filp))
  7.         {
  8.            printk("open error...\n");
  9.            return 0;
  10.                 }
  11.         fs=get_fs();
  12.         set_fs(KERNEL_DS);


  13.         while(1){
  14.         if(kthread_should_stop())
  15.         break;
  16.         wait_for_completion(&myWait);
  17.         printk(KERN_ALERT "start log\n");

  18.         pos=0;
  19.         //filp->f_op->write(filp,LOG_BUFF+writestart,writesize,&filp->f_pos);
  20.         vfs_write(filp,LOG_BUFF+writestart,writesize,&pos);

  21.         memset(LOG_BUFF+writestart,writesize,0);
  22.         //set_current_state(TASK_INTERRUPTIBLE);

  23.         }
  24.         set_fs(fs);
  25.         filp_close(filp,NULL);


  26. return 0;


  27. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2014-05-12 17:08 |只看该作者
本帖最后由 q198816 于 2014-05-12 17:09 编辑

//filp->f_op->write(filp,LOG_BUFF+writestart,writesize,&filp->f_pos);
这个函数我也试过不行.
我网上查询了下写大于2G日志的方法  解决方案都是 应用程序的解决办法是gcc 编译的时候加个参数 就可以了而且一般是32位系统才会出现.可是没有听说过内核出现这种问题.
或者编译内核模块的话 可以加个什么参数解决?

我文件偏移的几个整数都是unsigned long long的
我实在想不出是什么问题了

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
3 [报告]
发表于 2014-05-12 18:37 |只看该作者
这个应该不会吧?具体返回什么错?是ulimit的限制么?

论坛徽章:
0
4 [报告]
发表于 2014-05-14 19:41 |只看该作者
filp_open加上O_LARGEFILE标志。

看代码,难道是一次性写入>2G的内存??

论坛徽章:
0
5 [报告]
发表于 2014-05-28 09:28 |只看该作者
谢谢4楼按你的方法解决了...不过我当时忘记回复了...以前没写过大文件...

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
6 [报告]
发表于 2014-05-28 11:02 |只看该作者
看了下内核代码,  64位内核会为每个open系统调用自动加上这个标志, 32位内核不会加。

没有这个标志的时候 , pos+count 不能大于MAX_NON_LFS(2G)否则会出错返回EFBIG或者写不进去。

所以64位下应用层不加这个标志应该也没问题,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP