"SfR Fresh" - the SfR Freeware/Shareware Archive 
Member "pvfs-2.7.1/src/client/sysint/sys-rename.c" of archive pvfs-2.7.1.tar.gz:
As a special service "SfR Fresh" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting with prefixed line numbers.
Alternatively you can here view or download the uninterpreted source code file.
That can be also achieved for any archive member file by clicking within an archive contents listing on the first character of the file(path) respectively on the according byte size field.
1 /* WARNING: THIS FILE IS AUTOMATICALLY GENERATED FROM A .SM FILE.
2 * Changes made here will certainly be overwritten.
3 */
4
5 /*
6 * (C) 2003 Clemson University and The University of Chicago
7 *
8 * Changes by Acxiom Corporation to add extra safety checks via getattr
9 * Copyright © Acxiom Corporation, 2005.
10 *
11 * See COPYING in top-level directory.
12 */
13
14 /** \file
15 * \ingroup sysint
16 *
17 * PVFS2 system interface routines for renaming an object (file
18 * or directory).
19 */
20
21 #include <string.h>
22 #include <assert.h>
23
24 #include "client-state-machine.h"
25 #include "pvfs2-debug.h"
26 #include "job.h"
27 #include "gossip.h"
28 #include "str-utils.h"
29 #include "pint-cached-config.h"
30 #include "PINT-reqproto-encode.h"
31 #include "pint-util.h"
32 #include "pvfs2-internal.h"
33 #include "ncache.h"
34
35 extern job_context_id pint_client_sm_context;
36
37 enum
38 {
39 RENAME_CHDIRENT = 130,
40 RENAME_REMOVE_REQUIRED,
41 RENAME_CRDIRENT_RETRY,
42 RENAME_RMDIRENT_RETRY
43 };
44
45 static int rename_lookups_comp_fn(
46 void *v_p, struct PVFS_server_resp *resp_p, int index);
47 static int rename_crdirent_comp_fn(
48 void *v_p, struct PVFS_server_resp *resp_p, int index);
49 static int rename_rmdirent_comp_fn(
50 void *v_p, struct PVFS_server_resp *resp_p, int index);
51 static int rename_chdirent_comp_fn(
52 void *v_p, struct PVFS_server_resp *resp_p, int index);
53
54
55 static PINT_sm_action rename_init(
56 struct PINT_smcb *smcb, job_status_s *js_p);
57
58 static struct PINT_state_s ST_init;
59 static struct PINT_pjmp_tbl_s ST_init_pjtbl[];
60 static struct PINT_tran_tbl_s ST_init_trtbl[];
61
62 static PINT_sm_action rename_lookups_setup_msgpair_array(
63 struct PINT_smcb *smcb, job_status_s *js_p);
64
65 static struct PINT_state_s ST_rename_lookups_setup_msgpair_array;
66 static struct PINT_pjmp_tbl_s ST_rename_lookups_setup_msgpair_array_pjtbl[];
67 static struct PINT_tran_tbl_s ST_rename_lookups_setup_msgpair_array_trtbl[];
68 static struct PINT_state_s ST_rename_lookups_xfer_msgpair_array;
69 static struct PINT_pjmp_tbl_s ST_rename_lookups_xfer_msgpair_array_pjtbl[];
70 static struct PINT_tran_tbl_s ST_rename_lookups_xfer_msgpair_array_trtbl[];
71 static struct PINT_state_s ST_rename_getattr_src;
72 static struct PINT_pjmp_tbl_s ST_rename_getattr_src_pjtbl[];
73 static struct PINT_tran_tbl_s ST_rename_getattr_src_trtbl[];
74
75 static PINT_sm_action rename_getattr_src_interpret(
76 struct PINT_smcb *smcb, job_status_s *js_p);
77
78 static struct PINT_state_s ST_rename_getattr_src_interpret;
79 static struct PINT_pjmp_tbl_s ST_rename_getattr_src_interpret_pjtbl[];
80 static struct PINT_tran_tbl_s ST_rename_getattr_src_interpret_trtbl[];
81 static struct PINT_state_s ST_rename_getattr_dest;
82 static struct PINT_pjmp_tbl_s ST_rename_getattr_dest_pjtbl[];
83 static struct PINT_tran_tbl_s ST_rename_getattr_dest_trtbl[];
84
85 static PINT_sm_action rename_lookups_failure(
86 struct PINT_smcb *smcb, job_status_s *js_p);
87
88 static struct PINT_state_s ST_rename_lookups_failure;
89 static struct PINT_pjmp_tbl_s ST_rename_lookups_failure_pjtbl[];
90 static struct PINT_tran_tbl_s ST_rename_lookups_failure_trtbl[];
91
92 static PINT_sm_action rename_crdirent_setup_msgpair(
93 struct PINT_smcb *smcb, job_status_s *js_p);
94
95 static struct PINT_state_s ST_rename_crdirent_setup_msgpair;
96 static struct PINT_pjmp_tbl_s ST_rename_crdirent_setup_msgpair_pjtbl[];
97 static struct PINT_tran_tbl_s ST_rename_crdirent_setup_msgpair_trtbl[];
98 static struct PINT_state_s ST_rename_crdirent_xfer_msgpair;
99 static struct PINT_pjmp_tbl_s ST_rename_crdirent_xfer_msgpair_pjtbl[];
100 static struct PINT_tran_tbl_s ST_rename_crdirent_xfer_msgpair_trtbl[];
101
102 static PINT_sm_action rename_crdirent_retry_or_fail(
103 struct PINT_smcb *smcb, job_status_s *js_p);
104
105 static struct PINT_state_s ST_rename_crdirent_retry_or_fail;
106 static struct PINT_pjmp_tbl_s ST_rename_crdirent_retry_or_fail_pjtbl[];
107 static struct PINT_tran_tbl_s ST_rename_crdirent_retry_or_fail_trtbl[];
108
109 static PINT_sm_action rename_generic_timer(
110 struct PINT_smcb *smcb, job_status_s *js_p);
111
112 static struct PINT_state_s ST_rename_crdirent_timer;
113 static struct PINT_pjmp_tbl_s ST_rename_crdirent_timer_pjtbl[];
114 static struct PINT_tran_tbl_s ST_rename_crdirent_timer_trtbl[];
115
116 static PINT_sm_action rename_rmdirent_setup_msgpair(
117 struct PINT_smcb *smcb, job_status_s *js_p);
118
119 static struct PINT_state_s ST_rename_rmdirent_setup_msgpair;
120 static struct PINT_pjmp_tbl_s ST_rename_rmdirent_setup_msgpair_pjtbl[];
121 static struct PINT_tran_tbl_s ST_rename_rmdirent_setup_msgpair_trtbl[];
122 static struct PINT_state_s ST_rename_rmdirent_xfer_msgpair;
123 static struct PINT_pjmp_tbl_s ST_rename_rmdirent_xfer_msgpair_pjtbl[];
124 static struct PINT_tran_tbl_s ST_rename_rmdirent_xfer_msgpair_trtbl[];
125
126 static PINT_sm_action rename_rmdirent_retry_or_fail(
127 struct PINT_smcb *smcb, job_status_s *js_p);
128
129 static struct PINT_state_s ST_rename_rmdirent_retry_or_fail;
130 static struct PINT_pjmp_tbl_s ST_rename_rmdirent_retry_or_fail_pjtbl[];
131 static struct PINT_tran_tbl_s ST_rename_rmdirent_retry_or_fail_trtbl[];
132 static struct PINT_state_s ST_rename_rmdirent_timer;
133 static struct PINT_pjmp_tbl_s ST_rename_rmdirent_timer_pjtbl[];
134 static struct PINT_tran_tbl_s ST_rename_rmdirent_timer_trtbl[];
135
136 static PINT_sm_action rename_rmdirent_failure(
137 struct PINT_smcb *smcb, job_status_s *js_p);
138
139 static struct PINT_state_s ST_rename_rmdirent_failure;
140 static struct PINT_pjmp_tbl_s ST_rename_rmdirent_failure_pjtbl[];
141 static struct PINT_tran_tbl_s ST_rename_rmdirent_failure_trtbl[];
142
143 static PINT_sm_action rename_check_for_remove(
144 struct PINT_smcb *smcb, job_status_s *js_p);
145
146 static struct PINT_state_s ST_rename_check_for_remove;
147 static struct PINT_pjmp_tbl_s ST_rename_check_for_remove_pjtbl[];
148 static struct PINT_tran_tbl_s ST_rename_check_for_remove_trtbl[];
149 static struct PINT_state_s ST_rename_do_remove;
150 static struct PINT_pjmp_tbl_s ST_rename_do_remove_pjtbl[];
151 static struct PINT_tran_tbl_s ST_rename_do_remove_trtbl[];
152
153 static PINT_sm_action rename_warn_user_to_run_fsck(
154 struct PINT_smcb *smcb, job_status_s *js_p);
155
156 static struct PINT_state_s ST_rename_warn_user_to_run_fsck;
157 static struct PINT_pjmp_tbl_s ST_rename_warn_user_to_run_fsck_pjtbl[];
158 static struct PINT_tran_tbl_s ST_rename_warn_user_to_run_fsck_trtbl[];
159
160 static PINT_sm_action rename_chdirent_setup_msgpair(
161 struct PINT_smcb *smcb, job_status_s *js_p);
162
163 static struct PINT_state_s ST_rename_chdirent_setup_msgpair;
164 static struct PINT_pjmp_tbl_s ST_rename_chdirent_setup_msgpair_pjtbl[];
165 static struct PINT_tran_tbl_s ST_rename_chdirent_setup_msgpair_trtbl[];
166 static struct PINT_state_s ST_rename_chdirent_xfer_msgpair;
167 static struct PINT_pjmp_tbl_s ST_rename_chdirent_xfer_msgpair_pjtbl[];
168 static struct PINT_tran_tbl_s ST_rename_chdirent_xfer_msgpair_trtbl[];
169
170 static PINT_sm_action rename_chdirent_failure(
171 struct PINT_smcb *smcb, job_status_s *js_p);
172
173 static struct PINT_state_s ST_rename_chdirent_failure;
174 static struct PINT_pjmp_tbl_s ST_rename_chdirent_failure_pjtbl[];
175 static struct PINT_tran_tbl_s ST_rename_chdirent_failure_trtbl[];
176
177 static PINT_sm_action rename_cleanup(
178 struct PINT_smcb *smcb, job_status_s *js_p);
179
180 static struct PINT_state_s ST_cleanup;
181 static struct PINT_pjmp_tbl_s ST_cleanup_pjtbl[];
182 static struct PINT_tran_tbl_s ST_cleanup_trtbl[];
183
184 struct PINT_state_machine_s pvfs2_client_rename_sm = {
185 .name = "pvfs2_client_rename_sm",
186 .first_state = &ST_init
187 };
188
189 static struct PINT_state_s ST_init = {
190 .state_name = "init" ,
191 .parent_machine = &pvfs2_client_rename_sm ,
192 .flag = SM_RUN ,
193 .action.func = rename_init ,
194 .pjtbl = NULL ,
195 .trtbl = ST_init_trtbl
196 };
197
198 static struct PINT_tran_tbl_s ST_init_trtbl[] = {
199 { .return_value = -1 ,
200 .next_state = &ST_rename_lookups_setup_msgpair_array }
201 };
202
203 static struct PINT_state_s ST_rename_lookups_setup_msgpair_array = {
204 .state_name = "rename_lookups_setup_msgpair_array" ,
205 .parent_machine = &pvfs2_client_rename_sm ,
206 .flag = SM_RUN ,
207 .action.func = rename_lookups_setup_msgpair_array ,
208 .pjtbl = NULL ,
209 .trtbl = ST_rename_lookups_setup_msgpair_array_trtbl
210 };
211
212 static struct PINT_tran_tbl_s ST_rename_lookups_setup_msgpair_array_trtbl[] = {
213 { .return_value = 0 ,
214 .next_state = &ST_rename_lookups_xfer_msgpair_array },
215 { .return_value = -1 ,
216 .next_state = &ST_rename_lookups_failure }
217 };
218
219 static struct PINT_state_s ST_rename_lookups_xfer_msgpair_array = {
220 .state_name = "rename_lookups_xfer_msgpair_array" ,
221 .parent_machine = &pvfs2_client_rename_sm ,
222 .flag = SM_JUMP ,
223 .action.nested = &pvfs2_msgpairarray_sm ,
224 .pjtbl = NULL ,
225 .trtbl = ST_rename_lookups_xfer_msgpair_array_trtbl
226 };
227
228 static struct PINT_tran_tbl_s ST_rename_lookups_xfer_msgpair_array_trtbl[] = {
229 { .return_value = 0 ,
230 .next_state = &ST_rename_crdirent_setup_msgpair },
231 { .return_value = RENAME_CHDIRENT ,
232 .next_state = &ST_rename_getattr_src },
233 { .return_value = -1 ,
234 .next_state = &ST_rename_lookups_failure }
235 };
236
237 static struct PINT_state_s ST_rename_getattr_src = {
238 .state_name = "rename_getattr_src" ,
239 .parent_machine = &pvfs2_client_rename_sm ,
240 .flag = SM_JUMP ,
241 .action.nested = &pvfs2_client_getattr_sm ,
242 .pjtbl = NULL ,
243 .trtbl = ST_rename_getattr_src_trtbl
244 };
245
246 static struct PINT_tran_tbl_s ST_rename_getattr_src_trtbl[] = {
247 { .return_value = 0 ,
248 .next_state = &ST_rename_getattr_src_interpret },
249 { .return_value = -1 ,
250 .next_state = &ST_cleanup }
251 };
252
253 static struct PINT_state_s ST_rename_getattr_src_interpret = {
254 .state_name = "rename_getattr_src_interpret" ,
255 .parent_machine = &pvfs2_client_rename_sm ,
256 .flag = SM_RUN ,
257 .action.func = rename_getattr_src_interpret ,
258 .pjtbl = NULL ,
259 .trtbl = ST_rename_getattr_src_interpret_trtbl
260 };
261
262 static struct PINT_tran_tbl_s ST_rename_getattr_src_interpret_trtbl[] = {
263 { .return_value = -1 ,
264 .next_state = &ST_rename_getattr_dest }
265 };
266
267 static struct PINT_state_s ST_rename_getattr_dest = {
268 .state_name = "rename_getattr_dest" ,
269 .parent_machine = &pvfs2_client_rename_sm ,
270 .flag = SM_JUMP ,
271 .action.nested = &pvfs2_client_getattr_sm ,
272 .pjtbl = NULL ,
273 .trtbl = ST_rename_getattr_dest_trtbl
274 };
275
276 static struct PINT_tran_tbl_s ST_rename_getattr_dest_trtbl[] = {
277 { .return_value = 0 ,
278 .next_state = &ST_rename_chdirent_setup_msgpair },
279 { .return_value = -1 ,
280 .next_state = &ST_cleanup }
281 };
282
283 static struct PINT_state_s ST_rename_lookups_failure = {
284 .state_name = "rename_lookups_failure" ,
285 .parent_machine = &pvfs2_client_rename_sm ,
286 .flag = SM_RUN ,
287 .action.func = rename_lookups_failure ,
288 .pjtbl = NULL ,
289 .trtbl = ST_rename_lookups_failure_trtbl
290 };
291
292 static struct PINT_tran_tbl_s ST_rename_lookups_failure_trtbl[] = {
293 { .return_value = -1 ,
294 .next_state = &ST_cleanup }
295 };
296
297 static struct PINT_state_s ST_rename_crdirent_setup_msgpair = {
298 .state_name = "rename_crdirent_setup_msgpair" ,
299 .parent_machine = &pvfs2_client_rename_sm ,
300 .flag = SM_RUN ,
301 .action.func = rename_crdirent_setup_msgpair ,
302 .pjtbl = NULL ,
303 .trtbl = ST_rename_crdirent_setup_msgpair_trtbl
304 };
305
306 static struct PINT_tran_tbl_s ST_rename_crdirent_setup_msgpair_trtbl[] = {
307 { .return_value = 0 ,
308 .next_state = &ST_rename_crdirent_xfer_msgpair },
309 { .return_value = -1 ,
310 .next_state = &ST_rename_crdirent_retry_or_fail }
311 };
312
313 static struct PINT_state_s ST_rename_crdirent_xfer_msgpair = {
314 .state_name = "rename_crdirent_xfer_msgpair" ,
315 .parent_machine = &pvfs2_client_rename_sm ,
316 .flag = SM_JUMP ,
317 .action.nested = &pvfs2_msgpairarray_sm ,
318 .pjtbl = NULL ,
319 .trtbl = ST_rename_crdirent_xfer_msgpair_trtbl
320 };
321
322 static struct PINT_tran_tbl_s ST_rename_crdirent_xfer_msgpair_trtbl[] = {
323 { .return_value = 0 ,
324 .next_state = &ST_rename_rmdirent_setup_msgpair },
325 { .return_value = -1 ,
326 .next_state = &ST_rename_crdirent_retry_or_fail }
327 };
328
329 static struct PINT_state_s ST_rename_crdirent_retry_or_fail = {
330 .state_name = "rename_crdirent_retry_or_fail" ,
331 .parent_machine = &pvfs2_client_rename_sm ,
332 .flag = SM_RUN ,
333 .action.func = rename_crdirent_retry_or_fail ,
334 .pjtbl = NULL ,
335 .trtbl = ST_rename_crdirent_retry_or_fail_trtbl
336 };
337
338 static struct PINT_tran_tbl_s ST_rename_crdirent_retry_or_fail_trtbl[] = {
339 { .return_value = RENAME_CRDIRENT_RETRY ,
340 .next_state = &ST_rename_crdirent_timer },
341 { .return_value = -1 ,
342 .next_state = &ST_cleanup }
343 };
344
345 static struct PINT_state_s ST_rename_crdirent_timer = {
346 .state_name = "rename_crdirent_timer" ,
347 .parent_machine = &pvfs2_client_rename_sm ,
348 .flag = SM_RUN ,
349 .action.func = rename_generic_timer ,
350 .pjtbl = NULL ,
351 .trtbl = ST_rename_crdirent_timer_trtbl
352 };
353
354 static struct PINT_tran_tbl_s ST_rename_crdirent_timer_trtbl[] = {
355 { .return_value = -1 ,
356 .next_state = &ST_rename_crdirent_setup_msgpair }
357 };
358
359 static struct PINT_state_s ST_rename_rmdirent_setup_msgpair = {
360 .state_name = "rename_rmdirent_setup_msgpair" ,
361 .parent_machine = &pvfs2_client_rename_sm ,
362 .flag = SM_RUN ,
363 .action.func = rename_rmdirent_setup_msgpair ,
364 .pjtbl = NULL ,
365 .trtbl = ST_rename_rmdirent_setup_msgpair_trtbl
366 };
367
368 static struct PINT_tran_tbl_s ST_rename_rmdirent_setup_msgpair_trtbl[] = {
369 { .return_value = 0 ,
370 .next_state = &ST_rename_rmdirent_xfer_msgpair },
371 { .return_value = -1 ,
372 .next_state = &ST_rename_rmdirent_retry_or_fail }
373 };
374
375 static struct PINT_state_s ST_rename_rmdirent_xfer_msgpair = {
376 .state_name = "rename_rmdirent_xfer_msgpair" ,
377 .parent_machine = &pvfs2_client_rename_sm ,
378 .flag = SM_JUMP ,
379 .action.nested = &pvfs2_msgpairarray_sm ,
380 .pjtbl = NULL ,
381 .trtbl = ST_rename_rmdirent_xfer_msgpair_trtbl
382 };
383
384 static struct PINT_tran_tbl_s ST_rename_rmdirent_xfer_msgpair_trtbl[] = {
385 { .return_value = 0 ,
386 .next_state = &ST_rename_check_for_remove },
387 { .return_value = -1 ,
388 .next_state = &ST_rename_rmdirent_retry_or_fail }
389 };
390
391 static struct PINT_state_s ST_rename_rmdirent_retry_or_fail = {
392 .state_name = "rename_rmdirent_retry_or_fail" ,
393 .parent_machine = &pvfs2_client_rename_sm ,
394 .flag = SM_RUN ,
395 .action.func = rename_rmdirent_retry_or_fail ,
396 .pjtbl = NULL ,
397 .trtbl = ST_rename_rmdirent_retry_or_fail_trtbl
398 };
399
400 static struct PINT_tran_tbl_s ST_rename_rmdirent_retry_or_fail_trtbl[] = {
401 { .return_value = RENAME_RMDIRENT_RETRY ,
402 .next_state = &ST_rename_rmdirent_timer },
403 { .return_value = -1 ,
404 .next_state = &ST_rename_rmdirent_failure }
405 };
406
407 static struct PINT_state_s ST_rename_rmdirent_timer = {
408 .state_name = "rename_rmdirent_timer" ,
409 .parent_machine = &pvfs2_client_rename_sm ,
410 .flag = SM_RUN ,
411 .action.func = rename_generic_timer ,
412 .pjtbl = NULL ,
413 .trtbl = ST_rename_rmdirent_timer_trtbl
414 };
415
416 static struct PINT_tran_tbl_s ST_rename_rmdirent_timer_trtbl[] = {
417 { .return_value = -1 ,
418 .next_state = &ST_rename_rmdirent_setup_msgpair }
419 };
420
421 static struct PINT_state_s ST_rename_rmdirent_failure = {
422 .state_name = "rename_rmdirent_failure" ,
423 .parent_machine = &pvfs2_client_rename_sm ,
424 .flag = SM_RUN ,
425 .action.func = rename_rmdirent_failure ,
426 .pjtbl = NULL ,
427 .trtbl = ST_rename_rmdirent_failure_trtbl
428 };
429
430 static struct PINT_tran_tbl_s ST_rename_rmdirent_failure_trtbl[] = {
431 { .return_value = 0 ,
432 .next_state = &ST_rename_rmdirent_setup_msgpair },
433 { .return_value = -1 ,
434 .next_state = &ST_rename_warn_user_to_run_fsck }
435 };
436
437 static struct PINT_state_s ST_rename_check_for_remove = {
438 .state_name = "rename_check_for_remove" ,
439 .parent_machine = &pvfs2_client_rename_sm ,
440 .flag = SM_RUN ,
441 .action.func = rename_check_for_remove ,
442 .pjtbl = NULL ,
443 .trtbl = ST_rename_check_for_remove_trtbl
444 };
445
446 static struct PINT_tran_tbl_s ST_rename_check_for_remove_trtbl[] = {
447 { .return_value = RENAME_REMOVE_REQUIRED ,
448 .next_state = &ST_rename_do_remove },
449 { .return_value = -1 ,
450 .next_state = &ST_cleanup }
451 };
452
453 static struct PINT_state_s ST_rename_do_remove = {
454 .state_name = "rename_do_remove" ,
455 .parent_machine = &pvfs2_client_rename_sm ,
456 .flag = SM_JUMP ,
457 .action.nested = &pvfs2_client_remove_helper_sm ,
458 .pjtbl = NULL ,
459 .trtbl = ST_rename_do_remove_trtbl
460 };
461
462 static struct PINT_tran_tbl_s ST_rename_do_remove_trtbl[] = {
463 { .return_value = 0 ,
464 .next_state = &ST_cleanup },
465 { .return_value = -1 ,
466 .next_state = &ST_rename_warn_user_to_run_fsck }
467 };
468
469 static struct PINT_state_s ST_rename_warn_user_to_run_fsck = {
470 .state_name = "rename_warn_user_to_run_fsck" ,
471 .parent_machine = &pvfs2_client_rename_sm ,
472 .flag = SM_RUN ,
473 .action.func = rename_warn_user_to_run_fsck ,
474 .pjtbl = NULL ,
475 .trtbl = ST_rename_warn_user_to_run_fsck_trtbl
476 };
477
478 static struct PINT_tran_tbl_s ST_rename_warn_user_to_run_fsck_trtbl[] = {
479 { .return_value = -1 ,
480 .next_state = &ST_cleanup }
481 };
482
483 static struct PINT_state_s ST_rename_chdirent_setup_msgpair = {
484 .state_name = "rename_chdirent_setup_msgpair" ,
485 .parent_machine = &pvfs2_client_rename_sm ,
486 .flag = SM_RUN ,
487 .action.func = rename_chdirent_setup_msgpair ,
488 .pjtbl = NULL ,
489 .trtbl = ST_rename_chdirent_setup_msgpair_trtbl
490 };
491
492 static struct PINT_tran_tbl_s ST_rename_chdirent_setup_msgpair_trtbl[] = {
493 { .return_value = 0 ,
494 .next_state = &ST_rename_chdirent_xfer_msgpair },
495 { .return_value = -1 ,
496 .next_state = &ST_rename_chdirent_failure }
497 };
498
499 static struct PINT_state_s ST_rename_chdirent_xfer_msgpair = {
500 .state_name = "rename_chdirent_xfer_msgpair" ,
501 .parent_machine = &pvfs2_client_rename_sm ,
502 .flag = SM_JUMP ,
503 .action.nested = &pvfs2_msgpairarray_sm ,
504 .pjtbl = NULL ,
505 .trtbl = ST_rename_chdirent_xfer_msgpair_trtbl
506 };
507
508 static struct PINT_tran_tbl_s ST_rename_chdirent_xfer_msgpair_trtbl[] = {
509 { .return_value = 0 ,
510 .next_state = &ST_rename_rmdirent_setup_msgpair },
511 { .return_value = -1 ,
512 .next_state = &ST_rename_chdirent_failure }
513 };
514
515 static struct PINT_state_s ST_rename_chdirent_failure = {
516 .state_name = "rename_chdirent_failure" ,
517 .parent_machine = &pvfs2_client_rename_sm ,
518 .flag = SM_RUN ,
519 .action.func = rename_chdirent_failure ,
520 .pjtbl = NULL ,
521 .trtbl = ST_rename_chdirent_failure_trtbl
522 };
523
524 static struct PINT_tran_tbl_s ST_rename_chdirent_failure_trtbl[] = {
525 { .return_value = -1 ,
526 .next_state = &ST_cleanup }
527 };
528
529 static struct PINT_state_s ST_cleanup = {
530 .state_name = "cleanup" ,
531 .parent_machine = &pvfs2_client_rename_sm ,
532 .flag = SM_RUN ,
533 .action.func = rename_cleanup ,
534 .pjtbl = NULL ,
535 .trtbl = ST_cleanup_trtbl
536 };
537
538 static struct PINT_tran_tbl_s ST_cleanup_trtbl[] = {
539 { .return_value = -1 ,
540
541 .flag = SM_TERM }
542 };
543
544 # 209 "src/client/sysint/sys-rename.sm"
545
546
547 /** Initiate renaming of an object.
548 *
549 * \param old_entry original name of object
550 * \param old_parent_ref reference to original parent directory of object
551 * \param new_entry new name for object
552 * \param new_parent_ref reference to new parent directory for object
553 *
554 * \return 0 on success, -errno on failure.
555 */
556 PVFS_error PVFS_isys_rename(
557 char *old_entry,
558 PVFS_object_ref old_parent_ref,
559 char *new_entry,
560 PVFS_object_ref new_parent_ref,
561 const PVFS_credentials *credentials,
562 PVFS_sys_op_id *op_id,
563 void *user_ptr)
564 {
565 PVFS_error ret = -PVFS_EINVAL;
566 PINT_smcb *smcb = NULL;
567 PINT_client_sm *sm_p = NULL;
568
569 gossip_debug(GOSSIP_CLIENT_DEBUG, "PVFS_isys_rename entered\n");
570
571 if ((old_entry == NULL) || (new_entry == NULL) ||
572 (old_parent_ref.handle == PVFS_HANDLE_NULL) ||
573 (old_parent_ref.fs_id == PVFS_FS_ID_NULL) ||
574 (new_parent_ref.handle == PVFS_HANDLE_NULL) ||
575 (new_parent_ref.fs_id == PVFS_FS_ID_NULL))
576 {
577 gossip_err("invalid (NULL) required argument\n");
578 return ret;
579 }
580
581 /* don't even try to rename a file to itself */
582 if ((old_parent_ref.handle == new_parent_ref.handle) &&
583 (old_parent_ref.fs_id == new_parent_ref.fs_id) &&
584 (strcmp(old_entry, new_entry) == 0))
585 {
586 return ret;
587 }
588
589 if ((strlen(new_entry) + 1) > PVFS_REQ_LIMIT_SEGMENT_BYTES)
590 {
591 return -PVFS_ENAMETOOLONG;
592 }
593
594 PINT_smcb_alloc(&smcb, PVFS_SYS_RENAME,
595 sizeof(struct PINT_client_sm),
596 client_op_state_get_machine,
597 client_state_machine_terminate,
598 pint_client_sm_context);
599 if (smcb == NULL)
600 {
601 return -PVFS_ENOMEM;
602 }
603 sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
604
605 PINT_init_msgarray_params(&sm_p->msgarray_params, old_parent_ref.fs_id);
606 PINT_init_sysint_credentials(sm_p->cred_p, credentials);
607 /*
608 this state machine has several hardcoded 2's around because
609 we're dealing with 1 'old' entry, 1 'old' handle, 1 'old' parent
610 handle, 1 'new' entry, 1 'new' handle, and 1 'new' parent
611 handle. the index of 0 deals with the 'old'; index 1 deals with
612 the 'new'.
613
614 I've used this arguably confusing array notation so that we can
615 do old/new lookups and parent getattrs in parallel using the
616 msgarrays rather than doing a longer sequence of serial
617 msgpairs.
618 */
619 sm_p->u.rename.entries[0] = old_entry;
620 sm_p->u.rename.entries[1] = new_entry;
621 sm_p->u.rename.parent_refns[0] = old_parent_ref;
622 sm_p->u.rename.parent_refns[1] = new_parent_ref;
623 sm_p->u.rename.rmdirent_index = 0;
624 sm_p->u.rename.target_dirent_exists = 0;
625 sm_p->u.rename.stored_error_code = 0;
626
627 gossip_debug(
628 GOSSIP_CLIENT_DEBUG, "Renaming file named %s (under [%llu,%d]\n\t"
629 "to %s (under [%llu,%d])\n", old_entry,
630 llu(old_parent_ref.handle), old_parent_ref.fs_id, new_entry,
631 llu(new_parent_ref.handle), new_parent_ref.fs_id);
632
633 return PINT_client_state_machine_post(
634 smcb, op_id, user_ptr);
635 }
636
637 /** Rename an object.
638 *
639 * \param old_entry original name of object
640 * \param old_parent_ref reference to original parent directory of object
641 * \param new_entry new name for object
642 * \param new_parent_ref reference to new parent directory for object
643 *
644 * \return 0 on success, -errno on failure.
645 */
646 PVFS_error PVFS_sys_rename(
647 char *old_entry,
648 PVFS_object_ref old_parent_ref,
649 char *new_entry,
650 PVFS_object_ref new_parent_ref,
651 const PVFS_credentials *credentials)
652 {
653 PVFS_error ret = -PVFS_EINVAL, error = 0;
654 PVFS_sys_op_id op_id;
655
656 gossip_debug(GOSSIP_CLIENT_DEBUG, "PVFS_sys_rename entered\n");
657
658 ret = PVFS_isys_rename(old_entry, old_parent_ref, new_entry,
659 new_parent_ref, credentials, &op_id, NULL);
660 if (ret)
661 {
662 PVFS_perror_gossip("PVFS_isys_rename call", ret);
663 error = ret;
664 }
665 else
666 {
667 ret = PVFS_sys_wait(op_id, "rename", &error);
668 if (ret)
669 {
670 PVFS_perror_gossip("PVFS_sys_wait call", ret);
671 error = ret;
672 }
673 }
674
675 PINT_sys_release(op_id);
676 return error;
677 }
678
679 /****************************************************************/
680
681 static PINT_sm_action rename_init(
682 struct PINT_smcb *smcb, job_status_s *js_p)
683 {
684 PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
685 assert(js_p->error_code == 0);
686
687 /* Invalidate the old entry in ncache */
688 PINT_ncache_invalidate(
689 (const char*) sm_p->u.rename.entries[0],
690 (const PVFS_object_ref*) &(sm_p->u.rename.parent_refns[0]));
691 /* Invalidate the new entry in ncache in case it already exists */
692 PINT_ncache_invalidate(
693 (const char*) sm_p->u.rename.entries[1],
694 (const PVFS_object_ref*) &(sm_p->u.rename.parent_refns[1]));
695
696 return SM_ACTION_COMPLETE;
697 }
698
699 static int rename_lookups_comp_fn(
700 void *v_p,
701 struct PVFS_server_resp *resp_p,
702 int index)
703 {
704 PINT_smcb *smcb = v_p;
705 PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
706
707 gossip_debug(GOSSIP_CLIENT_DEBUG, "rename_lookups_comp_fn\n");
708
709 assert(resp_p->op == PVFS_SERV_LOOKUP_PATH);
710 assert((index > -1) && (index < 2));
711
712 gossip_debug(GOSSIP_CLIENT_DEBUG, "lookup[%d] got response %d\n",
713 index, resp_p->status);
714
715 /*
716 * if the index is 1, this failure just means that
717 * the target entry does not already exist, so it's
718 * expected and is not an error.
719 */
720 if(resp_p->status == -PVFS_ENOENT && index == 1)
721 {
722 /* note: don't change the actual resp structure, because the
723 * decoder counts on this to know how to release data structures
724 */
725 return 0;
726 }
727
728 if(resp_p->status != 0)
729 {
730 return resp_p->status;
731 }
732
733 /* SUCCESS! */
734
735 /*
736 stash the refns -- 'old' or 'new' based on index;
737 generally we won't be here on index == 1, since 'new'
738 may not exist
739 */
740 assert(resp_p->u.lookup_path.handle_count == 1);
741 sm_p->u.rename.refns[index].handle =
742 resp_p->u.lookup_path.handle_array[0];
743 sm_p->u.rename.refns[index].fs_id =
744 sm_p->u.rename.parent_refns[index].fs_id;
745
746 if (index == 0)
747 {
748 gossip_debug(
749 GOSSIP_CLIENT_DEBUG, "*** Looked up old handle %llu\n",
750 llu(sm_p->u.rename.refns[index].handle));
751 }
752 else
753 {
754 assert(index == 1);
755 /*
756 flag the fact that we need to do a dirent exchange on the
757 existing dirent, rather than creating a new one. we flag it
758 for later handling, as we know we need to do this, but want
759 the getattr to be complete first so that permissions can be
760 properly verified before changing anything
761 */
762 sm_p->u.rename.target_dirent_exists = 1;
763 /* set fs_id and handle for getattr nested sm */
764 sm_p->object_ref = sm_p->u.rename.refns[0];
765
766 if(sm_p->msgarray[0].op_status == 0)
767 {
768 PINT_SM_GETATTR_STATE_FILL(
769 sm_p->getattr,
770 sm_p->object_ref,
771 PVFS_ATTR_COMMON_ALL,
772 PVFS_TYPE_NONE,
773 0);
774
775 /* if both lookups succeeded, then we need chdirent */
776 return RENAME_CHDIRENT;
777 }
778 else
779 {
780 /* if the first one failed, maintain its error code */
781 return(sm_p->msgarray[0].op_status);
782 }
783 }
784 return 0;
785 }
786
787 static int rename_crdirent_comp_fn(void *v_p,
788 struct PVFS_server_resp *resp_p,
789 int index)
790 {
791 gossip_debug(GOSSIP_CLIENT_DEBUG, "rename_crdirent_comp_fn\n");
792
793 assert(resp_p->op == PVFS_SERV_CRDIRENT);
794 return resp_p->status;
795 }
796
797 static int rename_rmdirent_comp_fn(void *v_p,
798 struct PVFS_server_resp *resp_p,
799 int index)
800 {
801 PINT_smcb *smcb = v_p;
802 PINT_client_sm *sm_p __attribute__((unused)) =
803 PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
804 gossip_debug(GOSSIP_CLIENT_DEBUG, "rename_rmdirent_comp_fn\n");
805
806 assert(resp_p->op == PVFS_SERV_RMDIRENT);
807
808 if (resp_p->status != 0)
809 {
810 return resp_p->status;
811 }
812
813 /*
814 rmdirent returns handle of removed dirent; make sure it matches
815 the handle we asked to have removed (i.e. the 'old' handle)
816 */
817 assert(sm_p->u.rename.refns[0].handle ==
818 resp_p->u.rmdirent.entry_handle);
819
820 return 0;
821 }
822
823 static int rename_chdirent_comp_fn(
824 void *v_p, struct PVFS_server_resp *resp_p, int index)
825 {
826 PINT_smcb *smcb = v_p;
827 PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
828
829 gossip_debug(GOSSIP_CLIENT_DEBUG, "rename_chdirent_comp_fn\n");
830
831 assert(resp_p->op == PVFS_SERV_CHDIRENT);
832
833 if (resp_p->status != 0)
834 {
835 return resp_p->status;
836 }
837
838 /*
839 here we have the 'old' dirent handle that we've just replaced
840 with the target name; store it for later removal
841 */
842 sm_p->u.rename.old_dirent_handle =
843 resp_p->u.chdirent.old_dirent_handle;
844
845 gossip_debug(GOSSIP_CLIENT_DEBUG, "got back old dirent handle %llu\n",
846 llu(sm_p->u.rename.old_dirent_handle));
847
848 return 0;
849 }
850
851 static PINT_sm_action rename_lookups_setup_msgpair_array(
852 struct PINT_smcb *smcb, job_status_s *js_p)
853 {
854 struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
855 int ret = -PVFS_EINVAL, i = 0;
856
857 js_p->error_code = 0;
858
859 sm_p->msgarray_count = 2;
860 sm_p->msgarray = (PINT_sm_msgpair_state *)malloc(
861 sm_p->msgarray_count * sizeof(PINT_sm_msgpair_state));
862 if (sm_p->msgarray == NULL)
863 {
864 gossip_err("rename: failed to allocate msgarray\n");
865 return -PVFS_ENOMEM;
866 }
867
868 /* prepare to post the lookup send/recv pairs */
869 for(i = 0; i < 2; i++)
870 {
871 PINT_sm_msgpair_state *msg_p = &sm_p->msgarray[i];
872
873 gossip_debug(GOSSIP_CLIENT_DEBUG,
874 "rename: posting lookup[%d] (%lld,%d)\n",
875 i, llu(sm_p->u.rename.parent_refns[i].handle),
876 sm_p->u.rename.parent_refns[i].fs_id);
877
878 PINT_SERVREQ_LOOKUP_PATH_FILL(
879 msg_p->req,
880 *sm_p->cred_p,
881 sm_p->u.rename.entries[i],
882 sm_p->u.rename.parent_refns[i].fs_id,
883 sm_p->u.rename.parent_refns[i].handle,
884 PVFS_ATTR_COMMON_ALL);
885
886 /* fill in msgpair structure components */
887 msg_p->fs_id = sm_p->u.rename.parent_refns[i].fs_id;
888 msg_p->handle = sm_p->u.rename.parent_refns[i].handle;
889 msg_p->retry_flag = PVFS_MSGPAIR_RETRY;
890 msg_p->comp_fn = rename_lookups_comp_fn;
891
892 ret = PINT_cached_config_map_to_server(
893 &msg_p->svr_addr, msg_p->handle, msg_p->fs_id);
894
895 if (ret)
896 {
897 gossip_err("Failed to map meta server address\n");
898 js_p->error_code = ret;
899 break;
900 }
901 }
902 return SM_ACTION_COMPLETE;
903 }
904
905 static PINT_sm_action rename_lookups_failure(
906 struct PINT_smcb *smcb, job_status_s *js_p)
907 {
908 struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
909 if (sm_p->msgarray)
910 {
911 free(sm_p->msgarray);
912 sm_p->msgarray = NULL;
913 }
914 return SM_ACTION_COMPLETE;
915 }
916
917 static PINT_sm_action rename_crdirent_setup_msgpair(
918 struct PINT_smcb *smcb, job_status_s *js_p)
919 {
920 struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
921 int ret = -PVFS_EINVAL;
922 PINT_sm_msgpair_state *msg_p = NULL;
923
924 js_p->error_code = 0;
925
926 gossip_debug(GOSSIP_CLIENT_DEBUG," rename: posting crdirent req\n");
927
928 assert(sm_p->msgarray);
929 PINT_init_msgpair(sm_p, msg_p);
930
931 /*
932 hook the 'old' handle up to the new parent with the 'new_entry'
933 name -- on success we will have 2 dirents pointing to the same
934 metafile; only update the mtime and ctime, leaving atime as 0
935 */
936 PINT_SERVREQ_CRDIRENT_FILL(
937 msg_p->req,
938 *sm_p->cred_p,
939 sm_p->u.rename.entries[1],
940 sm_p->u.rename.refns[0].handle,
941 sm_p->u.rename.parent_refns[1].handle,
942 sm_p->u.rename.parent_refns[1].fs_id);
943
944 msg_p->fs_id = sm_p->u.rename.parent_refns[1].fs_id;
945 msg_p->handle = sm_p->u.rename.parent_refns[1].handle;
946 msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY;
947 msg_p->comp_fn = rename_crdirent_comp_fn;
948
949 ret = PINT_cached_config_map_to_server(
950 &msg_p->svr_addr,