root/ompi/mca/fbtl/pvfs2/fbtl_pvfs2_preadv.c

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

DEFINITIONS

This source file includes following definitions.
  1. mca_fbtl_pvfs2_preadv

   1 /*
   2  * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
   3  *                         University Research and Technology
   4  *                         Corporation.  All rights reserved.
   5  * Copyright (c) 2004-2011 The University of Tennessee and The University
   6  *                         of Tennessee Research Foundation.  All rights
   7  *                         reserved.
   8  * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
   9  *                         University of Stuttgart.  All rights reserved.
  10  * Copyright (c) 2004-2005 The Regents of the University of California.
  11  *                         All rights reserved.
  12  * Copyright (c) 2008-2014 University of Houston. All rights reserved.
  13  * Copyright (c) 2017-2018 Research Organization for Information Science
  14  *                         and Technology (RIST). All rights reserved.
  15  * $COPYRIGHT$
  16  *
  17  * Additional copyrights may follow
  18  *
  19  * $HEADER$
  20  */
  21 
  22 /* This code is based on the PVFS2 ADIO module in ROMIO
  23  *   Copyright (C) 1997 University of Chicago.
  24  *   See COPYRIGHT notice in top-level directory.
  25  */
  26 
  27 #include "ompi_config.h"
  28 #include "fbtl_pvfs2.h"
  29 
  30 #include "mpi.h"
  31 #include <unistd.h>
  32 #include "ompi/constants.h"
  33 #include "ompi/mca/fbtl/fbtl.h"
  34 
  35 ssize_t  mca_fbtl_pvfs2_preadv (ompio_file_t *fh)
  36 {
  37     int i;
  38     int ret;
  39     size_t k;
  40     int merge = 0;
  41     char *merge_buf = NULL;
  42     size_t merge_length = 0;
  43     OMPI_MPI_OFFSET_TYPE merge_offset = 0;
  44     PVFS_sysresp_io resp_io;
  45     PVFS_Request file_req;
  46     PVFS_Request mem_req;
  47     mca_fs_pvfs2 *pvfs2_fs;
  48     ssize_t total_bytes_read=0;
  49 
  50     pvfs2_fs = (mca_fs_pvfs2 *)fh->f_fs_ptr;
  51 
  52     if (NULL == fh->f_io_array) {
  53         return OMPI_ERROR;
  54     }
  55 
  56     for (i=0 ; i<fh->f_num_of_io_entries ; i++) {
  57         if (fh->f_num_of_io_entries != i+1) {
  58             if (((OMPI_MPI_OFFSET_TYPE)fh->f_io_array[i].offset +
  59                  (ptrdiff_t)fh->f_io_array[i].length) ==
  60                 (OMPI_MPI_OFFSET_TYPE)fh->f_io_array[i+1].offset) {
  61                 if (!merge) {
  62                     merge_offset = (OMPI_MPI_OFFSET_TYPE)
  63                         fh->f_io_array[i].offset;
  64                     merge_length = fh->f_io_array[i].length;
  65                 }
  66                 merge_length += fh->f_io_array[i+1].length;
  67                 merge++;
  68                 continue;
  69             }
  70         }
  71         if (merge) {
  72             merge_buf = malloc (merge_length);
  73 
  74             ret = PVFS_Request_contiguous (merge_length,
  75                                            PVFS_BYTE,
  76                                            &mem_req);
  77             if (ret != 0) {
  78                 perror("PVFS_Request_contiguous() error");
  79                 return OMPI_ERROR;
  80             }
  81             ret = PVFS_Request_contiguous (merge_length,
  82                                            PVFS_BYTE,
  83                                            &file_req);
  84             if (ret != 0) {
  85                 perror("PVFS_Request_contiguous() error");
  86                 return OMPI_ERROR;
  87             }
  88             ret = PVFS_sys_read (pvfs2_fs->object_ref,
  89                                  file_req,
  90                                  merge_offset,
  91                                  merge_buf,
  92                                  mem_req,
  93                                  &(pvfs2_fs->credentials),
  94                                  &resp_io);
  95             if (ret != 0) {
  96                 perror("PVFS_sys_write() error");
  97                 return OMPI_ERROR;
  98             }
  99             total_bytes_read += (ssize_t)resp_io.total_completed;
 100 
 101             k = 0;
 102             while (merge >= 0) {
 103                 memcpy (fh->f_io_array[i-merge].memory_address,
 104                         merge_buf + k,
 105                         fh->f_io_array[i-merge].length);
 106                 k += fh->f_io_array[i-merge].length;
 107                 merge --;
 108             }
 109             merge = 0;
 110             merge_offset = 0;
 111             merge_length = 0;
 112             if (NULL != merge_buf) {
 113                 free (merge_buf);
 114                 merge_buf = NULL;
 115             }
 116         }
 117         else {
 118             ret = PVFS_Request_contiguous (fh->f_io_array[i].length,
 119                                            PVFS_BYTE,
 120                                            &mem_req);
 121             if (ret != 0) {
 122                 perror("PVFS_Request_contiguous() error");
 123                 return OMPI_ERROR;
 124             }
 125             ret = PVFS_Request_contiguous (fh->f_io_array[i].length,
 126                                            PVFS_BYTE,
 127                                            &file_req);
 128             if (ret != 0) {
 129                 perror("PVFS_Request_contiguous() error");
 130                 return OMPI_ERROR;
 131             }
 132             ret = PVFS_sys_read (pvfs2_fs->object_ref,
 133                                  file_req,
 134                                  (OMPI_MPI_OFFSET_TYPE)
 135                                  fh ->f_io_array[i].offset,
 136                                  fh->f_io_array[i].memory_address,
 137                                  mem_req,
 138                                  &(pvfs2_fs->credentials),
 139                                  &resp_io);
 140             if (ret != 0) {
 141                 perror("PVFS_sys_write() error");
 142                 return OMPI_ERROR;
 143             }
 144             total_bytes_read += (ssize_t)resp_io.total_completed;
 145         }
 146     }
 147 
 148     return total_bytes_read;
 149 }

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