"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,