1 /* -*- Mode: C; c-basic-offset:4 ; -*- */
4 * Copyright (C) 1997 University of Chicago.
5 * See COPYRIGHT notice in top-level directory.
8 #define _GNU_SOURCE // for O_DIRECT
11 #include <sys/ioctl.h>
20 void ADIOI_XFS_Open(ADIO_File fd
, int *error_code
)
22 int perm
, amode
, amode_direct
, factor
;
23 unsigned int old_mask
;
25 static char myname
[] = "ADIOI_XFS_OPEN";
26 unsigned read_chunk_sz
= fd
->hints
->fs_hints
.xfs
.read_chunk_sz
;
27 unsigned write_chunk_sz
= fd
->hints
->fs_hints
.xfs
.write_chunk_sz
;
29 if (fd
->perm
== ADIO_PERM_NULL
) {
30 old_mask
= umask(022);
32 perm
= old_mask
^ 0666;
37 if (fd
->access_mode
& ADIO_CREATE
)
38 amode
= amode
| O_CREAT
;
39 if (fd
->access_mode
& ADIO_RDONLY
)
40 amode
= amode
| O_RDONLY
;
41 if (fd
->access_mode
& ADIO_WRONLY
)
42 amode
= amode
| O_WRONLY
;
43 if (fd
->access_mode
& ADIO_RDWR
)
44 amode
= amode
| O_RDWR
;
46 amode_direct
= amode
| O_DIRECT
;
48 if (fd
->access_mode
& ADIO_EXCL
)
49 amode
= amode
| O_EXCL
;
51 fd
->fd_sys
= open(fd
->filename
, amode
, perm
);
53 fd
->fd_direct
= open(fd
->filename
, amode_direct
, perm
);
54 if (fd
->fd_direct
!= -1) {
57 ioctl(fd
->fd_direct
, XFS_IOC_DIOINFO
, &st
);
59 fcntl(fd
->fd_direct
, F_DIOINFO
, &st
);
63 fd
->d_miniosz
= st
.d_miniosz
;
65 if (read_chunk_sz
== 0) {
66 fd
->hints
->fs_hints
.xfs
.read_chunk_sz
= st
.d_maxiosz
;
69 * MPIO_DIRECT_READ_CHUNK_SIZE was set.
70 * Make read_chunk_sz a multiple of d_miniosz.
72 factor
= read_chunk_sz
/ fd
->d_miniosz
;
73 if (factor
== 0 || read_chunk_sz
!= fd
->d_miniosz
* factor
) {
74 fd
->hints
->fs_hints
.xfs
.read_chunk_sz
=
75 fd
->d_miniosz
* (factor
+ 1);
79 if (write_chunk_sz
== 0) {
80 fd
->hints
->fs_hints
.xfs
.write_chunk_sz
= st
.d_maxiosz
;
83 * MPIO_DIRECT_WRITE_CHUNK_SIZE was set.
84 * Make write_chunk_sz a multiple of d_miniosz.
86 factor
= write_chunk_sz
/ fd
->d_miniosz
;
87 if (factor
== 0 || write_chunk_sz
!= fd
->d_miniosz
* factor
) {
88 fd
->hints
->fs_hints
.xfs
.write_chunk_sz
=
89 fd
->d_miniosz
* (factor
+ 1);
93 if (fd
->d_mem
> XFS_MEMALIGN
) {
94 FPRINTF(stderr
, "MPI: Run-time Direct-IO memory alignment, %d, does not match compile-time value, %d.\n",
95 fd
->d_mem
, XFS_MEMALIGN
);
96 FPRINTF(stderr
, "MPI: Report this error and rerun with Direct-IO disabled.\n");
102 if ((fd
->fd_sys
!= -1) && (fd
->access_mode
& ADIO_APPEND
))
103 fd
->fp_ind
= lseek64(fd
->fd_sys
, 0, SEEK_END
);
105 fd
->fp_sys_posn
= -1; /* set it to null because we use pread/pwrite */
107 if ((fd
->fd_sys
== -1) || (fd
->fd_direct
== -1)) {
108 *error_code
= MPIO_Err_create_code(MPI_SUCCESS
, MPIR_ERR_RECOVERABLE
,
109 myname
, __LINE__
, MPI_ERR_IO
, "**io",
110 "**io %s", strerror(errno
));
112 else *error_code
= MPI_SUCCESS
;