root/ompi/mca/io/romio321/romio/adio/ad_lustre/ad_lustre_fcntl.c

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

DEFINITIONS

This source file includes following definitions.
  1. ADIOI_LUSTRE_Fcntl

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
   2 /* 
   3  *   Copyright (C) 1997 University of Chicago. 
   4  *   See COPYRIGHT notice in top-level directory.
   5  *
   6  *   Copyright (C) 2007 Oak Ridge National Laboratory
   7  */
   8 
   9 #include "ad_lustre.h"
  10 #include "adio_extern.h"
  11 
  12 void ADIOI_LUSTRE_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *error_code)
  13 {
  14     int i, ntimes;
  15     ADIO_Offset curr_fsize, alloc_size, size, len, done;
  16     ADIO_Status status;
  17     char *buf;
  18 #if defined(MPICH) || !defined(PRINT_ERR_MSG)
  19     static char myname[] = "ADIOI_LUSTRE_FCNTL";
  20 #endif
  21 
  22     switch(flag) {
  23     case ADIO_FCNTL_GET_FSIZE:
  24         fcntl_struct->fsize = lseek(fd->fd_sys, 0, SEEK_END);
  25         if (fd->fp_sys_posn != -1) 
  26              lseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET);
  27         if (fcntl_struct->fsize == -1) {
  28             *error_code = MPIO_Err_create_code(MPI_SUCCESS, 
  29                     MPIR_ERR_RECOVERABLE, myname, __LINE__, 
  30                     MPI_ERR_IO, "**io", "**io %s", strerror(errno));
  31         }
  32         else *error_code = MPI_SUCCESS;
  33         break;
  34 
  35     case ADIO_FCNTL_SET_DISKSPACE:
  36         /* will be called by one process only */
  37         /* On file systems with no preallocation function, I have to 
  38            explicitly write 
  39            to allocate space. Since there could be holes in the file, 
  40            I need to read up to the current file size, write it back, 
  41            and then write beyond that depending on how much 
  42            preallocation is needed.
  43            read/write in sizes of no more than ADIOI_PREALLOC_BUFSZ */
  44 
  45         curr_fsize = lseek(fd->fd_sys, 0, SEEK_END);
  46         alloc_size = fcntl_struct->diskspace;
  47 
  48         size = ADIOI_MIN(curr_fsize, alloc_size);
  49         
  50         ntimes = (size + ADIOI_PREALLOC_BUFSZ - 1)/ADIOI_PREALLOC_BUFSZ;
  51         buf = (char *) ADIOI_Malloc(ADIOI_PREALLOC_BUFSZ);
  52         done = 0;
  53 
  54         for (i=0; i<ntimes; i++) {
  55             len = ADIOI_MIN(size-done, ADIOI_PREALLOC_BUFSZ);
  56             ADIO_ReadContig(fd, buf, len, MPI_BYTE, ADIO_EXPLICIT_OFFSET, done,
  57                             &status, error_code);
  58             if (*error_code != MPI_SUCCESS) {
  59                 *error_code = MPIO_Err_create_code(MPI_SUCCESS, 
  60                         MPIR_ERR_RECOVERABLE, myname, __LINE__, 
  61                         MPI_ERR_IO, "**io", "**io %s", strerror(errno));
  62                 return;  
  63             }
  64             ADIO_WriteContig(fd, buf, len, MPI_BYTE, ADIO_EXPLICIT_OFFSET, 
  65                              done, &status, error_code);
  66             if (*error_code != MPI_SUCCESS) return;
  67             done += len;
  68         }
  69 
  70         if (alloc_size > curr_fsize) {
  71             memset(buf, 0, ADIOI_PREALLOC_BUFSZ); 
  72             size = alloc_size - curr_fsize;
  73             ntimes = (size + ADIOI_PREALLOC_BUFSZ - 1)/ADIOI_PREALLOC_BUFSZ;
  74             for (i=0; i<ntimes; i++) {
  75                 len = ADIOI_MIN(alloc_size-done, ADIOI_PREALLOC_BUFSZ);
  76                 ADIO_WriteContig(fd, buf, len, MPI_BYTE, ADIO_EXPLICIT_OFFSET, 
  77                                  done, &status, error_code);
  78                 if (*error_code != MPI_SUCCESS) return;
  79                 done += len;  
  80             }
  81         }
  82         ADIOI_Free(buf);
  83         if (fd->fp_sys_posn != -1) 
  84             lseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET);
  85         *error_code = MPI_SUCCESS;
  86         break;
  87 
  88     case ADIO_FCNTL_SET_ATOMICITY:
  89         fd->atomicity = (fcntl_struct->atomicity == 0) ? 0 : 1;
  90         *error_code = MPI_SUCCESS;
  91         break;
  92 
  93     default:
  94         FPRINTF(stderr, "Unknown flag passed to ADIOI_LUSTRE_Fcntl\n");
  95         MPI_Abort(MPI_COMM_WORLD, 1);
  96     }
  97 }

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