home *** CD-ROM | disk | FTP | other *** search
/ ftp.parl.clemson.edu / 2015-02-07.ftp.parl.clemson.edu.tar / ftp.parl.clemson.edu / pub / pvfs2 / orangefs-2.8.3-20110323.tar.gz / orangefs-2.8.3-20110323.tar / orangefs / src / client / sysint / mgmt-get-dirdata-handle.sm < prev    next >
Text File  |  2008-11-19  |  6KB  |  243 lines

  1. /* 
  2.  * (C) 2003 Clemson University and The University of Chicago 
  3.  *
  4.  * See COPYING in top-level directory.
  5.  */
  6.  
  7. /** \file
  8.  *  \ingroup mgmtint
  9.  *
  10.  *  PVFS2 management interface routines for obtaining the handle of
  11.  *  the object that holds directory data (the dirdata object).
  12.  *
  13.  *  These routines are used primarily for file system check and repair
  14.  *  purposes, and expose internal details of PVFS2 that may change.
  15.  */
  16.  
  17. #include <string.h>
  18. #include <assert.h>
  19.  
  20. #include "client-state-machine.h"
  21. #include "pvfs2-debug.h"
  22. #include "job.h"
  23. #include "gossip.h"
  24. #include "str-utils.h"
  25. #include "pint-cached-config.h"
  26. #include "PINT-reqproto-encode.h"
  27. #include "pvfs2-internal.h"
  28.  
  29. extern job_context_id pint_client_sm_context;
  30.  
  31. static int mgmt_get_dirdata_handle_comp_fn(
  32.     void *v_p, struct PVFS_server_resp *resp_p, int i);
  33.  
  34. %%
  35.  
  36. machine pvfs2_client_mgmt_get_dirdata_handle_sm
  37. {
  38.     state init
  39.     {
  40.         run mgmt_get_dirdata_handle_init;
  41.         default => get_dirdata_handle_setup_msgpair;
  42.     }
  43.  
  44.     state get_dirdata_handle_setup_msgpair
  45.     {
  46.         run mgmt_get_dirdata_handle_setup_msgpair;
  47.         success => get_dirdata_handle_xfer_msgpair;
  48.         default => cleanup;
  49.     }
  50.  
  51.     state get_dirdata_handle_xfer_msgpair
  52.     {
  53.         jump pvfs2_msgpairarray_sm;
  54.         default => cleanup;
  55.     }
  56.  
  57.     state cleanup
  58.     {
  59.         run mgmt_get_dirdata_handle_cleanup;
  60.         default => terminate;
  61.     }
  62. }
  63.  
  64. %%
  65.  
  66. /** Initiate retrieval of handle for dirdata object for a specific
  67.  *  directory.
  68.  */
  69. PVFS_error PVFS_imgmt_get_dirdata_handle(
  70.     PVFS_object_ref parent_ref,
  71.     PVFS_handle *out_dirdata_handle,
  72.     PVFS_credentials *credentials,
  73.     PVFS_mgmt_op_id *op_id,
  74.     PVFS_hint hints,
  75.     void *user_ptr)
  76. {
  77.     PVFS_error ret = -PVFS_EINVAL;
  78.     PINT_smcb *smcb = NULL;
  79.     PINT_client_sm *sm_p = NULL;
  80.  
  81.     gossip_debug(GOSSIP_CLIENT_DEBUG,
  82.                  "PVFS_imgmt_get_dirdata_handle entered\n");
  83.  
  84.     if ((parent_ref.handle == PVFS_HANDLE_NULL) ||
  85.         (parent_ref.fs_id == PVFS_FS_ID_NULL) || !out_dirdata_handle)
  86.     {
  87.         gossip_err("invalid (NULL) required argument\n");
  88.         return ret;
  89.     }
  90.  
  91.     PINT_smcb_alloc(&smcb, PVFS_MGMT_GET_DIRDATA_HANDLE,
  92.              sizeof(struct PINT_client_sm),
  93.              client_op_state_get_machine,
  94.              client_state_machine_terminate,
  95.              pint_client_sm_context);
  96.     if (smcb == NULL)
  97.     {
  98.         return -PVFS_ENOMEM;
  99.     }
  100.     sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
  101.  
  102.     PINT_init_msgarray_params(sm_p, parent_ref.fs_id);
  103.     PINT_init_sysint_credentials(sm_p->cred_p, credentials);
  104.     sm_p->parent_ref = parent_ref;
  105.     sm_p->u.mgmt_get_dirdata_handle.dirdata_handle = out_dirdata_handle;
  106.     PVFS_hint_copy(hints, &sm_p->hints);
  107.  
  108.     gossip_debug(
  109.         GOSSIP_CLIENT_DEBUG, "Trying to get dirdata object of parent "
  110.         "dir %llu,%d\n", llu(parent_ref.handle), parent_ref.fs_id);
  111.  
  112.     return PINT_client_state_machine_post(
  113.         smcb,  op_id, user_ptr);
  114. }
  115.  
  116. /** Obtain handle for dirdata object for a specific directory.
  117.  */
  118. PVFS_error PVFS_mgmt_get_dirdata_handle(
  119.     PVFS_object_ref parent_ref,
  120.     PVFS_handle *out_dirdata_handle,
  121.     PVFS_credentials *credentials,
  122.     PVFS_hint hints)
  123. {
  124.     PVFS_error ret = -PVFS_EINVAL, error = 0;
  125.     PVFS_mgmt_op_id op_id;
  126.  
  127.     gossip_debug(GOSSIP_CLIENT_DEBUG,
  128.                  "PVFS_mgmt_get_dirdata_handle entered\n");
  129.  
  130.     ret = PVFS_imgmt_get_dirdata_handle(
  131.         parent_ref, out_dirdata_handle, credentials, &op_id, hints, NULL);
  132.     if (ret)
  133.     {
  134.         PVFS_perror_gossip("PVFS_imgmt_get_dirdata_handle call", ret);
  135.         error = ret;
  136.     }
  137.     else
  138.     {
  139.         ret = PVFS_mgmt_wait(op_id, "get_dirdata_handle", &error);
  140.         if (ret)
  141.         {
  142.             PVFS_perror_gossip("PVFS_mgmt_wait call", ret);
  143.             error = ret;
  144.         }
  145.     }
  146.  
  147.     PINT_mgmt_release(op_id);
  148.     return error;
  149. }
  150.  
  151. static int mgmt_get_dirdata_handle_init(
  152.     struct PINT_smcb *smcb, job_status_s *js_p)
  153. {
  154.     assert(js_p->error_code == 0);
  155.     return SM_ACTION_COMPLETE;
  156. }
  157.  
  158. static int mgmt_get_dirdata_handle_setup_msgpair(
  159.     struct PINT_smcb *smcb, job_status_s *js_p)
  160. {
  161.     struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
  162.     int ret = -PVFS_EINVAL;
  163.     PINT_sm_msgpair_state *msg_p = NULL;
  164.  
  165.     js_p->error_code = 0;
  166.  
  167.     PINT_msgpair_init(&sm_p->msgarray_op);
  168.     msg_p = &sm_p->msgarray_op.msgpair;
  169.  
  170.     PINT_SERVREQ_MGMT_GET_DIRDATA_HANDLE_FILL(
  171.         msg_p->req,
  172.         *sm_p->cred_p,
  173.         sm_p->parent_ref.fs_id,
  174.         sm_p->parent_ref.handle,
  175.         sm_p->hints);
  176.  
  177.     gossip_debug(GOSSIP_CLIENT_DEBUG, "- doing MGMT_GET_DIRDATA_HANDLE "
  178.                  "under %llu,%d\n", llu(sm_p->parent_ref.handle),
  179.                  sm_p->parent_ref.fs_id);
  180.  
  181.     msg_p->fs_id = sm_p->parent_ref.fs_id;
  182.     msg_p->handle = sm_p->parent_ref.handle;
  183.     msg_p->retry_flag = PVFS_MSGPAIR_NO_RETRY;
  184.     msg_p->comp_fn = mgmt_get_dirdata_handle_comp_fn;
  185.  
  186.     ret = PINT_cached_config_map_to_server(
  187.         &msg_p->svr_addr, msg_p->handle, msg_p->fs_id);
  188.  
  189.     if (ret)
  190.     {
  191.         gossip_err("Failed to map server address\n");
  192.     js_p->error_code = ret;
  193.     }
  194.  
  195.     PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op);
  196.     return SM_ACTION_COMPLETE;
  197. }
  198.  
  199. static int mgmt_get_dirdata_handle_comp_fn(
  200.     void *v_p, struct PVFS_server_resp *resp_p, int index)
  201. {
  202.     PINT_smcb *smcb = v_p;
  203.     PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM);
  204.  
  205.     assert(resp_p->op == PVFS_SERV_MGMT_GET_DIRDATA_HANDLE);
  206.  
  207.     if (resp_p->status == 0)
  208.     {
  209.         assert(sm_p->u.mgmt_get_dirdata_handle.dirdata_handle);
  210.  
  211.         *sm_p->u.mgmt_get_dirdata_handle.dirdata_handle =
  212.             resp_p->u.mgmt_get_dirdata_handle.handle;
  213.  
  214.         gossip_debug(
  215.             GOSSIP_CLIENT_DEBUG, "  mgmt_get_dirdata_handle_comp_fn: "
  216.             "got dirdata handle %llu under %llu,%d removed\n",
  217.             llu(*sm_p->u.mgmt_get_dirdata_handle.dirdata_handle),
  218.             llu(sm_p->parent_ref.handle), sm_p->parent_ref.fs_id);
  219.     }
  220.     return resp_p->status;
  221. }
  222.  
  223. static PINT_sm_action mgmt_get_dirdata_handle_cleanup(
  224.     struct PINT_smcb *smcb, job_status_s *js_p)
  225. {
  226.     struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
  227.  
  228.     sm_p->error_code = js_p->error_code;
  229.  
  230.     PINT_SET_OP_COMPLETE;
  231.     return SM_ACTION_TERMINATE;
  232. }
  233.  
  234. /*
  235.  * Local variables:
  236.  *  mode: c
  237.  *  c-indent-level: 4
  238.  *  c-basic-offset: 4
  239.  * End:
  240.  *
  241.  * vim: ft=c ts=8 sts=4 sw=4 expandtab
  242.  */
  243.