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 }