q198816 发表于 2014-05-12 17:04

冰天雪地裸身跪求...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: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的
我实在想不出是什么问题了

humjb_1983 发表于 2014-05-12 18:37

这个应该不会吧?具体返回什么错?是ulimit的限制么?

mattwu 发表于 2014-05-14 19:41

filp_open加上O_LARGEFILE标志。

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

q198816 发表于 2014-05-28 09:28

谢谢4楼按你的方法解决了...不过我当时忘记回复了...以前没写过大文件...

gaojl0728 发表于 2014-05-28 11:02

看了下内核代码,64位内核会为每个open系统调用自动加上这个标志, 32位内核不会加。

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

所以64位下应用层不加这个标志应该也没问题,
页: [1]
查看完整版本: 冰天雪地裸身跪求...linux内核写大于2G文件的方法..