This source file includes following definitions.
- mca_fbtl_pvfs2_preadv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 }