EINVAL与gpfs_fcntl

时间:2013-04-22 11:26:42

标签: c++ c filesystems

我正在尝试在IO密码上使用预取提示。我根据我对gpfs_fcntl()手册页的理解设置了代码,但是得到了一个EINVAL。我现在有点迷失了我做错了 - 任何提示都很受欢迎。

装载:/dev/scratch16 on /bgscratch type gpfs (rw,dev=cadmos-gss.gss1a:scratch16,ldev=scratch16)

Error: Prefetch using gpfs_fcntl failed: Invalid argument (22), 32768b at 7713095680 from /bgscratch/foo.dat

档案:-rw-rw-r-- 1 delalond bbp 14739308544 Jul 25 2012 /bgscratch/foo.dat

来源:

void BufferedFile::prefetch( const uint64_t offset, const uint64_t size )
{
   if( file_.fd == -1 )
       file_.fd = ::open( filename.c_str(), O_RDONLY );
   if( file_.fd == -1 )
   {
       LBWARN << "open() failed: " << lunchbox::sysError << std::endl;
       return;
   }
   struct
   {
       gpfsFcntlHeader_t hdr;
       gpfsAccessRange_t acc;
   } arg;
   arg.hdr.totalLength = sizeof(arg);
   arg.hdr.fcntlVersion = GPFS_FCNTL_CURRENT_VERSION;
   arg.hdr.fcntlReserved = 0;
   arg.acc.structLen = sizeof(arg.acc);
   arg.acc.structType = GPFS_ACCESS_RANGE;
   arg.acc.start = offset;
   arg.acc.length = size;
   arg.acc.isWrite = 0;
   if( gpfs_fcntl( file_.fd, &arg ) != 0 )
        LBWARN << "Prefetch using gpfs_fcntl failed: " << lunchbox::sysError
               << ", " << size << "b at " << offset << " from " << filename
               << std::endl;
}

编辑:我可以在一个独立的应用程序中重现该问题,并且一旦启动大于4GB就会发生错误,即使它是一个很长的64位系统。

3 个答案:

答案 0 :(得分:0)

您正试图在文件结束后阅读。

鉴于fileSize,尝试类似

的内容
arg.acc.length = fileSize > offset + size ? size : fileSize - offset;

答案 1 :(得分:0)

您的offsetsizeuint64_t,无符号整数。虽然结构gpfsAccessRange_t的文档的元素startlengthoffset_t,但可能是有符号整数。你知道如何定义offset_t吗?

我还注意到HDF5使用off_t

答案 2 :(得分:0)

我忍不住注意到/bgscratch:如果您使用蓝色基因/ Q系统,除非您运行的是V1R2M1或更新版本,否则gpfs_fcntl()将无效。较旧的驱动程序版本不会将gpfs_fcntl系统调用中继到i / o节点。