root/ompi/mca/io/romio321/romio/adio/ad_xfs/ad_xfs_open.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ADIOI_XFS_Open

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
   2 /* 
   3  *
   4  *   Copyright (C) 1997 University of Chicago. 
   5  *   See COPYRIGHT notice in top-level directory.
   6  */
   7 
   8 #define _GNU_SOURCE          // for O_DIRECT
   9 
  10 #include "ad_xfs.h"
  11 #include <sys/ioctl.h>
  12 #ifdef HAVE_STDDEF_H
  13 #include <stddef.h>
  14 #endif
  15 
  16 #ifndef HAVE_LSEEK64
  17 #define lseek64 lseek
  18 #endif
  19 
  20 void ADIOI_XFS_Open(ADIO_File fd, int *error_code)
  21 {
  22     int perm, amode, amode_direct, factor;
  23     unsigned int old_mask;
  24     struct dioattr st;
  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;
  28 
  29     if (fd->perm == ADIO_PERM_NULL) {
  30         old_mask = umask(022);
  31         umask(old_mask);
  32         perm = old_mask ^ 0666;
  33     }
  34     else perm = fd->perm;
  35 
  36     amode = 0;
  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;
  45 
  46     amode_direct = amode | O_DIRECT;
  47 
  48     if (fd->access_mode & ADIO_EXCL)
  49         amode = amode | O_EXCL;
  50 
  51     fd->fd_sys = open(fd->filename, amode, perm);
  52 
  53     fd->fd_direct = open(fd->filename, amode_direct, perm);
  54     if (fd->fd_direct != -1) {
  55 
  56 #if defined(MPISGI)
  57         ioctl(fd->fd_direct, XFS_IOC_DIOINFO, &st);
  58 #else
  59         fcntl(fd->fd_direct, F_DIOINFO, &st);
  60 #endif
  61 
  62         fd->d_mem = st.d_mem;
  63         fd->d_miniosz = st.d_miniosz;
  64 
  65         if (read_chunk_sz == 0) {
  66                 fd->hints->fs_hints.xfs.read_chunk_sz = st.d_maxiosz;
  67         } else {
  68                 /*
  69                  * MPIO_DIRECT_READ_CHUNK_SIZE was set.
  70                  * Make read_chunk_sz a multiple of d_miniosz.
  71                  */
  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);
  76                 }
  77         }
  78 
  79         if (write_chunk_sz == 0) {
  80                 fd->hints->fs_hints.xfs.write_chunk_sz = st.d_maxiosz;
  81         } else {
  82                 /*
  83                  * MPIO_DIRECT_WRITE_CHUNK_SIZE was set. 
  84                  * Make write_chunk_sz a multiple of d_miniosz.
  85                  */
  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);
  90                 }
  91         }
  92 
  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");
  97             close(fd->fd_direct);
  98             fd->fd_direct = -1;
  99         }
 100     }
 101 
 102     if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND))
 103         fd->fp_ind = lseek64(fd->fd_sys, 0, SEEK_END);
 104 
 105     fd->fp_sys_posn = -1; /* set it to null because we use pread/pwrite */
 106 
 107     if ((fd->fd_sys == -1) || (fd->fd_direct == -1)) {
 108         *error_code = ADIOI_Err_create_code(mymame, fd->filename, errno);
 109     }
 110     else *error_code = MPI_SUCCESS;
 111 }

/* [<][>][^][v][top][bottom][index][help] */