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

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

DEFINITIONS

This source file includes following definitions.
  1. mca_fbtl_pvfs2_pwritev

   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 <sys/uio.h>
  33 #include "ompi/constants.h"
  34 #include "ompi/mca/fbtl/fbtl.h"
  35 
  36 ssize_t  mca_fbtl_pvfs2_pwritev (ompio_file_t *fh )
  37 {
  38     int i;
  39     int merge = 0;
  40     int ret;
  41     size_t k;
  42     char *merge_buf = NULL;
  43     size_t merge_length = 0;
  44     OMPI_MPI_OFFSET_TYPE merge_offset = 0;
  45     PVFS_sysresp_io resp_io;
  46     PVFS_Request file_req;
  47     PVFS_Request mem_req;
  48     mca_fs_pvfs2 *pvfs2_fs;
  49     ssize_t total_bytes_written=0;
  50 
  51     pvfs2_fs = (mca_fs_pvfs2 *)fh->f_fs_ptr;
  52 
  53     if (NULL == fh->f_io_array) {
  54         return OMPI_ERROR;
  55     }
  56 
  57     for (i=0 ; i<fh->f_num_of_io_entries ; i++) {
  58         if (fh->f_num_of_io_entries != i+1) {
  59             if (((OMPI_MPI_OFFSET_TYPE)fh->f_io_array[i].offset +
  60                  (ptrdiff_t)fh->f_io_array[i].length) ==
  61                 (OMPI_MPI_OFFSET_TYPE)fh->f_io_array[i+1].offset) {
  62                 if (!merge) {
  63                     merge_offset = (OMPI_MPI_OFFSET_TYPE)
  64                         fh->f_io_array[i].offset;
  65                     merge_length = fh->f_io_array[i].length;
  66                 }
  67                 merge_length += fh->f_io_array[i+1].length;
  68                 merge++;
  69                 continue;
  70             }
  71         }
  72         /*
  73           printf ("RANK: %d Entries: %d MERGE: %d \n", fh->f_rank,fh->f_num_of_io_entries,merge);
  74           if (merge)
  75           printf ("Merge size: %lld\n",merge_length);
  76           else
  77           printf ("entry size: %lld\n",fh->f_io_array[i].length);
  78           sleep(2);
  79         */
  80         if (merge) {
  81             merge_buf = malloc (merge_length);
  82             k = 0;
  83             while (merge >= 0) {
  84                 memcpy (merge_buf + k,
  85                         fh->f_io_array[i-merge].memory_address,
  86                         fh->f_io_array[i-merge].length);
  87                 k += fh->f_io_array[i-merge].length;
  88                 merge --;
  89             }
  90 
  91             ret = PVFS_Request_contiguous (merge_length,
  92                                            PVFS_BYTE,
  93                                            &mem_req);
  94             if (ret != 0) {
  95                 perror("PVFS_Request_contiguous() error");
  96                 return OMPI_ERROR;
  97             }
  98             ret = PVFS_Request_contiguous (merge_length,
  99                                            PVFS_BYTE,
 100                                            &file_req);
 101             if (ret != 0) {
 102                 perror("PVFS_Request_contiguous() error");
 103                 return OMPI_ERROR;
 104             }
 105             ret = PVFS_sys_write (pvfs2_fs->object_ref,
 106                                   file_req,
 107                                   merge_offset,
 108                                   merge_buf,
 109                                   mem_req,
 110                                   &(pvfs2_fs->credentials),
 111                                   &resp_io);
 112             if (ret != 0) {
 113                 perror("PVFS_sys_write() error");
 114                 return OMPI_ERROR;
 115             }
 116             total_bytes_written += (ssize_t)resp_io.total_completed;
 117 
 118             merge = 0;
 119             merge_offset = 0;
 120             merge_length = 0;
 121             if (NULL != merge_buf) {
 122                 free (merge_buf);
 123                 merge_buf = NULL;
 124             }
 125         }
 126         else {
 127             ret = PVFS_Request_contiguous (fh->f_io_array[i].length,
 128                                            PVFS_BYTE,
 129                                            &mem_req);
 130             if (ret != 0) {
 131                 perror("PVFS_Request_contiguous() error");
 132                 return OMPI_ERROR;
 133             }
 134             ret = PVFS_Request_contiguous (fh->f_io_array[i].length,
 135                                            PVFS_BYTE,
 136                                            &file_req);
 137             if (ret != 0) {
 138                 perror("PVFS_Request_contiguous() error");
 139                 return OMPI_ERROR;
 140             }
 141             ret = PVFS_sys_write (pvfs2_fs->object_ref,
 142                                   file_req,
 143                                   (OMPI_MPI_OFFSET_TYPE)
 144                                   fh ->f_io_array[i].offset,
 145                                   fh->f_io_array[i].memory_address,
 146                                   mem_req,
 147                                   &(pvfs2_fs->credentials),
 148                                   &resp_io);
 149             if (ret != 0) {
 150                 perror("PVFS_sys_write() error");
 151                 return OMPI_ERROR;
 152             }
 153             total_bytes_written += (ssize_t)resp_io.total_completed;
 154 
 155         }
 156     }
 157 
 158     return total_bytes_written;
 159 }

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