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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
/*
Copyright (c) 2012 DataLab, s.l. <http://www.datalab.es>
This file is part of the cluster/ec translator for GlusterFS.
The cluster/ec translator for GlusterFS is free software: you can
redistribute it and/or modify it under the terms of the GNU General
Public License as published by the Free Software Foundation, either
version 3 of the License, or (at your option) any later version.
The cluster/ec translator for GlusterFS is distributed in the hope
that it will be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with the cluster/ec translator for GlusterFS. If not, see
<http://www.gnu.org/licenses/>.
*/
#ifndef __EC_DATA_H__
#define __EC_DATA_H__
#include "xlator.h"
#include "ec.h"
struct _ec_config;
typedef struct _ec_config ec_config_t;
struct _ec_fd;
typedef struct _ec_fd ec_fd_t;
struct _ec_inode;
typedef struct _ec_inode ec_inode_t;
union _ec_cbk;
typedef union _ec_cbk ec_cbk_t;
struct _ec_lock;
typedef struct _ec_lock ec_lock_t;
struct _ec_lock_link;
typedef struct _ec_lock_link ec_lock_link_t;
struct _ec_fop_data;
typedef struct _ec_fop_data ec_fop_data_t;
struct _ec_cbk_data;
typedef struct _ec_cbk_data ec_cbk_data_t;
struct _ec_heal;
typedef struct _ec_heal ec_heal_t;
typedef void (* ec_wind_f)(ec_t *, ec_fop_data_t *, int32_t);
typedef int32_t (* ec_handler_f)(ec_fop_data_t *, int32_t);
typedef void (* ec_resume_f)(ec_fop_data_t *, int32_t);
struct _ec_config
{
uint32_t version;
uint8_t algorithm;
uint8_t gf_word_size;
uint8_t bricks;
uint8_t redundancy;
uint32_t chunk_size;
};
struct _ec_fd
{
uintptr_t bad;
loc_t loc;
uintptr_t open;
int32_t flags;
};
struct _ec_inode
{
uintptr_t bad;
struct list_head entry_locks;
struct list_head inode_locks;
ec_heal_t * heal;
};
typedef int32_t (* fop_heal_cbk_t)(call_frame_t *, void * cookie, xlator_t *,
int32_t, int32_t, uintptr_t, uintptr_t,
uintptr_t, dict_t *);
typedef int32_t (* fop_fheal_cbk_t)(call_frame_t *, void * cookie, xlator_t *,
int32_t, int32_t, uintptr_t, uintptr_t,
uintptr_t, dict_t *);
union _ec_cbk
{
fop_access_cbk_t access;
fop_create_cbk_t create;
fop_discard_cbk_t discard;
fop_entrylk_cbk_t entrylk;
fop_fentrylk_cbk_t fentrylk;
fop_fallocate_cbk_t fallocate;
fop_flush_cbk_t flush;
fop_fsync_cbk_t fsync;
fop_fsyncdir_cbk_t fsyncdir;
fop_getxattr_cbk_t getxattr;
fop_fgetxattr_cbk_t fgetxattr;
fop_heal_cbk_t heal;
fop_fheal_cbk_t fheal;
fop_inodelk_cbk_t inodelk;
fop_finodelk_cbk_t finodelk;
fop_link_cbk_t link;
fop_lk_cbk_t lk;
fop_lookup_cbk_t lookup;
fop_mkdir_cbk_t mkdir;
fop_mknod_cbk_t mknod;
fop_open_cbk_t open;
fop_opendir_cbk_t opendir;
fop_readdir_cbk_t readdir;
fop_readdirp_cbk_t readdirp;
fop_readlink_cbk_t readlink;
fop_readv_cbk_t readv;
fop_removexattr_cbk_t removexattr;
fop_fremovexattr_cbk_t fremovexattr;
fop_rename_cbk_t rename;
fop_rmdir_cbk_t rmdir;
fop_setattr_cbk_t setattr;
fop_fsetattr_cbk_t fsetattr;
fop_setxattr_cbk_t setxattr;
fop_fsetxattr_cbk_t fsetxattr;
fop_stat_cbk_t stat;
fop_fstat_cbk_t fstat;
fop_statfs_cbk_t statfs;
fop_symlink_cbk_t symlink;
fop_truncate_cbk_t truncate;
fop_ftruncate_cbk_t ftruncate;
fop_unlink_cbk_t unlink;
fop_writev_cbk_t writev;
fop_xattrop_cbk_t xattrop;
fop_fxattrop_cbk_t fxattrop;
fop_zerofill_cbk_t zerofill;
};
struct _ec_lock
{
struct list_head list;
struct list_head waiting;
uintptr_t mask;
uintptr_t good_mask;
int32_t kind;
int32_t refs;
int32_t acquired;
int32_t have_size;
size_t size;
size_t size_delta;
uint64_t version;
uint64_t version_delta;
ec_fop_data_t * owner;
loc_t loc;
union
{
struct
{
entrylk_type type;
char * basename;
};
struct gf_flock flock;
};
};
struct _ec_lock_link
{
ec_lock_t * lock;
ec_fop_data_t * fop;
struct list_head wait_list;
};
struct _ec_fop_data
{
int32_t id;
int32_t refs;
int32_t state;
int32_t minimum;
int32_t expected;
int32_t winds;
int32_t jobs;
int32_t error;
ec_fop_data_t * parent;
xlator_t * xl;
call_frame_t * req_frame; // frame of the calling xlator
call_frame_t * frame; // frame used by this fop
struct list_head cbk_list; // sorted list of groups of answers
struct list_head answer_list; // list of answers
ec_cbk_data_t * answer; // accepted answer
int32_t lock_count;
int32_t locked;
ec_lock_link_t locks[2];
int32_t have_size;
uint64_t pre_size;
uint64_t post_size;
gf_lock_t lock;
ec_config_t config;
uint32_t flags;
uint32_t first;
uintptr_t mask;
uintptr_t remaining;
uintptr_t good;
uintptr_t bad;
ec_wind_f wind;
ec_handler_f handler;
ec_resume_f resume;
ec_cbk_t cbks;
void * data;
uint64_t user_size;
uint32_t head;
dict_t * xdata;
dict_t * dict;
int32_t int32;
uint32_t uint32;
uint64_t size;
off_t offset;
mode_t mode[2];
entrylk_cmd entrylk_cmd;
entrylk_type entrylk_type;
gf_xattrop_flags_t xattrop_flags;
dev_t dev;
inode_t * inode;
fd_t * fd;
struct iatt iatt;
char * str[2];
loc_t loc[2];
struct gf_flock flock;
struct iovec * vector;
struct iobref * buffers;
};
struct _ec_cbk_data
{
struct list_head list; // item in the sorted list of groups
struct list_head answer_list; // item in the list of answers
ec_fop_data_t * fop;
ec_cbk_data_t * next; // next answer in the same group
int32_t idx;
int32_t op_ret;
int32_t op_errno;
int32_t count;
uintptr_t mask;
dict_t * xdata;
dict_t * dict;
int32_t int32;
uintptr_t uintptr[3];
uint64_t size;
uint64_t version;
inode_t * inode;
fd_t * fd;
struct statvfs statvfs;
struct iatt iatt[5];
struct gf_flock flock;
struct iovec * vector;
struct iobref * buffers;
};
struct _ec_heal
{
gf_lock_t lock;
xlator_t * xl;
ec_fop_data_t * fop;
ec_fop_data_t * lookup;
loc_t loc;
struct iatt iatt;
char * symlink;
fd_t * fd;
int32_t done;
uintptr_t available;
uintptr_t good;
uintptr_t bad;
uintptr_t open;
uint64_t offset;
uint64_t size;
uint64_t version;
uint64_t raw_size;
};
ec_cbk_data_t * ec_cbk_data_allocate(call_frame_t * frame, xlator_t * this,
ec_fop_data_t * fop, int32_t id,
int32_t idx, int32_t op_ret,
int32_t op_errno);
ec_fop_data_t * ec_fop_data_allocate(call_frame_t * frame, xlator_t * this,
int32_t id, uint32_t flags,
uintptr_t target, int32_t minimum,
ec_wind_f wind, ec_handler_f handler,
ec_cbk_t cbks, void * data);
void ec_fop_data_acquire(ec_fop_data_t * fop);
void ec_fop_data_release(ec_fop_data_t * fop);
#endif /* __EC_DATA_H__ */
|