Is O_DIRECT supported on Lustre for write()?
I got an EINVAL error when I write to a file opened with mode O_DIRECT.
The write amount is the same as the file system block size, which is 4MB
on the machine I ran. According to Lustre manual, this should be fine as
long as the I/O is aligned with 512B. Read is fine, though.
Attached is the the code. I compiled it with gcc.
Wei-keng
-------------- next part --------------
#include <stdio.h>
#include <stdlib.h>
#define __USE_GNU
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /* __USE_GNU to use O_DIRECT defined in bits/fcntl.h
*/
#include <unistd.h>
#include <errno.h>
extern int errno;
/*---< main()
>-------------------------------------------------------------*/
int main(int argc, char **argv)
{
int i, err, fd, block_size;
mode_t io_mode;
char *buf, *filename;
long long offset = 0;
struct stat statBuf;
filename = "/cfs/projects/widescratch/users/wkliao/testfile.dat";
/* get system block size */
stat(filename, &statBuf);
block_size = statBuf.st_blksize;
printf("Writing to file: %s
block_size=%d\n",filename,block_size);
buf = (char*) malloc(block_size);
for (i=0; i<block_size; i++) buf[i] = ''z'';
io_mode = O_CREAT | O_WRONLY | O_DIRECT;
fd = open(filename, io_mode, 0600);
if (fd == -1) printf("Error when open file %s\n", filename);
err = write(fd, buf, block_size);
if (err == -1)
printf("WRITE Error: offset=%lld len=%d -
errno=%d(EINVAL=%d)\n",offset,block_size,errno,EINVAL);
else
printf("WRITE Success: offset=%lld len=%d
err=%d\n",offset,block_size,err);
else
printf("WRITE Success: offset=%lld len=%d
err=%d\n",offset,block_size,err);
close(fd);
free(buf);
return 0;
}