Skip to content
Permalink
1139b72d5e
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
286 lines (245 sloc) 7.13 KB
/*
* (C) 2003 Clemson University and The University of Chicago
*
* See COPYING in top-level directory.
*/
/** \file PVFS system calls for setting extended attributes
* \ingroup sysint
*/
#include <string.h>
#include <assert.h>
#ifndef WIN32
#include <unistd.h>
#endif
#include "client-state-machine.h"
#include "pvfs2-debug.h"
#include "pvfs2-util.h"
#include "job.h"
#include "gossip.h"
#include "str-utils.h"
#include "pint-cached-config.h"
#include "PINT-reqproto-encode.h"
extern job_context_id pint_client_sm_context;
static int set_eattr_comp_fn(
void *v_p,
struct PVFS_server_resp *resp_p,
int i);
%%
machine pvfs2_client_set_eattr_sm
{
state setup_msgpair
{
run set_eattr_setup_msgpair;
success => xfer_msgpair;
default => cleanup;
}
state xfer_msgpair
{
jump pvfs2_msgpairarray_sm;
default => cleanup;
}
state cleanup
{
run set_eattr_cleanup;
default => terminate;
}
}
%%
PVFS_error PVFS_isys_seteattr_list(
PVFS_object_ref ref,
const PVFS_credentials *credentials,
int32_t nkey,
PVFS_ds_keyval *key_array,
PVFS_ds_keyval *val_array,
int32_t flags,
PVFS_sys_op_id *op_id,
PVFS_hint hints,
void *user_ptr)
{
int ret = -PVFS_EINVAL;
PINT_smcb *smcb = NULL;
PINT_client_sm *sm_p = NULL;
gossip_debug(GOSSIP_CLIENT_DEBUG,
"PINT_isys_set_eattr entered\n");
if(gossip_debug_enabled(GOSSIP_SETEATTR_DEBUG))
{
int i = 0;
int j; char *valBuf = (char *)val_array[i].buffer;
gossip_debug(GOSSIP_SETEATTR_DEBUG,"Setting extended attributes:\n");
for(; i < nkey; ++i)
{
gossip_debug(GOSSIP_SETEATTR_DEBUG,"eattr[%d]: key=%s\n"
, i
,(char *)key_array[i].buffer);
for (j=0; j<val_array[i].buffer_sz; j++)
gossip_debug(GOSSIP_SETEATTR_DEBUG," val[%d]=%#x\n"
,j
,(unsigned int)valBuf[j]);
}/*end for*/
} /*end if*/
if ((ref.handle == PVFS_HANDLE_NULL) ||
(ref.fs_id == PVFS_FS_ID_NULL))
{
gossip_err("invalid (NULL) required argument\n");
return ret;
}
PINT_smcb_alloc(&smcb, PVFS_SYS_SETEATTR,
sizeof(struct PINT_client_sm),
client_op_state_get_machine,
client_state_machine_terminate,
pint_client_sm_context);
if (smcb == NULL)
{
return -PVFS_ENOMEM;
}
sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
PINT_init_msgarray_params(sm_p, ref.fs_id);
PINT_init_sysint_credentials(sm_p->cred_p, credentials);
sm_p->u.seteattr.nkey = nkey;
sm_p->u.seteattr.key_array = key_array;
sm_p->u.seteattr.val_array = val_array;
sm_p->u.seteattr.flags = flags;
sm_p->error_code = 0;
sm_p->object_ref = ref;
PVFS_hint_copy(hints, &sm_p->hints);
return PINT_client_state_machine_post(
smcb, op_id, user_ptr);
}
PVFS_error PVFS_isys_seteattr(
PVFS_object_ref ref,
const PVFS_credentials *credentials,
PVFS_ds_keyval *key_p,
PVFS_ds_keyval *val_p,
int32_t flags,
PVFS_sys_op_id *op_id,
PVFS_hint hints,
void *user_ptr)
{
return PVFS_isys_seteattr_list(ref, credentials, 1, key_p, val_p, flags,
op_id, hints, user_ptr);
}
PVFS_error PVFS_sys_seteattr_list(
PVFS_object_ref ref,
const PVFS_credentials *credentials,
int32_t nkey,
PVFS_ds_keyval *key_array,
PVFS_ds_keyval *val_array,
int32_t flags,
PVFS_hint hints)
{
PVFS_error ret = -PVFS_EINVAL, error = 0;
PVFS_sys_op_id op_id;
gossip_debug(GOSSIP_CLIENT_DEBUG, "PVFS_sys_seteattr entered\n");
ret = PVFS_isys_seteattr_list(ref, credentials,
nkey, key_array, val_array, flags, &op_id, hints, NULL);
if (ret)
{
PVFS_perror_gossip("PVFS_isys_seteattr call", ret);
error = ret;
}
else
{
ret = PVFS_sys_wait(op_id, "seteattr", &error);
if (ret)
{
PVFS_perror_gossip("PVFS_sys_wait call", ret);
error = ret;
}
}
PINT_sys_release(op_id);
return error;
}
PVFS_error PVFS_sys_seteattr(
PVFS_object_ref ref,
const PVFS_credentials *credentials,
PVFS_ds_keyval *key_p,
PVFS_ds_keyval *val_p,
int32_t flags,
PVFS_hint hints)
{
return PVFS_sys_seteattr_list(ref, credentials, 1, key_p, val_p, flags, hints);
}
static PINT_sm_action set_eattr_setup_msgpair(
struct PINT_smcb *smcb, job_status_s *js_p)
{
struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
int ret = -PVFS_EINVAL;
PINT_sm_msgpair_state *msg_p;
PINT_msgpair_init(&sm_p->msgarray_op);
msg_p = &sm_p->msgarray_op.msgpair;
PINT_SERVREQ_SETEATTR_FILL(
msg_p->req,
(*sm_p->cred_p),
sm_p->object_ref.fs_id,
sm_p->object_ref.handle,
sm_p->u.seteattr.flags,
sm_p->u.seteattr.nkey,
sm_p->u.seteattr.key_array,
sm_p->u.seteattr.val_array,
sm_p->hints
);
msg_p->fs_id = sm_p->object_ref.fs_id;
msg_p->handle = sm_p->object_ref.handle;
msg_p->retry_flag = PVFS_MSGPAIR_RETRY;
msg_p->comp_fn = set_eattr_comp_fn;
ret = PINT_cached_config_map_to_server(
&msg_p->svr_addr, msg_p->handle, msg_p->fs_id);
if (ret)
{
gossip_err("Failed to map meta server address\n");
js_p->error_code = 0;
}
PINT_sm_push_frame(smcb, 0, &sm_p->msgarray_op);
return SM_ACTION_COMPLETE;
}
static PINT_sm_action set_eattr_cleanup(
struct PINT_smcb *smcb, job_status_s *js_p)
{
struct PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
sm_p->error_code = js_p->error_code;
PINT_SET_OP_COMPLETE;
return SM_ACTION_TERMINATE;
}
static int set_eattr_comp_fn(
void *v_p,
struct PVFS_server_resp *resp_p,
int i)
{
int j = 0;
int ret = 0;
PINT_smcb *smcb = v_p;
PINT_client_sm *sm_p = PINT_sm_frame(smcb, PINT_MSGPAIR_PARENT_SM);
PINT_sm_msgpair_state *msg_p;
gossip_debug(GOSSIP_CLIENT_DEBUG,
"get_eattr completion fn: set_eattr_comp_fn\n");
/* only posted one msgpair */
assert(i==0);
/* no return value from set eattrib so just check status */
if (sm_p->msgarray_op.msgarray[i].op_status != 0)
{
ret = sm_p->msgarray_op.msgarray[i].op_status;
}
/* if this is the last response, check all of the status values
* and return error code if any requests failed
*/
if (i == (sm_p->msgarray_op.count -1))
{
foreach_msgpair(&sm_p->msgarray_op, msg_p, j)
{
if (msg_p->op_status != 0)
{
return(msg_p->op_status);
}
}
}
return ret;
}
/*
* Local variables:
* mode: c
* c-indent-level: 4
* c-basic-offset: 4
* End:
*
* vim: ft=c ts=8 sts=4 sw=4 expandtab
*/