This source file includes following definitions.
- mca_fbtl_pvfs2_pwritev
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 <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
74
75
76
77
78
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 }