diff options
Diffstat (limited to 'xlators/protocol/server/src/server-helpers.c')
| -rw-r--r-- | xlators/protocol/server/src/server-helpers.c | 4345 |
1 files changed, 81 insertions, 4264 deletions
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 18dc7cb169d..6e644912a46 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -10,16 +10,15 @@ #include "server.h" #include "server-helpers.h" -#include "gidcache.h" +#include <glusterfs/gidcache.h> #include "server-messages.h" -#include "syscall.h" -#include "defaults.h" -#include "default-args.h" +#include <glusterfs/syscall.h> +#include <glusterfs/defaults.h> +#include <glusterfs/default-args.h> #include "server-common.h" #include <fnmatch.h> #include <pwd.h> -#include "compound-fop-utils.h" /* based on nfs_fix_aux_groups() */ int @@ -53,14 +52,14 @@ gid_resolve(server_conf_t *conf, call_stack_t *root) ret = getpwuid_r(root->uid, &mypw, mystrs, sizeof(mystrs), &result); if (ret != 0) { - gf_msg("gid-cache", GF_LOG_ERROR, errno, PS_MSG_GET_UID_FAILED, - "getpwuid_r(%u) failed", root->uid); + gf_smsg("gid-cache", GF_LOG_ERROR, errno, PS_MSG_GET_UID_FAILED, + "uid=%u", root->uid, NULL); return -1; } if (!result) { - gf_msg("gid-cache", GF_LOG_ERROR, 0, PS_MSG_UID_NOT_FOUND, - "getpwuid_r(%u) found nothing", root->uid); + gf_smsg("gid-cache", GF_LOG_ERROR, 0, PS_MSG_UID_NOT_FOUND, "uid=%u", + root->uid, NULL); return -1; } @@ -68,9 +67,9 @@ gid_resolve(server_conf_t *conf, call_stack_t *root) ngroups = gf_getgrouplist(result->pw_name, root->gid, &mygroups); if (ngroups == -1) { - gf_msg("gid-cache", GF_LOG_ERROR, 0, PS_MSG_MAPPING_ERROR, - "could not map %s to group list (%d gids)", result->pw_name, - root->ngrps); + gf_smsg("gid-cache", GF_LOG_ERROR, 0, PS_MSG_MAPPING_ERROR, + "pw_name=%s", result->pw_name, "root->ngtps=%d", root->ngrps, + NULL); return -1; } root->ngrps = (uint16_t)ngroups; @@ -210,8 +209,6 @@ free_state(server_state_t *state) server_resolve_wipe(&state->resolve); server_resolve_wipe(&state->resolve2); - compound_args_cleanup(state->args); - /* Call rpc_trnasport_unref to avoid crashes at last after free all resources because of server_rpc_notify (for transport destroy) call's xlator_mem_cleanup if all xprt are destroyed that internally @@ -257,7 +254,7 @@ server_connection_cleanup_flush_cbk(call_frame_t *frame, void *cookie, victim = client->bound_xl; if (victim) { - fd_cnt = GF_ATOMIC_DEC(victim->fd_cnt); + fd_cnt = GF_ATOMIC_DEC(client->fd_cnt); if (!fd_cnt && conf && detach) { pthread_mutex_lock(&conf->mutex); { @@ -316,13 +313,12 @@ do_fd_cleanup(xlator_t *this, client_t *client, fdentry_t *fdentries, ret = inode_path(fd->inode, NULL, &path); if (ret > 0) { - gf_msg(this->name, GF_LOG_INFO, 0, PS_MSG_FD_CLEANUP, - "fd cleanup on %s", path); + gf_smsg(this->name, GF_LOG_INFO, 0, PS_MSG_FD_CLEANUP, + "path=%s", path, NULL); GF_FREE(path); } else { - gf_msg(this->name, GF_LOG_INFO, 0, PS_MSG_FD_CLEANUP, - "fd cleanup on inode with gfid %s", - uuid_utoa(fd->inode->gfid)); + gf_smsg(this->name, GF_LOG_INFO, 0, PS_MSG_FD_CLEANUP, + "inode-gfid=%s", uuid_utoa(fd->inode->gfid), NULL); } tmp_frame->local = fd; @@ -366,9 +362,7 @@ server_connection_cleanup(xlator_t *this, client_t *client, int32_t flags, serv_ctx = server_ctx_get(client, client->this); if (serv_ctx == NULL) { - gf_msg(this->name, GF_LOG_INFO, 0, PS_MSG_SERVER_CTX_GET_FAILED, - "server_ctx_get() " - "failed"); + gf_smsg(this->name, GF_LOG_INFO, 0, PS_MSG_SERVER_CTX_GET_FAILED, NULL); goto out; } @@ -399,7 +393,7 @@ server_connection_cleanup(xlator_t *this, client_t *client, int32_t flags, if (fd_cnt) { if (fd_exist) (*fd_exist) = _gf_true; - GF_ATOMIC_ADD(bound_xl->fd_cnt, fd_cnt); + GF_ATOMIC_ADD(client->fd_cnt, fd_cnt); } } @@ -416,8 +410,7 @@ server_connection_cleanup(xlator_t *this, client_t *client, int32_t flags, fd_count); ret = do_fd_cleanup(this, client, fdentries, fd_count, detach); } else - gf_msg(this->name, GF_LOG_INFO, 0, PS_MSG_FDENTRY_NULL, - "no fdentries to clean"); + gf_smsg(this->name, GF_LOG_INFO, 0, PS_MSG_FDENTRY_NULL, NULL); if (cd_ret || ret) ret = -1; @@ -459,7 +452,6 @@ server_alloc_frame(rpcsvc_request_t *req) frame->root->client = client; frame->root->state = state; /* which socket */ - frame->root->unique = 0; /* which call */ frame->this = client->this; out: @@ -487,8 +479,6 @@ get_frame_from_request(rpcsvc_request_t *req) frame->root->op = req->procnum; - frame->root->unique = req->xid; - client = req->trans->xl_private; this = req->trans->xl; priv = this->private; @@ -501,44 +491,51 @@ get_frame_from_request(rpcsvc_request_t *req) would not have been set. So for non trusted clients (i.e clients not from the same machine as the brick, and clients from outside the storage pool) - do the root-squashing. + do the root-squashing and all-squashing. TODO: If any client within the storage pool (i.e mounting within a machine from the pool but using other machine's ip/hostname from the same pool) is present treat it as a trusted client */ - if (!client->auth.username && req->pid != NFS_PID) + if (!client->auth.username && req->pid != NFS_PID) { RPC_AUTH_ROOT_SQUASH(req); + RPC_AUTH_ALL_SQUASH(req); + } /* Problem: If we just check whether the client is - trusted client and do not do root squashing for - them, then for smb clients and UFO clients root - squashing will never happen as they use the fuse - mounts done within the trusted pool (i.e they are - trusted clients). - Solution: To fix it, do root squashing for trusted - clients also. If one wants to have a client within - the storage pool for which root-squashing does not - happen, then the client has to be mounted with + trusted client and do not do root squashing and + all squashing for them, then for smb clients and + UFO clients root squashing and all squashing will + never happen as they use the fuse mounts done within + the trusted pool (i.e they are trusted clients). + Solution: To fix it, do root squashing and all squashing + for trusted clients also. If one wants to have a client + within the storage pool for which root-squashing does + not happen, then the client has to be mounted with --no-root-squash option. But for defrag client and - gsyncd client do not do root-squashing. + gsyncd client do not do root-squashing and all-squashing. */ if (client->auth.username && req->pid != GF_CLIENT_PID_NO_ROOT_SQUASH && req->pid != GF_CLIENT_PID_GSYNCD && req->pid != GF_CLIENT_PID_DEFRAG && req->pid != GF_CLIENT_PID_SELF_HEALD && - req->pid != GF_CLIENT_PID_QUOTA_MOUNT) + req->pid != GF_CLIENT_PID_QUOTA_MOUNT) { RPC_AUTH_ROOT_SQUASH(req); + RPC_AUTH_ALL_SQUASH(req); + } /* For nfs clients the server processes will be running within the trusted storage pool machines. So if we - do not do root-squashing for nfs servers, thinking - that its a trusted client, then root-squashing won't - work for nfs clients. + do not do root-squashing and all-squashing for nfs + servers, thinking that its a trusted client, then + root-squashing and all-squashing won't work for nfs + clients. */ - if (req->pid == NFS_PID) + if (req->pid == NFS_PID) { RPC_AUTH_ROOT_SQUASH(req); + RPC_AUTH_ALL_SQUASH(req); + } } } @@ -597,9 +594,8 @@ server_build_config(xlator_t *this, server_conf_t *conf) if (data) { ret = gf_string2boolean(data->data, &conf->verify_volfile); if (ret != 0) { - gf_msg(this->name, GF_LOG_WARNING, EINVAL, PS_MSG_INVALID_ENTRY, - "wrong value for '" - "verify-volfile-checksum', Neglecting option"); + gf_smsg(this->name, GF_LOG_WARNING, EINVAL, PS_MSG_WRONG_VALUE, + NULL); } } @@ -607,9 +603,8 @@ server_build_config(xlator_t *this, server_conf_t *conf) if (data) { ret = gf_string2boolean(data->data, &conf->trace); if (ret != 0) { - gf_msg(this->name, GF_LOG_WARNING, EINVAL, PS_MSG_INVALID_ENTRY, - "'trace' takes on only " - "boolean values. Neglecting option"); + gf_smsg(this->name, GF_LOG_WARNING, EINVAL, PS_MSG_INVALID_ENTRY, + NULL); } } @@ -630,18 +625,16 @@ server_build_config(xlator_t *this, server_conf_t *conf) or directory specified is non standard */ ret = sys_stat(data->data, &buf); if ((ret != 0) || !S_ISDIR(buf.st_mode)) { - gf_msg(this->name, GF_LOG_ERROR, 0, PS_MSG_DIR_NOT_FOUND, - "Directory '%s' doesn't " - "exist, exiting.", - data->data); + gf_smsg(this->name, GF_LOG_ERROR, 0, PS_MSG_DIR_NOT_FOUND, + "data=%s", data->data, NULL); ret = -1; goto out; } /* Make sure that conf-dir doesn't contain ".." in path */ if ((gf_strstr(data->data, "/", "..")) == -1) { ret = -1; - gf_msg(this->name, GF_LOG_ERROR, 0, PS_MSG_CONF_DIR_INVALID, - "%s: invalid conf_dir", data->data); + gf_smsg(this->name, GF_LOG_ERROR, 0, PS_MSG_CONF_DIR_INVALID, + "data=%s", data->data, NULL); goto out; } @@ -823,8 +816,9 @@ server_print_reply(call_frame_t *frame, int op_ret, int op_errno) if (state->fd) snprintf(fdstr, 32, " fd=%p", state->fd); - gf_msg(this->name, GF_LOG_INFO, op_errno, PS_MSG_SERVER_MSG, - "%s%s => (%d, %d)%s", op, caller, op_ret, op_errno, fdstr); + gf_smsg(this->name, GF_LOG_INFO, op_errno, PS_MSG_SERVER_MSG, "op=%s", op, + "caller=%s", caller, "op_ret=%d", op_ret, "op_errno=%d", op_errno, + "fdstr=%s", fdstr, NULL); out: return; } @@ -884,9 +878,10 @@ server_print_request(call_frame_t *frame) break; } - gf_msg(this->name, GF_LOG_INFO, 0, PS_MSG_SERVER_MSG, "%s%s%s%s%s%s%s", op, - caller, resolve_vars, loc_vars, resolve2_vars, loc2_vars, - other_vars); + gf_smsg(this->name, GF_LOG_INFO, 0, PS_MSG_SERVER_MSG, "op=%s", op, + "caller=%s", caller, "resolve_vars=%s", resolve_vars, "loc_vars=%s", + loc_vars, "resolve2_vars=%s", resolve2_vars, "loc2_vars=%s", + loc2_vars, "other_vars=%s", other_vars, NULL); out: return; } @@ -898,7 +893,6 @@ serialize_rsp_direntp(gf_dirent_t *entries, gfs3_readdirp_rsp *rsp) gfs3_dirplist *trav = NULL; gfs3_dirplist *prev = NULL; int ret = -1; - int temp = 0; GF_VALIDATE_OR_GOTO("server", entries, out); GF_VALIDATE_OR_GOTO("server", rsp, out); @@ -919,30 +913,12 @@ serialize_rsp_direntp(gf_dirent_t *entries, gfs3_readdirp_rsp *rsp) /* if 'dict' is present, pack it */ if (entry->dict) { - temp = dict_serialized_length(entry->dict); - - if (temp < 0) { - gf_msg(THIS->name, GF_LOG_ERROR, EINVAL, PS_MSG_INVALID_ENTRY, - "failed to get " - "serialized length of reply dict"); - errno = EINVAL; - trav->dict.dict_len = 0; - goto out; - } - trav->dict.dict_len = temp; - - trav->dict.dict_val = GF_CALLOC(1, trav->dict.dict_len, - gf_server_mt_rsp_buf_t); - if (!trav->dict.dict_val) { - errno = ENOMEM; - trav->dict.dict_len = 0; - goto out; - } - - ret = dict_serialize(entry->dict, trav->dict.dict_val); - if (ret < 0) { - gf_msg(THIS->name, GF_LOG_ERROR, 0, PS_MSG_DICT_SERIALIZE_FAIL, - "failed to serialize reply dict"); + ret = dict_allocate_and_serialize(entry->dict, + (char **)&trav->dict.dict_val, + &trav->dict.dict_len); + if (ret != 0) { + gf_smsg(THIS->name, GF_LOG_ERROR, 0, PS_MSG_DICT_SERIALIZE_FAIL, + NULL); errno = -ret; trav->dict.dict_len = 0; goto out; @@ -1173,8 +1149,8 @@ common_rsp_locklist(lock_migration_info_t *locklist, gfs3_locklist **reply) break; default: - gf_msg(THIS->name, GF_LOG_ERROR, 0, PS_MSG_LOCK_ERROR, - "Unknown lock type: %" PRId32 "!", tmp->flock.l_type); + gf_smsg(THIS->name, GF_LOG_ERROR, 0, PS_MSG_LOCK_ERROR, + "lock_type=%" PRId32, tmp->flock.l_type, NULL); break; } @@ -1273,8 +1249,9 @@ gf_server_check_getxattr_cmd(call_frame_t *frame, const char *key) { list_for_each_entry(xprt, &conf->xprt_list, list) { - gf_msg("mount-point-list", GF_LOG_INFO, 0, PS_MSG_MOUNT_PT_FAIL, - "%s", xprt->peerinfo.identifier); + gf_smsg("mount-point-list", GF_LOG_INFO, 0, + PS_MSG_MOUNT_PT_FAIL, "identifier=%s", + xprt->peerinfo.identifier, NULL); } } pthread_mutex_unlock(&conf->mutex); @@ -1304,9 +1281,8 @@ gf_server_check_setxattr_cmd(call_frame_t *frame, dict_t *dict) total_read += xprt->total_bytes_read; total_write += xprt->total_bytes_write; } - gf_msg("stats", GF_LOG_INFO, 0, PS_MSG_RW_STAT, - "total-read %" PRIu64 ", total-write %" PRIu64, total_read, - total_write); + gf_smsg("stats", GF_LOG_INFO, 0, PS_MSG_RW_STAT, "total-read=%" PRIu64, + total_read, "total-write=%" PRIu64, total_write, NULL); } return 0; @@ -1382,15 +1358,15 @@ auth_set_username_passwd(dict_t *input_params, dict_t *config_params, ret = dict_get_str(input_params, "password", &password); if (ret) { - gf_msg("auth/login", GF_LOG_WARNING, 0, PS_MSG_DICT_GET_FAILED, - "password not found, returning DONT-CARE"); + gf_smsg("auth/login", GF_LOG_WARNING, 0, PS_MSG_PASSWORD_NOT_FOUND, + NULL); goto out; } ret = dict_get_str(input_params, "remote-subvolume", &brick_name); if (ret) { - gf_msg("auth/login", GF_LOG_ERROR, 0, PS_MSG_DICT_GET_FAILED, - "remote-subvolume not specified"); + gf_smsg("auth/login", GF_LOG_ERROR, 0, + PS_MSG_REMOTE_SUBVOL_NOT_SPECIFIED, NULL); ret = -1; goto out; } @@ -1422,10 +1398,8 @@ auth_set_username_passwd(dict_t *input_params, dict_t *config_params, GF_FREE(searchstr); if (!passwd_data) { - gf_msg("auth/login", GF_LOG_ERROR, 0, PS_MSG_LOGIN_ERROR, - "wrong " - "username/password " - "combination"); + gf_smsg("auth/login", GF_LOG_ERROR, 0, PS_MSG_LOGIN_ERROR, + NULL); ret = -1; goto out; } @@ -1435,10 +1409,8 @@ auth_set_username_passwd(dict_t *input_params, dict_t *config_params, client->auth.username = gf_strdup(username); client->auth.passwd = gf_strdup(password); } else { - gf_msg("auth/login", GF_LOG_ERROR, 0, PS_MSG_LOGIN_ERROR, - "wrong " - "password for user %s", - username); + gf_smsg("auth/login", GF_LOG_ERROR, 0, PS_MSG_LOGIN_ERROR, + "username=%s", username, NULL); } break; } @@ -1475,7 +1447,7 @@ unserialize_req_locklist(gfs3_setactivelk_req *req, lock_migration_info_t *lmi) while (trav) { temp = GF_CALLOC(1, sizeof(*lmi), gf_common_mt_lock_mig); if (temp == NULL) { - gf_msg(THIS->name, GF_LOG_ERROR, 0, 0, "No memory"); + gf_smsg(THIS->name, GF_LOG_ERROR, 0, PS_MSG_NO_MEM, NULL); goto out; } @@ -1512,7 +1484,7 @@ unserialize_req_locklist_v2(gfx_setactivelk_req *req, while (trav) { temp = GF_CALLOC(1, sizeof(*lmi), gf_common_mt_lock_mig); if (temp == NULL) { - gf_msg(THIS->name, GF_LOG_ERROR, 0, 0, "No memory"); + gf_smsg(THIS->name, GF_LOG_ERROR, 0, PS_MSG_NO_MEM, NULL); goto out; } @@ -1533,4158 +1505,3 @@ unserialize_req_locklist_v2(gfx_setactivelk_req *req, out: return ret; } - -int -server_populate_compound_request(gfs3_compound_req *req, call_frame_t *frame, - default_args_t *this_args, int index) -{ - int op_errno = 0; - int ret = -1; - dict_t *xdata = NULL; - dict_t *xattr = NULL; - struct iovec req_iovec[MAX_IOVEC] = {{ - 0, - }}; - compound_req *this_req = NULL; - server_state_t *state = CALL_STATE(frame); - - this_req = &req->compound_req_array.compound_req_array_val[index]; - - switch (this_req->fop_enum) { - case GF_FOP_STAT: { - gfs3_stat_req *args = NULL; - - args = &this_req->compound_req_u.compound_stat_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_stat_store(this_args, &state->loc, xdata); - break; - } - case GF_FOP_READLINK: { - gfs3_readlink_req *args = NULL; - - args = &this_req->compound_req_u.compound_readlink_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_readlink_store(this_args, &state->loc, args->size, xdata); - break; - } - case GF_FOP_MKNOD: { - gfs3_mknod_req *args = NULL; - - args = &this_req->compound_req_u.compound_mknod_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_mknod_store(this_args, &state->loc, args->mode, args->dev, - args->umask, xdata); - break; - } - case GF_FOP_MKDIR: { - gfs3_mkdir_req *args = NULL; - - args = &this_req->compound_req_u.compound_mkdir_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_mkdir_store(this_args, &state->loc, args->mode, args->umask, - xdata); - break; - } - case GF_FOP_UNLINK: { - gfs3_unlink_req *args = NULL; - - args = &this_req->compound_req_u.compound_unlink_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_unlink_store(this_args, &state->loc, args->xflags, xdata); - break; - } - case GF_FOP_RMDIR: { - gfs3_rmdir_req *args = NULL; - - args = &this_req->compound_req_u.compound_rmdir_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_rmdir_store(this_args, &state->loc, args->xflags, xdata); - break; - } - case GF_FOP_SYMLINK: { - gfs3_symlink_req *args = NULL; - - args = &this_req->compound_req_u.compound_symlink_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_symlink_store(this_args, args->linkname, &state->loc, - args->umask, xdata); - - this_args->loc.inode = inode_new(state->itable); - - break; - } - case GF_FOP_RENAME: { - gfs3_rename_req *args = NULL; - - args = &this_req->compound_req_u.compound_rename_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - args_rename_store(this_args, &state->loc, &state->loc2, xdata); - break; - } - case GF_FOP_LINK: { - gfs3_link_req *args = NULL; - - args = &this_req->compound_req_u.compound_link_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_link_store(this_args, &state->loc, &state->loc2, xdata); - - this_args->loc2.inode = inode_ref(this_args->loc.inode); - - break; - } - case GF_FOP_TRUNCATE: { - gfs3_truncate_req *args = NULL; - - args = &this_req->compound_req_u.compound_truncate_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_truncate_store(this_args, &state->loc, args->offset, xdata); - break; - } - case GF_FOP_OPEN: { - gfs3_open_req *args = NULL; - - args = &this_req->compound_req_u.compound_open_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_open_store(this_args, &state->loc, args->flags, state->fd, - xdata); - - this_args->fd = fd_create(this_args->loc.inode, frame->root->pid); - this_args->fd->flags = this_args->flags; - - break; - } - case GF_FOP_READ: { - gfs3_read_req *args = NULL; - - args = &this_req->compound_req_u.compound_read_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_readv_store(this_args, state->fd, args->size, args->offset, - args->flag, xdata); - break; - } - case GF_FOP_WRITE: { - gfs3_write_req *args = NULL; - - args = &this_req->compound_req_u.compound_write_req; - - /*TODO : What happens when payload count is more than one? */ - req_iovec[0].iov_base = state->payload_vector[0].iov_base + - state->write_length; - req_iovec[0].iov_len = args->size; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - /* The way writev fop works : - * xdr args of write along with other args contains - * write length not count. But when the call is wound to posix, - * this length is not used. It is taken from the request - * write vector that is passed down. Posix needs the vector - * count to determine the amount of write to be done. - * This count for writes that come as part of compound fops - * will be 1. The vectors are merged into one under - * GF_FOP_WRITE section of client_handle_fop_requirements() - * in protocol client. - */ - args_writev_store(this_args, state->fd, req_iovec, 1, args->offset, - args->flag, state->iobref, xdata); - state->write_length += req_iovec[0].iov_len; - break; - } - case GF_FOP_STATFS: { - gfs3_statfs_req *args = NULL; - - args = &this_req->compound_req_u.compound_statfs_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_statfs_store(this_args, &state->loc, xdata); - break; - } - case GF_FOP_FLUSH: { - gfs3_flush_req *args = NULL; - - args = &this_req->compound_req_u.compound_flush_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_flush_store(this_args, state->fd, xdata); - break; - } - case GF_FOP_FSYNC: { - gfs3_fsync_req *args = NULL; - - args = &this_req->compound_req_u.compound_fsync_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_fsync_store(this_args, state->fd, args->data, xdata); - break; - } - case GF_FOP_SETXATTR: { - gfs3_setxattr_req *args = NULL; - - args = &this_req->compound_req_u.compound_setxattr_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xattr, args->dict.dict_val, - args->dict.dict_len, ret, op_errno, out); - args_setxattr_store(this_args, &state->loc, xattr, args->flags, - xdata); - break; - } - case GF_FOP_GETXATTR: { - gfs3_getxattr_req *args = NULL; - - args = &this_req->compound_req_u.compound_getxattr_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - gf_server_check_getxattr_cmd(frame, args->name); - - args_getxattr_store(this_args, &state->loc, args->name, xdata); - break; - } - case GF_FOP_REMOVEXATTR: { - gfs3_removexattr_req *args = NULL; - - args = &this_req->compound_req_u.compound_removexattr_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_removexattr_store(this_args, &state->loc, args->name, xdata); - break; - } - case GF_FOP_OPENDIR: { - gfs3_opendir_req *args = NULL; - - args = &this_req->compound_req_u.compound_opendir_req; - - this_args->fd = fd_create(this_args->loc.inode, frame->root->pid); - if (!this_args->fd) { - gf_msg("server", GF_LOG_ERROR, 0, PS_MSG_FD_CREATE_FAILED, - "could not create the fd"); - goto out; - } - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_opendir_store(this_args, &state->loc, state->fd, xdata); - break; - } - case GF_FOP_FSYNCDIR: { - gfs3_fsyncdir_req *args = NULL; - - args = &this_req->compound_req_u.compound_fsyncdir_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_fsyncdir_store(this_args, state->fd, args->data, xdata); - break; - } - case GF_FOP_ACCESS: { - gfs3_access_req *args = NULL; - - args = &this_req->compound_req_u.compound_access_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_access_store(this_args, &state->loc, args->mask, xdata); - break; - } - case GF_FOP_CREATE: { - gfs3_create_req *args = NULL; - - args = &this_req->compound_req_u.compound_create_req; - - state->loc.inode = inode_new(state->itable); - - state->fd = fd_create(state->loc.inode, frame->root->pid); - if (!state->fd) { - gf_msg("server", GF_LOG_ERROR, 0, PS_MSG_FD_CREATE_FAILED, - "fd creation for the inode %s failed", - state->loc.inode ? uuid_utoa(state->loc.inode->gfid) - : NULL); - goto out; - } - state->fd->flags = state->flags; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_create_store(this_args, &state->loc, args->flags, args->mode, - args->umask, state->fd, xdata); - break; - } - case GF_FOP_FTRUNCATE: { - gfs3_ftruncate_req *args = NULL; - - args = &this_req->compound_req_u.compound_ftruncate_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_ftruncate_store(this_args, state->fd, args->offset, xdata); - break; - } - case GF_FOP_FSTAT: { - gfs3_fstat_req *args = NULL; - - args = &this_req->compound_req_u.compound_fstat_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_fstat_store(this_args, state->fd, xdata); - break; - } - case GF_FOP_LK: { - gfs3_lk_req *args = NULL; - - args = &this_req->compound_req_u.compound_lk_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - switch (args->cmd) { - case GF_LK_GETLK: - this_args->cmd = F_GETLK; - break; - case GF_LK_SETLK: - this_args->cmd = F_SETLK; - break; - case GF_LK_SETLKW: - this_args->cmd = F_SETLKW; - break; - case GF_LK_RESLK_LCK: - this_args->cmd = F_RESLK_LCK; - break; - case GF_LK_RESLK_LCKW: - this_args->cmd = F_RESLK_LCKW; - break; - case GF_LK_RESLK_UNLCK: - this_args->cmd = F_RESLK_UNLCK; - break; - case GF_LK_GETLK_FD: - this_args->cmd = F_GETLK_FD; - break; - } - - gf_proto_flock_to_flock(&args->flock, &this_args->lock); - - switch (args->type) { - case GF_LK_F_RDLCK: - this_args->lock.l_type = F_RDLCK; - break; - case GF_LK_F_WRLCK: - this_args->lock.l_type = F_WRLCK; - break; - case GF_LK_F_UNLCK: - this_args->lock.l_type = F_UNLCK; - break; - default: - gf_msg(frame->root->client->bound_xl->name, GF_LOG_ERROR, 0, - PS_MSG_LOCK_ERROR, - "fd - %" PRId64 - " (%s):" - " Unknown " - "lock type: %" PRId32 "!", - state->resolve.fd_no, - uuid_utoa(state->fd->inode->gfid), args->type); - break; - } - args_lk_store(this_args, state->fd, this_args->cmd, - &this_args->lock, xdata); - break; - } - case GF_FOP_LOOKUP: { - gfs3_lookup_req *args = NULL; - - args = &this_req->compound_req_u.compound_lookup_req; - - if (this_args->loc.inode) - this_args->loc.inode = server_inode_new(state->itable, - state->loc.gfid); - else - state->is_revalidate = 1; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_lookup_store(this_args, &state->loc, xdata); - break; - } - case GF_FOP_READDIR: { - gfs3_readdir_req *args = NULL; - - args = &this_req->compound_req_u.compound_readdir_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_readdir_store(this_args, state->fd, args->size, args->offset, - xdata); - break; - } - case GF_FOP_INODELK: { - gfs3_inodelk_req *args = NULL; - - args = &this_req->compound_req_u.compound_inodelk_req; - - switch (args->cmd) { - case GF_LK_GETLK: - this_args->cmd = F_GETLK; - break; - case GF_LK_SETLK: - this_args->cmd = F_SETLK; - break; - case GF_LK_SETLKW: - this_args->cmd = F_SETLKW; - break; - } - - gf_proto_flock_to_flock(&args->flock, &this_args->lock); - - switch (args->type) { - case GF_LK_F_RDLCK: - this_args->lock.l_type = F_RDLCK; - break; - case GF_LK_F_WRLCK: - this_args->lock.l_type = F_WRLCK; - break; - case GF_LK_F_UNLCK: - this_args->lock.l_type = F_UNLCK; - break; - } - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_inodelk_store(this_args, args->volume, &state->loc, - this_args->cmd, &this_args->lock, xdata); - break; - } - case GF_FOP_FINODELK: { - gfs3_finodelk_req *args = NULL; - - args = &this_req->compound_req_u.compound_finodelk_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - switch (args->cmd) { - case GF_LK_GETLK: - this_args->cmd = F_GETLK; - break; - case GF_LK_SETLK: - this_args->cmd = F_SETLK; - break; - case GF_LK_SETLKW: - this_args->cmd = F_SETLKW; - break; - } - - gf_proto_flock_to_flock(&args->flock, &this_args->lock); - - switch (args->type) { - case GF_LK_F_RDLCK: - this_args->lock.l_type = F_RDLCK; - break; - case GF_LK_F_WRLCK: - this_args->lock.l_type = F_WRLCK; - break; - case GF_LK_F_UNLCK: - this_args->lock.l_type = F_UNLCK; - break; - } - args_finodelk_store(this_args, args->volume, state->fd, - this_args->cmd, &this_args->lock, xdata); - break; - } - case GF_FOP_ENTRYLK: { - gfs3_entrylk_req *args = NULL; - - args = &this_req->compound_req_u.compound_entrylk_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_entrylk_store(this_args, args->volume, &state->loc, args->name, - args->cmd, args->type, xdata); - break; - } - case GF_FOP_FENTRYLK: { - gfs3_fentrylk_req *args = NULL; - - args = &this_req->compound_req_u.compound_fentrylk_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_fentrylk_store(this_args, args->volume, state->fd, args->name, - args->cmd, args->type, xdata); - break; - } - case GF_FOP_XATTROP: { - gfs3_xattrop_req *args = NULL; - - args = &this_req->compound_req_u.compound_xattrop_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xattr, (args->dict.dict_val), - (args->dict.dict_len), ret, op_errno, out); - args_xattrop_store(this_args, &state->loc, args->flags, xattr, - xdata); - break; - } - case GF_FOP_FXATTROP: { - gfs3_fxattrop_req *args = NULL; - - args = &this_req->compound_req_u.compound_fxattrop_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xattr, (args->dict.dict_val), - (args->dict.dict_len), ret, op_errno, out); - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - args_fxattrop_store(this_args, state->fd, args->flags, xattr, - xdata); - break; - } - case GF_FOP_FGETXATTR: { - gfs3_fgetxattr_req *args = NULL; - - args = &this_req->compound_req_u.compound_fgetxattr_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - args_fgetxattr_store(this_args, state->fd, args->name, xdata); - break; - } - case GF_FOP_FSETXATTR: { - gfs3_fsetxattr_req *args = NULL; - - args = &this_req->compound_req_u.compound_fsetxattr_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xattr, (args->dict.dict_val), - (args->dict.dict_len), ret, op_errno, out); - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - args_fsetxattr_store(this_args, state->fd, xattr, args->flags, - xdata); - break; - } - case GF_FOP_RCHECKSUM: { - gfs3_rchecksum_req *args = NULL; - - args = &this_req->compound_req_u.compound_rchecksum_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - args_rchecksum_store(this_args, state->fd, args->offset, args->len, - xdata); - break; - } - case GF_FOP_SETATTR: { - gfs3_setattr_req *args = NULL; - - args = &this_req->compound_req_u.compound_setattr_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - gf_stat_to_iatt(&args->stbuf, &this_args->stat); - - args_setattr_store(this_args, &state->loc, &this_args->stat, - args->valid, xdata); - break; - } - case GF_FOP_FSETATTR: { - gfs3_fsetattr_req *args = NULL; - - args = &this_req->compound_req_u.compound_fsetattr_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - gf_stat_to_iatt(&args->stbuf, &this_args->stat); - - args_fsetattr_store(this_args, state->fd, &this_args->stat, - args->valid, xdata); - break; - } - case GF_FOP_READDIRP: { - gfs3_readdirp_req *args = NULL; - - args = &this_req->compound_req_u.compound_readdirp_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xattr, (args->dict.dict_val), - (args->dict.dict_len), ret, op_errno, out); - - args_readdirp_store(this_args, state->fd, args->size, args->offset, - xattr); - break; - } - case GF_FOP_FREMOVEXATTR: { - gfs3_fremovexattr_req *args = NULL; - - args = &this_req->compound_req_u.compound_fremovexattr_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - args_fremovexattr_store(this_args, state->fd, args->name, xdata); - break; - } - case GF_FOP_FALLOCATE: { - gfs3_fallocate_req *args = NULL; - - args = &this_req->compound_req_u.compound_fallocate_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_fallocate_store(this_args, state->fd, args->flags, - args->offset, args->size, xdata); - break; - } - case GF_FOP_DISCARD: { - gfs3_discard_req *args = NULL; - - args = &this_req->compound_req_u.compound_discard_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - args_discard_store(this_args, state->fd, args->offset, args->size, - xdata); - break; - } - case GF_FOP_ZEROFILL: { - gfs3_zerofill_req *args = NULL; - - args = &this_req->compound_req_u.compound_zerofill_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_zerofill_store(this_args, state->fd, args->offset, args->size, - xdata); - break; - } - case GF_FOP_SEEK: { - gfs3_seek_req *args = NULL; - - args = &this_req->compound_req_u.compound_seek_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - args_seek_store(this_args, state->fd, args->offset, args->what, - xdata); - break; - } - case GF_FOP_LEASE: { - gfs3_lease_req *args = NULL; - - args = &this_req->compound_req_u.compound_lease_req; - - GF_PROTOCOL_DICT_UNSERIALIZE( - frame->root->client->bound_xl, xdata, args->xdata.xdata_val, - args->xdata.xdata_len, ret, op_errno, out); - - gf_proto_lease_to_lease(&args->lease, &state->lease); - - args_lease_store(this_args, &state->loc, &state->lease, xdata); - break; - } - default: - return ENOTSUP; - } -out: - if (xattr) - dict_unref(xattr); - if (xdata) - dict_unref(xdata); - return op_errno; -} - -int -server_populate_compound_response(xlator_t *this, gfs3_compound_rsp *rsp, - call_frame_t *frame, - compound_args_cbk_t *args_cbk, int index) -{ - int op_errno = EINVAL; - default_args_cbk_t *this_args_cbk = NULL; - compound_rsp *this_rsp = NULL; - server_state_t *state = NULL; - int ret = 0; - - state = CALL_STATE(frame); - this_rsp = &rsp->compound_rsp_array.compound_rsp_array_val[index]; - - this_args_cbk = &args_cbk->rsp_list[index]; - this_rsp->fop_enum = args_cbk->enum_list[index]; - - switch (this_rsp->fop_enum) { - case GF_FOP_STAT: { - gfs3_stat_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_stat_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - if (!this_args_cbk->op_ret) { - server_post_stat(state, rsp_args, &this_args_cbk->stat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_READLINK: { - gfs3_readlink_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_readlink_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - if (this_args_cbk->op_ret >= 0) { - server_post_readlink(rsp_args, &this_args_cbk->stat, - this_args_cbk->buf); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - if (!rsp_args->path) - rsp_args->path = ""; - break; - } - case GF_FOP_MKNOD: { - gfs3_mknod_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_mknod_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - if (!this_args_cbk->op_ret) { - server_post_mknod(state, rsp_args, &this_args_cbk->stat, - &this_args_cbk->preparent, - &this_args_cbk->postparent, - this_args_cbk->inode); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_MKDIR: { - gfs3_mkdir_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_mkdir_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_mkdir( - state, rsp_args, this_args_cbk->inode, &this_args_cbk->stat, - &this_args_cbk->preparent, &this_args_cbk->postparent, - this_args_cbk->xdata); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_UNLINK: { - gfs3_unlink_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_unlink_rsp; - - if (gf_replace_old_iatt_in_dict(this_args_cbk->xdata)) { - rsp_args->op_errno = errno; - rsp_args->op_ret = -1; - goto out; - } - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - if (!this_args_cbk->op_ret) { - server_post_unlink(state, rsp_args, &this_args_cbk->preparent, - &this_args_cbk->postparent); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_RMDIR: { - gfs3_rmdir_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_rmdir_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - if (!this_args_cbk->op_ret) { - server_post_rmdir(state, rsp_args, &this_args_cbk->preparent, - &this_args_cbk->postparent); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_SYMLINK: { - gfs3_symlink_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_symlink_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_symlink( - state, rsp_args, this_args_cbk->inode, &this_args_cbk->stat, - &this_args_cbk->preparent, &this_args_cbk->postparent, - this_args_cbk->xdata); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_RENAME: { - gfs3_rename_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_rename_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_rename( - frame, state, rsp_args, &this_args_cbk->stat, - &this_args_cbk->preparent, &this_args_cbk->postparent, - &this_args_cbk->preparent2, &this_args_cbk->postparent2); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_LINK: { - gfs3_link_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_link_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_link( - state, rsp_args, this_args_cbk->inode, &this_args_cbk->stat, - &this_args_cbk->preparent, &this_args_cbk->postparent, - this_args_cbk->xdata); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_TRUNCATE: { - gfs3_truncate_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_truncate_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_truncate(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_OPEN: { - gfs3_open_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_open_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_open(frame, this, rsp_args, this_args_cbk->fd); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_READ: { - gfs3_read_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_read_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (this_args_cbk->op_ret >= 0) { - server_post_readv(rsp_args, &this_args_cbk->stat, - this_args_cbk->op_ret); - - if (!state->rsp_iobref) { - state->rsp_iobref = this_args_cbk->iobref; - state->rsp_count = 0; - } - iobref_merge(state->rsp_iobref, this_args_cbk->iobref); - memcpy(&state->rsp_vector[state->rsp_count], - this_args_cbk->vector, - (this_args_cbk->count * sizeof(state->rsp_vector[0]))); - state->rsp_count += this_args_cbk->count; - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_WRITE: { - gfs3_write_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_write_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (this_args_cbk->op_ret >= 0) { - server_post_writev(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_STATFS: { - gfs3_statfs_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_statfs_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - if (!this_args_cbk->op_ret) { - server_post_statfs(rsp_args, &this_args_cbk->statvfs); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FLUSH: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_flush_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FSYNC: { - gfs3_fsync_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_fsync_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_fsync(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_SETXATTR: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_setxattr_rsp; - - if (gf_replace_old_iatt_in_dict(this_args_cbk->xdata)) { - rsp_args->op_errno = errno; - rsp_args->op_ret = -1; - goto out; - } - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_GETXATTR: { - gfs3_getxattr_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_getxattr_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (-1 != this_args_cbk->op_ret) { - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xattr, &rsp_args->dict.dict_val, - rsp_args->dict.dict_len, rsp_args->op_errno, out); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_REMOVEXATTR: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_removexattr_rsp; - - if (gf_replace_old_iatt_in_dict(this_args_cbk->xdata)) { - rsp_args->op_errno = errno; - rsp_args->op_ret = -1; - goto out; - } - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_OPENDIR: { - gfs3_opendir_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_opendir_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_opendir(frame, this, rsp_args, this_args_cbk->fd); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FSYNCDIR: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_fsyncdir_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_ACCESS: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_access_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_CREATE: { - gfs3_create_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_create_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - - if (!this_args_cbk->op_ret) { - rsp_args->op_ret = server_post_create( - frame, rsp_args, state, this, this_args_cbk->fd, - this_args_cbk->inode, &this_args_cbk->stat, - &this_args_cbk->preparent, &this_args_cbk->postparent); - if (rsp_args->op_ret) { - rsp_args->op_errno = -rsp_args->op_ret; - rsp_args->op_ret = -1; - } - } - break; - } - case GF_FOP_FTRUNCATE: { - gfs3_ftruncate_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_ftruncate_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_ftruncate(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FSTAT: { - gfs3_fstat_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_fstat_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - if (!this_args_cbk->op_ret) { - server_post_fstat(state, rsp_args, &this_args_cbk->stat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_LK: { - gfs3_lk_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_lk_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_lk(this, rsp_args, &this_args_cbk->lock); - } - - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_LOOKUP: { - gfs3_lookup_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_lookup_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_lookup(rsp_args, frame, state, this_args_cbk->inode, - &this_args_cbk->stat, - &this_args_cbk->postparent); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_READDIR: { - gfs3_readdir_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_readdir_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - - if (this_args_cbk->op_ret > 0) { - ret = server_post_readdir(rsp_args, &this_args_cbk->entries); - if (ret < 0) { - rsp_args->op_ret = ret; - rsp_args->op_errno = ENOMEM; - } - } - break; - } - case GF_FOP_INODELK: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_inodelk_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FINODELK: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_finodelk_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_ENTRYLK: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_entrylk_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FENTRYLK: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_fentrylk_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_XATTROP: { - gfs3_xattrop_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_xattrop_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xattr, &rsp_args->dict.dict_val, - rsp_args->dict.dict_len, rsp_args->op_errno, out); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FXATTROP: { - gfs3_fxattrop_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_fxattrop_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xattr, &rsp_args->dict.dict_val, - rsp_args->dict.dict_len, rsp_args->op_errno, out); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FGETXATTR: { - gfs3_fgetxattr_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_fgetxattr_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (-1 != this_args_cbk->op_ret) { - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xattr, &rsp_args->dict.dict_val, - rsp_args->dict.dict_len, rsp_args->op_errno, out); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FSETXATTR: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_setxattr_rsp; - - if (gf_replace_old_iatt_in_dict(this_args_cbk->xdata)) { - rsp_args->op_errno = errno; - rsp_args->op_ret = -1; - goto out; - } - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_RCHECKSUM: { - gfs3_rchecksum_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_rchecksum_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_rchecksum(rsp_args, this_args_cbk->weak_checksum, - this_args_cbk->strong_checksum); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_SETATTR: { - gfs3_setattr_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_setattr_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_setattr(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FSETATTR: { - gfs3_fsetattr_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_fsetattr_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_fsetattr(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_READDIRP: { - gfs3_readdirp_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_readdirp_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (this_args_cbk->op_ret > 0) { - ret = server_post_readdirp(rsp_args, &this_args_cbk->entries); - if (ret < 0) { - rsp_args->op_ret = ret; - rsp_args->op_errno = ENOMEM; - goto out; - } - gf_link_inodes_from_dirent(this, state->fd->inode, - &this_args_cbk->entries); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FREMOVEXATTR: { - gf_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_fremovexattr_rsp; - - if (gf_replace_old_iatt_in_dict(this_args_cbk->xdata)) { - rsp_args->op_errno = errno; - rsp_args->op_ret = -1; - goto out; - } - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FALLOCATE: { - gfs3_fallocate_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_fallocate_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_fallocate(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_DISCARD: { - gfs3_discard_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_discard_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_discard(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_ZEROFILL: { - gfs3_zerofill_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_zerofill_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_zerofill(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_SEEK: { - gfs3_seek_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_seek_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_LEASE: { - gfs3_lease_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_u.compound_lease_rsp; - - GF_PROTOCOL_DICT_SERIALIZE( - this, this_args_cbk->xdata, &rsp_args->xdata.xdata_val, - rsp_args->xdata.xdata_len, rsp_args->op_errno, out); - - if (!this_args_cbk->op_ret) { - server_post_lease(rsp_args, &this_args_cbk->lease); - } - - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - default: - return ENOTSUP; - } - op_errno = 0; -out: - return op_errno; -} -/* This works only when the compound fop acts on one loc/inode/gfid. - * If compound fops on more than one inode is required, multiple - * resolve and resumes will have to be done. This will have to change. - * Right now, multiple unlinks, rmdirs etc is are not supported. - * This can be added for future enhancements. - */ -int -server_get_compound_resolve(server_state_t *state, gfs3_compound_req *req) -{ - int i = 0; - compound_req *array = &req->compound_req_array.compound_req_array_val[i]; - - switch (array->fop_enum) { - case GF_FOP_STAT: { - gfs3_stat_req this_req = array[i].compound_req_u.compound_stat_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_READLINK: { - gfs3_readlink_req this_req = - array[i].compound_req_u.compound_readlink_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_MKNOD: { - gfs3_mknod_req this_req = array[i] - .compound_req_u.compound_mknod_req; - - state->resolve.type = RESOLVE_NOT; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_MKDIR: { - gfs3_mkdir_req this_req = array[i] - .compound_req_u.compound_mkdir_req; - - state->resolve.type = RESOLVE_NOT; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_UNLINK: { - gfs3_unlink_req this_req = array[i] - .compound_req_u.compound_unlink_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_RMDIR: { - gfs3_rmdir_req this_req = array[i] - .compound_req_u.compound_rmdir_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_SYMLINK: { - gfs3_symlink_req this_req = - array[i].compound_req_u.compound_symlink_req; - - state->resolve.type = RESOLVE_NOT; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_RENAME: { - gfs3_rename_req this_req = array[i] - .compound_req_u.compound_rename_req; - - state->resolve.type = RESOLVE_MUST; - state->resolve.bname = gf_strdup(this_req.oldbname); - memcpy(state->resolve.pargfid, this_req.oldgfid, 16); - - state->resolve2.type = RESOLVE_MAY; - state->resolve2.bname = gf_strdup(this_req.newbname); - memcpy(state->resolve2.pargfid, this_req.newgfid, 16); - break; - } - case GF_FOP_LINK: { - gfs3_link_req this_req = array[i].compound_req_u.compound_link_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.oldgfid, 16); - - state->resolve2.type = RESOLVE_NOT; - state->resolve2.bname = gf_strdup(this_req.newbname); - memcpy(state->resolve2.pargfid, this_req.newgfid, 16); - break; - } - case GF_FOP_TRUNCATE: { - gfs3_truncate_req this_req = - array[i].compound_req_u.compound_truncate_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_OPEN: { - gfs3_open_req this_req = array[i].compound_req_u.compound_open_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_READ: { - gfs3_read_req this_req = array[i].compound_req_u.compound_read_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_WRITE: { - gfs3_write_req this_req = array[i] - .compound_req_u.compound_write_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_STATFS: { - gfs3_statfs_req this_req = array[i] - .compound_req_u.compound_statfs_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FLUSH: { - gfs3_flush_req this_req = array[i] - .compound_req_u.compound_flush_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FSYNC: { - gfs3_fsync_req this_req = array[i] - .compound_req_u.compound_fsync_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_SETXATTR: { - gfs3_setxattr_req this_req = - array[i].compound_req_u.compound_setxattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_GETXATTR: { - gfs3_getxattr_req this_req = - array[i].compound_req_u.compound_getxattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_REMOVEXATTR: { - gfs3_removexattr_req this_req = - array[i].compound_req_u.compound_removexattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_OPENDIR: { - gfs3_opendir_req this_req = - array[i].compound_req_u.compound_opendir_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FSYNCDIR: { - gfs3_fsyncdir_req this_req = - array[i].compound_req_u.compound_fsyncdir_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_ACCESS: { - gfs3_access_req this_req = array[i] - .compound_req_u.compound_access_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_CREATE: { - gfs3_create_req this_req = array[i] - .compound_req_u.compound_create_req; - - state->flags = gf_flags_to_flags(this_req.flags); - if (state->flags & O_EXCL) { - state->resolve.type = RESOLVE_NOT; - } else { - state->resolve.type = RESOLVE_DONTCARE; - } - - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_FTRUNCATE: { - gfs3_ftruncate_req this_req = - array[i].compound_req_u.compound_ftruncate_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FSTAT: { - gfs3_fstat_req this_req = array[i] - .compound_req_u.compound_fstat_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_LK: { - gfs3_lk_req this_req = array[i].compound_req_u.compound_lk_req; - - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_LOOKUP: { - gfs3_lookup_req this_req = array[i] - .compound_req_u.compound_lookup_req; - state->resolve.type = RESOLVE_DONTCARE; - - if (this_req.bname && strcmp(this_req.bname, "")) { - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - } else { - memcpy(state->resolve.gfid, this_req.gfid, 16); - } - break; - } - case GF_FOP_READDIR: { - gfs3_readdir_req this_req = - array[i].compound_req_u.compound_readdir_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_INODELK: { - gfs3_inodelk_req this_req = - array[i].compound_req_u.compound_inodelk_req; - - state->resolve.type = RESOLVE_EXACT; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FINODELK: { - gfs3_finodelk_req this_req = - array[i].compound_req_u.compound_finodelk_req; - - state->resolve.type = RESOLVE_EXACT; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_ENTRYLK: { - gfs3_entrylk_req this_req = - array[i].compound_req_u.compound_entrylk_req; - - state->resolve.type = RESOLVE_EXACT; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FENTRYLK: { - gfs3_fentrylk_req this_req = - array[i].compound_req_u.compound_fentrylk_req; - - state->resolve.type = RESOLVE_EXACT; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_XATTROP: { - gfs3_xattrop_req this_req = - array[i].compound_req_u.compound_xattrop_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FXATTROP: { - gfs3_fxattrop_req this_req = - array[i].compound_req_u.compound_fxattrop_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FGETXATTR: { - gfs3_fgetxattr_req this_req = - array[i].compound_req_u.compound_fgetxattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FSETXATTR: { - gfs3_fsetxattr_req this_req = - array[i].compound_req_u.compound_fsetxattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_RCHECKSUM: { - gfs3_rchecksum_req this_req = - array[i].compound_req_u.compound_rchecksum_req; - - state->resolve.type = RESOLVE_MAY; - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_SETATTR: { - gfs3_setattr_req this_req = - array[i].compound_req_u.compound_setattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FSETATTR: { - gfs3_fsetattr_req this_req = - array[i].compound_req_u.compound_fsetattr_req; - - state->resolve.type = RESOLVE_MUST; - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_READDIRP: { - gfs3_readdirp_req this_req = - array[i].compound_req_u.compound_readdirp_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FREMOVEXATTR: { - gfs3_fremovexattr_req this_req = - array[i].compound_req_u.compound_fremovexattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FALLOCATE: { - gfs3_fallocate_req this_req = - array[i].compound_req_u.compound_fallocate_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_DISCARD: { - gfs3_discard_req this_req = - array[i].compound_req_u.compound_discard_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_ZEROFILL: { - gfs3_zerofill_req this_req = - array[i].compound_req_u.compound_zerofill_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_SEEK: { - gfs3_seek_req this_req = array[i].compound_req_u.compound_seek_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_LEASE: { - gfs3_lease_req this_req = array[i] - .compound_req_u.compound_lease_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - default: - return ENOTSUP; - } - return 0; -} - -void -server_compound_rsp_cleanup(gfs3_compound_rsp *rsp, compound_args_cbk_t *args) -{ - int i, len = 0; - compound_rsp *this_rsp = NULL; - - if (!rsp->compound_rsp_array.compound_rsp_array_val) - return; - - len = rsp->compound_rsp_array.compound_rsp_array_len; - - for (i = 0; i < len; i++) { - this_rsp = &rsp->compound_rsp_array.compound_rsp_array_val[i]; - switch (args->enum_list[i]) { - case GF_FOP_STAT: - SERVER_FOP_RSP_CLEANUP(rsp, stat, i); - break; - case GF_FOP_MKNOD: - SERVER_FOP_RSP_CLEANUP(rsp, mknod, i); - break; - case GF_FOP_MKDIR: - SERVER_FOP_RSP_CLEANUP(rsp, mkdir, i); - break; - case GF_FOP_UNLINK: - SERVER_FOP_RSP_CLEANUP(rsp, unlink, i); - break; - case GF_FOP_RMDIR: - SERVER_FOP_RSP_CLEANUP(rsp, rmdir, i); - break; - case GF_FOP_SYMLINK: - SERVER_FOP_RSP_CLEANUP(rsp, symlink, i); - break; - case GF_FOP_RENAME: - SERVER_FOP_RSP_CLEANUP(rsp, rename, i); - break; - case GF_FOP_LINK: - SERVER_FOP_RSP_CLEANUP(rsp, link, i); - break; - case GF_FOP_TRUNCATE: - SERVER_FOP_RSP_CLEANUP(rsp, truncate, i); - break; - case GF_FOP_OPEN: - SERVER_FOP_RSP_CLEANUP(rsp, open, i); - break; - case GF_FOP_READ: - SERVER_FOP_RSP_CLEANUP(rsp, read, i); - break; - case GF_FOP_WRITE: - SERVER_FOP_RSP_CLEANUP(rsp, write, i); - break; - case GF_FOP_STATFS: - SERVER_FOP_RSP_CLEANUP(rsp, statfs, i); - break; - case GF_FOP_FSYNC: - SERVER_FOP_RSP_CLEANUP(rsp, fsync, i); - break; - case GF_FOP_OPENDIR: - SERVER_FOP_RSP_CLEANUP(rsp, opendir, i); - break; - case GF_FOP_CREATE: - SERVER_FOP_RSP_CLEANUP(rsp, create, i); - break; - case GF_FOP_FTRUNCATE: - SERVER_FOP_RSP_CLEANUP(rsp, ftruncate, i); - break; - case GF_FOP_FSTAT: - SERVER_FOP_RSP_CLEANUP(rsp, fstat, i); - break; - case GF_FOP_LK: - SERVER_FOP_RSP_CLEANUP(rsp, lk, i); - break; - case GF_FOP_LOOKUP: - SERVER_FOP_RSP_CLEANUP(rsp, lookup, i); - break; - case GF_FOP_SETATTR: - SERVER_FOP_RSP_CLEANUP(rsp, setattr, i); - break; - case GF_FOP_FSETATTR: - SERVER_FOP_RSP_CLEANUP(rsp, fsetattr, i); - break; - case GF_FOP_FALLOCATE: - SERVER_FOP_RSP_CLEANUP(rsp, fallocate, i); - break; - case GF_FOP_DISCARD: - SERVER_FOP_RSP_CLEANUP(rsp, discard, i); - break; - case GF_FOP_ZEROFILL: - SERVER_FOP_RSP_CLEANUP(rsp, zerofill, i); - break; - case GF_FOP_IPC: - SERVER_FOP_RSP_CLEANUP(rsp, ipc, i); - break; - case GF_FOP_SEEK: - SERVER_FOP_RSP_CLEANUP(rsp, seek, i); - break; - case GF_FOP_LEASE: - SERVER_FOP_RSP_CLEANUP(rsp, lease, i); - break; - /* fops that use gf_common_rsp */ - case GF_FOP_FLUSH: - SERVER_COMMON_RSP_CLEANUP(rsp, flush, i); - break; - case GF_FOP_SETXATTR: - SERVER_COMMON_RSP_CLEANUP(rsp, setxattr, i); - break; - case GF_FOP_REMOVEXATTR: - SERVER_COMMON_RSP_CLEANUP(rsp, removexattr, i); - break; - case GF_FOP_FSETXATTR: - SERVER_COMMON_RSP_CLEANUP(rsp, fsetxattr, i); - break; - case GF_FOP_FREMOVEXATTR: - SERVER_COMMON_RSP_CLEANUP(rsp, fremovexattr, i); - break; - case GF_FOP_FSYNCDIR: - SERVER_COMMON_RSP_CLEANUP(rsp, fsyncdir, i); - break; - case GF_FOP_ACCESS: - SERVER_COMMON_RSP_CLEANUP(rsp, access, i); - break; - case GF_FOP_INODELK: - SERVER_COMMON_RSP_CLEANUP(rsp, inodelk, i); - break; - case GF_FOP_FINODELK: - SERVER_COMMON_RSP_CLEANUP(rsp, finodelk, i); - break; - case GF_FOP_ENTRYLK: - SERVER_COMMON_RSP_CLEANUP(rsp, entrylk, i); - break; - case GF_FOP_FENTRYLK: - SERVER_COMMON_RSP_CLEANUP(rsp, fentrylk, i); - break; - case GF_FOP_READLINK: - SERVER_FOP_RSP_CLEANUP(rsp, readlink, i); - break; - case GF_FOP_RCHECKSUM: - SERVER_FOP_RSP_CLEANUP(rsp, rchecksum, i); - break; - /* fops that need extra cleanup */ - case GF_FOP_XATTROP: { - gfs3_xattrop_rsp *tmp_rsp = &CPD_RSP_FIELD(this_rsp, xattrop); - SERVER_FOP_RSP_CLEANUP(rsp, xattrop, i); - GF_FREE(tmp_rsp->dict.dict_val); - break; - } - case GF_FOP_FXATTROP: { - gfs3_fxattrop_rsp *tmp_rsp = &CPD_RSP_FIELD(this_rsp, fxattrop); - SERVER_FOP_RSP_CLEANUP(rsp, fxattrop, i); - GF_FREE(tmp_rsp->dict.dict_val); - break; - } - case GF_FOP_READDIR: { - gfs3_readdir_rsp *tmp_rsp = &CPD_RSP_FIELD(this_rsp, readdir); - SERVER_FOP_RSP_CLEANUP(rsp, readdir, i); - readdir_rsp_cleanup(tmp_rsp); - break; - } - case GF_FOP_READDIRP: { - gfs3_readdirp_rsp *tmp_rsp = &CPD_RSP_FIELD(this_rsp, readdirp); - SERVER_FOP_RSP_CLEANUP(rsp, readdir, i); - readdirp_rsp_cleanup(tmp_rsp); - break; - } - case GF_FOP_GETXATTR: { - gfs3_getxattr_rsp *tmp_rsp = &CPD_RSP_FIELD(this_rsp, getxattr); - SERVER_FOP_RSP_CLEANUP(rsp, getxattr, i); - GF_FREE(tmp_rsp->dict.dict_val); - break; - } - case GF_FOP_FGETXATTR: { - gfs3_fgetxattr_rsp *tmp_rsp = &CPD_RSP_FIELD(this_rsp, - fgetxattr); - SERVER_FOP_RSP_CLEANUP(rsp, fgetxattr, i); - GF_FREE(tmp_rsp->dict.dict_val); - break; - } - default: - break; - } - } - GF_FREE(rsp->compound_rsp_array.compound_rsp_array_val); - return; -} - -void -server_compound_req_cleanup(gfs3_compound_req *req, int len) -{ - int i = 0; - compound_req *curr_req = NULL; - - if (!req->compound_req_array.compound_req_array_val) - return; - - for (i = 0; i < len; i++) { - curr_req = &req->compound_req_array.compound_req_array_val[i]; - - switch (curr_req->fop_enum) { - case GF_FOP_STAT: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, stat); - break; - case GF_FOP_READLINK: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, readlink); - break; - case GF_FOP_MKNOD: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, mknod); - break; - case GF_FOP_MKDIR: { - gfs3_mkdir_req *args = &CPD_REQ_FIELD(curr_req, mkdir); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, mkdir); - free(args->bname); - break; - } - case GF_FOP_UNLINK: { - gfs3_unlink_req *args = &CPD_REQ_FIELD(curr_req, unlink); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, unlink); - free(args->bname); - break; - } - case GF_FOP_RMDIR: { - gfs3_rmdir_req *args = &CPD_REQ_FIELD(curr_req, rmdir); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, rmdir); - free(args->bname); - break; - } - case GF_FOP_SYMLINK: { - gfs3_symlink_req *args = &CPD_REQ_FIELD(curr_req, symlink); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, symlink); - free(args->bname); - free(args->linkname); - break; - } - case GF_FOP_RENAME: { - gfs3_rename_req *args = &CPD_REQ_FIELD(curr_req, rename); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, rename); - free(args->oldbname); - free(args->newbname); - break; - } - case GF_FOP_LINK: { - gfs3_link_req *args = &CPD_REQ_FIELD(curr_req, link); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, link); - free(args->newbname); - break; - } - case GF_FOP_TRUNCATE: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, truncate); - break; - case GF_FOP_OPEN: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, open); - break; - case GF_FOP_READ: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, read); - break; - case GF_FOP_WRITE: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, write); - break; - case GF_FOP_STATFS: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, statfs); - break; - case GF_FOP_FLUSH: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, flush); - break; - case GF_FOP_FSYNC: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fsync); - break; - case GF_FOP_SETXATTR: { - gfs3_setxattr_req *args = &CPD_REQ_FIELD(curr_req, setxattr); - - free(args->dict.dict_val); - SERVER_COMPOUND_FOP_CLEANUP(curr_req, setxattr); - break; - } - case GF_FOP_GETXATTR: { - gfs3_getxattr_req *args = &CPD_REQ_FIELD(curr_req, getxattr); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, getxattr); - free(args->name); - break; - } - case GF_FOP_REMOVEXATTR: { - gfs3_removexattr_req *args = &CPD_REQ_FIELD(curr_req, - removexattr); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, removexattr); - free(args->name); - break; - } - case GF_FOP_OPENDIR: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, opendir); - break; - case GF_FOP_FSYNCDIR: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fsyncdir); - break; - case GF_FOP_ACCESS: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, access); - break; - case GF_FOP_CREATE: { - gfs3_create_req *args = &CPD_REQ_FIELD(curr_req, create); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, create); - free(args->bname); - break; - } - case GF_FOP_FTRUNCATE: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, ftruncate); - break; - case GF_FOP_FSTAT: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fstat); - break; - case GF_FOP_LK: { - gfs3_lk_req *args = &CPD_REQ_FIELD(curr_req, lk); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, lk); - free(args->flock.lk_owner.lk_owner_val); - break; - } - case GF_FOP_LOOKUP: { - gfs3_lookup_req *args = &CPD_REQ_FIELD(curr_req, lookup); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, lookup); - free(args->bname); - break; - } - case GF_FOP_READDIR: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, readdir); - break; - case GF_FOP_INODELK: { - gfs3_inodelk_req *args = &CPD_REQ_FIELD(curr_req, inodelk); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, inodelk); - free(args->volume); - free(args->flock.lk_owner.lk_owner_val); - break; - } - case GF_FOP_FINODELK: { - gfs3_finodelk_req *args = &CPD_REQ_FIELD(curr_req, finodelk); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, finodelk); - free(args->volume); - free(args->flock.lk_owner.lk_owner_val); - break; - } - case GF_FOP_ENTRYLK: { - gfs3_entrylk_req *args = &CPD_REQ_FIELD(curr_req, entrylk); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, entrylk); - free(args->volume); - free(args->name); - break; - } - case GF_FOP_FENTRYLK: { - gfs3_fentrylk_req *args = &CPD_REQ_FIELD(curr_req, fentrylk); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fentrylk); - free(args->volume); - free(args->name); - break; - } - case GF_FOP_XATTROP: { - gfs3_xattrop_req *args = &CPD_REQ_FIELD(curr_req, xattrop); - - free(args->dict.dict_val); - SERVER_COMPOUND_FOP_CLEANUP(curr_req, xattrop); - break; - } - case GF_FOP_FXATTROP: { - gfs3_fxattrop_req *args = &CPD_REQ_FIELD(curr_req, fxattrop); - - free(args->dict.dict_val); - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fxattrop); - break; - } - case GF_FOP_FGETXATTR: { - gfs3_fgetxattr_req *args = &CPD_REQ_FIELD(curr_req, fgetxattr); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fgetxattr); - free(args->name); - break; - } - case GF_FOP_FSETXATTR: { - gfs3_fsetxattr_req *args = &CPD_REQ_FIELD(curr_req, fsetxattr); - - free(args->dict.dict_val); - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fsetxattr); - break; - } - case GF_FOP_RCHECKSUM: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, rchecksum); - break; - case GF_FOP_SETATTR: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, setattr); - break; - case GF_FOP_FSETATTR: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fsetattr); - break; - case GF_FOP_READDIRP: { - gfs3_readdirp_req *args = &CPD_REQ_FIELD(curr_req, readdirp); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fremovexattr); - free(args->dict.dict_val); - break; - } - case GF_FOP_FREMOVEXATTR: { - gfs3_fremovexattr_req *args = &CPD_REQ_FIELD(curr_req, - fremovexattr); - - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fremovexattr); - free(args->name); - break; - } - case GF_FOP_FALLOCATE: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, fallocate); - break; - case GF_FOP_DISCARD: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, discard); - break; - case GF_FOP_ZEROFILL: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, zerofill); - break; - case GF_FOP_IPC: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, ipc); - break; - case GF_FOP_SEEK: - SERVER_COMPOUND_FOP_CLEANUP(curr_req, seek); - break; - default: - break; - } - } - - return; -} - -/* compound v2 */ -int -server_populate_compound_request_v2(gfx_compound_req *req, call_frame_t *frame, - default_args_t *this_args, int index) -{ - int op_errno = 0; - dict_t *xdata = NULL; - dict_t *xattr = NULL; - struct iovec req_iovec[MAX_IOVEC] = {{ - 0, - }}; - compound_req_v2 *this_req = NULL; - server_state_t *state = CALL_STATE(frame); - - this_req = &req->compound_req_array.compound_req_array_val[index]; - - switch (this_req->fop_enum) { - case GF_FOP_STAT: { - gfx_stat_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_stat_req; - - xdr_to_dict(&args->xdata, &xdata); - args_stat_store(this_args, &state->loc, xdata); - break; - } - case GF_FOP_READLINK: { - gfx_readlink_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_readlink_req; - - xdr_to_dict(&args->xdata, &xdata); - args_readlink_store(this_args, &state->loc, args->size, xdata); - break; - } - case GF_FOP_MKNOD: { - gfx_mknod_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_mknod_req; - - xdr_to_dict(&args->xdata, &xdata); - args_mknod_store(this_args, &state->loc, args->mode, args->dev, - args->umask, xdata); - break; - } - case GF_FOP_MKDIR: { - gfx_mkdir_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_mkdir_req; - - xdr_to_dict(&args->xdata, &xdata); - args_mkdir_store(this_args, &state->loc, args->mode, args->umask, - xdata); - break; - } - case GF_FOP_UNLINK: { - gfx_unlink_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_unlink_req; - - xdr_to_dict(&args->xdata, &xdata); - args_unlink_store(this_args, &state->loc, args->xflags, xdata); - break; - } - case GF_FOP_RMDIR: { - gfx_rmdir_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_rmdir_req; - - xdr_to_dict(&args->xdata, &xdata); - args_rmdir_store(this_args, &state->loc, args->xflags, xdata); - break; - } - case GF_FOP_SYMLINK: { - gfx_symlink_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_symlink_req; - - xdr_to_dict(&args->xdata, &xdata); - args_symlink_store(this_args, args->linkname, &state->loc, - args->umask, xdata); - - this_args->loc.inode = inode_new(state->itable); - - break; - } - case GF_FOP_RENAME: { - gfx_rename_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_rename_req; - - xdr_to_dict(&args->xdata, &xdata); - - args_rename_store(this_args, &state->loc, &state->loc2, xdata); - break; - } - case GF_FOP_LINK: { - gfx_link_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_link_req; - - xdr_to_dict(&args->xdata, &xdata); - args_link_store(this_args, &state->loc, &state->loc2, xdata); - - this_args->loc2.inode = inode_ref(this_args->loc.inode); - - break; - } - case GF_FOP_TRUNCATE: { - gfx_truncate_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_truncate_req; - - xdr_to_dict(&args->xdata, &xdata); - args_truncate_store(this_args, &state->loc, args->offset, xdata); - break; - } - case GF_FOP_OPEN: { - gfx_open_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_open_req; - - xdr_to_dict(&args->xdata, &xdata); - args_open_store(this_args, &state->loc, args->flags, state->fd, - xdata); - - this_args->fd = fd_create(this_args->loc.inode, frame->root->pid); - this_args->fd->flags = this_args->flags; - - break; - } - case GF_FOP_READ: { - gfx_read_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_read_req; - - xdr_to_dict(&args->xdata, &xdata); - args_readv_store(this_args, state->fd, args->size, args->offset, - args->flag, xdata); - break; - } - case GF_FOP_WRITE: { - gfx_write_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_write_req; - - /*TODO : What happens when payload count is more than one? */ - req_iovec[0].iov_base = state->payload_vector[0].iov_base + - state->write_length; - req_iovec[0].iov_len = args->size; - - xdr_to_dict(&args->xdata, &xdata); - /* The way writev fop works : - * xdr args of write along with other args contains - * write length not count. But when the call is wound to posix, - * this length is not used. It is taken from the request - * write vector that is passed down. Posix needs the vector - * count to determine the amount of write to be done. - * This count for writes that come as part of compound fops - * will be 1. The vectors are merged into one under - * GF_FOP_WRITE section of client_handle_fop_requirements() - * in protocol client. - */ - args_writev_store(this_args, state->fd, req_iovec, 1, args->offset, - args->flag, state->iobref, xdata); - state->write_length += req_iovec[0].iov_len; - break; - } - case GF_FOP_STATFS: { - gfx_statfs_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_statfs_req; - - xdr_to_dict(&args->xdata, &xdata); - args_statfs_store(this_args, &state->loc, xdata); - break; - } - case GF_FOP_FLUSH: { - gfx_flush_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_flush_req; - - xdr_to_dict(&args->xdata, &xdata); - args_flush_store(this_args, state->fd, xdata); - break; - } - case GF_FOP_FSYNC: { - gfx_fsync_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fsync_req; - - xdr_to_dict(&args->xdata, &xdata); - args_fsync_store(this_args, state->fd, args->data, xdata); - break; - } - case GF_FOP_SETXATTR: { - gfx_setxattr_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_setxattr_req; - - xdr_to_dict(&args->dict, &xattr); - xdr_to_dict(&args->xdata, &xdata); - args_setxattr_store(this_args, &state->loc, xattr, args->flags, - xdata); - break; - } - case GF_FOP_GETXATTR: { - gfx_getxattr_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_getxattr_req; - - xdr_to_dict(&args->xdata, &xdata); - gf_server_check_getxattr_cmd(frame, args->name); - - args_getxattr_store(this_args, &state->loc, args->name, xdata); - break; - } - case GF_FOP_REMOVEXATTR: { - gfx_removexattr_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_removexattr_req; - - xdr_to_dict(&args->xdata, &xdata); - args_removexattr_store(this_args, &state->loc, args->name, xdata); - break; - } - case GF_FOP_OPENDIR: { - gfx_opendir_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_opendir_req; - - this_args->fd = fd_create(this_args->loc.inode, frame->root->pid); - if (!this_args->fd) { - gf_msg("server", GF_LOG_ERROR, 0, PS_MSG_FD_CREATE_FAILED, - "could not create the fd"); - goto out; - } - xdr_to_dict(&args->xdata, &xdata); - - args_opendir_store(this_args, &state->loc, state->fd, xdata); - break; - } - case GF_FOP_FSYNCDIR: { - gfx_fsyncdir_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fsyncdir_req; - - xdr_to_dict(&args->xdata, &xdata); - args_fsyncdir_store(this_args, state->fd, args->data, xdata); - break; - } - case GF_FOP_ACCESS: { - gfx_access_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_access_req; - - xdr_to_dict(&args->xdata, &xdata); - args_access_store(this_args, &state->loc, args->mask, xdata); - break; - } - case GF_FOP_CREATE: { - gfx_create_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_create_req; - - state->loc.inode = inode_new(state->itable); - - state->fd = fd_create(state->loc.inode, frame->root->pid); - if (!state->fd) { - gf_msg("server", GF_LOG_ERROR, 0, PS_MSG_FD_CREATE_FAILED, - "fd creation for the inode %s failed", - state->loc.inode ? uuid_utoa(state->loc.inode->gfid) - : NULL); - goto out; - } - state->fd->flags = state->flags; - - xdr_to_dict(&args->xdata, &xdata); - args_create_store(this_args, &state->loc, args->flags, args->mode, - args->umask, state->fd, xdata); - break; - } - case GF_FOP_FTRUNCATE: { - gfx_ftruncate_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_ftruncate_req; - - xdr_to_dict(&args->xdata, &xdata); - args_ftruncate_store(this_args, state->fd, args->offset, xdata); - break; - } - case GF_FOP_FSTAT: { - gfx_fstat_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fstat_req; - - xdr_to_dict(&args->xdata, &xdata); - args_fstat_store(this_args, state->fd, xdata); - break; - } - case GF_FOP_LK: { - gfx_lk_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_lk_req; - - xdr_to_dict(&args->xdata, &xdata); - - switch (args->cmd) { - case GF_LK_GETLK: - this_args->cmd = F_GETLK; - break; - case GF_LK_SETLK: - this_args->cmd = F_SETLK; - break; - case GF_LK_SETLKW: - this_args->cmd = F_SETLKW; - break; - case GF_LK_RESLK_LCK: - this_args->cmd = F_RESLK_LCK; - break; - case GF_LK_RESLK_LCKW: - this_args->cmd = F_RESLK_LCKW; - break; - case GF_LK_RESLK_UNLCK: - this_args->cmd = F_RESLK_UNLCK; - break; - case GF_LK_GETLK_FD: - this_args->cmd = F_GETLK_FD; - break; - } - - gf_proto_flock_to_flock(&args->flock, &this_args->lock); - - switch (args->type) { - case GF_LK_F_RDLCK: - this_args->lock.l_type = F_RDLCK; - break; - case GF_LK_F_WRLCK: - this_args->lock.l_type = F_WRLCK; - break; - case GF_LK_F_UNLCK: - this_args->lock.l_type = F_UNLCK; - break; - default: - gf_msg(frame->root->client->bound_xl->name, GF_LOG_ERROR, 0, - PS_MSG_LOCK_ERROR, - "fd - %" PRId64 - " (%s):" - " Unknown " - "lock type: %" PRId32 "!", - state->resolve.fd_no, - uuid_utoa(state->fd->inode->gfid), args->type); - break; - } - args_lk_store(this_args, state->fd, this_args->cmd, - &this_args->lock, xdata); - break; - } - case GF_FOP_LOOKUP: { - gfx_lookup_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_lookup_req; - - if (this_args->loc.inode) - this_args->loc.inode = server_inode_new(state->itable, - state->loc.gfid); - else - state->is_revalidate = 1; - - xdr_to_dict(&args->xdata, &xdata); - args_lookup_store(this_args, &state->loc, xdata); - break; - } - case GF_FOP_READDIR: { - gfx_readdir_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_readdir_req; - - xdr_to_dict(&args->xdata, &xdata); - args_readdir_store(this_args, state->fd, args->size, args->offset, - xdata); - break; - } - case GF_FOP_INODELK: { - gfx_inodelk_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_inodelk_req; - - switch (args->cmd) { - case GF_LK_GETLK: - this_args->cmd = F_GETLK; - break; - case GF_LK_SETLK: - this_args->cmd = F_SETLK; - break; - case GF_LK_SETLKW: - this_args->cmd = F_SETLKW; - break; - } - - gf_proto_flock_to_flock(&args->flock, &this_args->lock); - - switch (args->type) { - case GF_LK_F_RDLCK: - this_args->lock.l_type = F_RDLCK; - break; - case GF_LK_F_WRLCK: - this_args->lock.l_type = F_WRLCK; - break; - case GF_LK_F_UNLCK: - this_args->lock.l_type = F_UNLCK; - break; - } - - xdr_to_dict(&args->xdata, &xdata); - args_inodelk_store(this_args, args->volume, &state->loc, - this_args->cmd, &this_args->lock, xdata); - break; - } - case GF_FOP_FINODELK: { - gfx_finodelk_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_finodelk_req; - - xdr_to_dict(&args->xdata, &xdata); - - switch (args->cmd) { - case GF_LK_GETLK: - this_args->cmd = F_GETLK; - break; - case GF_LK_SETLK: - this_args->cmd = F_SETLK; - break; - case GF_LK_SETLKW: - this_args->cmd = F_SETLKW; - break; - } - - gf_proto_flock_to_flock(&args->flock, &this_args->lock); - - switch (args->type) { - case GF_LK_F_RDLCK: - this_args->lock.l_type = F_RDLCK; - break; - case GF_LK_F_WRLCK: - this_args->lock.l_type = F_WRLCK; - break; - case GF_LK_F_UNLCK: - this_args->lock.l_type = F_UNLCK; - break; - } - args_finodelk_store(this_args, args->volume, state->fd, - this_args->cmd, &this_args->lock, xdata); - break; - } - case GF_FOP_ENTRYLK: { - gfx_entrylk_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_entrylk_req; - - xdr_to_dict(&args->xdata, &xdata); - args_entrylk_store(this_args, args->volume, &state->loc, args->name, - args->cmd, args->type, xdata); - break; - } - case GF_FOP_FENTRYLK: { - gfx_fentrylk_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fentrylk_req; - - xdr_to_dict(&args->xdata, &xdata); - args_fentrylk_store(this_args, args->volume, state->fd, args->name, - args->cmd, args->type, xdata); - break; - } - case GF_FOP_XATTROP: { - gfx_xattrop_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_xattrop_req; - - xdr_to_dict(&args->dict, &xattr); - - xdr_to_dict(&args->xdata, &xdata); - args_xattrop_store(this_args, &state->loc, args->flags, xattr, - xdata); - break; - } - case GF_FOP_FXATTROP: { - gfx_fxattrop_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fxattrop_req; - - xdr_to_dict(&args->dict, &xattr); - - xdr_to_dict(&args->xdata, &xdata); - - args_fxattrop_store(this_args, state->fd, args->flags, xattr, - xdata); - break; - } - case GF_FOP_FGETXATTR: { - gfx_fgetxattr_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fgetxattr_req; - - xdr_to_dict(&args->xdata, &xdata); - - args_fgetxattr_store(this_args, state->fd, args->name, xdata); - break; - } - case GF_FOP_FSETXATTR: { - gfx_fsetxattr_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fsetxattr_req; - - xdr_to_dict(&args->dict, &xattr); - - xdr_to_dict(&args->xdata, &xdata); - - args_fsetxattr_store(this_args, state->fd, xattr, args->flags, - xdata); - break; - } - case GF_FOP_RCHECKSUM: { - gfx_rchecksum_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_rchecksum_req; - - xdr_to_dict(&args->xdata, &xdata); - - args_rchecksum_store(this_args, state->fd, args->offset, args->len, - xdata); - break; - } - case GF_FOP_SETATTR: { - gfx_setattr_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_setattr_req; - - xdr_to_dict(&args->xdata, &xdata); - - gfx_stat_to_iattx(&args->stbuf, &this_args->stat); - - args_setattr_store(this_args, &state->loc, &this_args->stat, - args->valid, xdata); - break; - } - case GF_FOP_FSETATTR: { - gfx_fsetattr_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fsetattr_req; - - xdr_to_dict(&args->xdata, &xdata); - - gfx_stat_to_iattx(&args->stbuf, &this_args->stat); - - args_fsetattr_store(this_args, state->fd, &this_args->stat, - args->valid, xdata); - break; - } - case GF_FOP_READDIRP: { - gfx_readdirp_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_readdirp_req; - - xdr_to_dict(&args->xdata, &xdata); - - args_readdirp_store(this_args, state->fd, args->size, args->offset, - xattr); - break; - } - case GF_FOP_FREMOVEXATTR: { - gfx_fremovexattr_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fremovexattr_req; - - xdr_to_dict(&args->xdata, &xdata); - - args_fremovexattr_store(this_args, state->fd, args->name, xdata); - break; - } - case GF_FOP_FALLOCATE: { - gfx_fallocate_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_fallocate_req; - - xdr_to_dict(&args->xdata, &xdata); - args_fallocate_store(this_args, state->fd, args->flags, - args->offset, args->size, xdata); - break; - } - case GF_FOP_DISCARD: { - gfx_discard_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_discard_req; - - xdr_to_dict(&args->xdata, &xdata); - - args_discard_store(this_args, state->fd, args->offset, args->size, - xdata); - break; - } - case GF_FOP_ZEROFILL: { - gfx_zerofill_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_zerofill_req; - - xdr_to_dict(&args->xdata, &xdata); - args_zerofill_store(this_args, state->fd, args->offset, args->size, - xdata); - break; - } - case GF_FOP_SEEK: { - gfx_seek_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_seek_req; - - xdr_to_dict(&args->xdata, &xdata); - args_seek_store(this_args, state->fd, args->offset, args->what, - xdata); - break; - } - case GF_FOP_LEASE: { - gfx_lease_req *args = NULL; - - args = &this_req->compound_req_v2_u.compound_lease_req; - - xdr_to_dict(&args->xdata, &xdata); - - gf_proto_lease_to_lease(&args->lease, &state->lease); - - args_lease_store(this_args, &state->loc, &state->lease, xdata); - break; - } - default: - return ENOTSUP; - } -out: - if (xattr) - dict_unref(xattr); - if (xdata) - dict_unref(xdata); - return op_errno; -} - -int -server_populate_compound_response_v2(xlator_t *this, gfx_compound_rsp *rsp, - call_frame_t *frame, - compound_args_cbk_t *args_cbk, int index) -{ - int op_errno = EINVAL; - default_args_cbk_t *this_args_cbk = NULL; - compound_rsp_v2 *this_rsp = NULL; - server_state_t *state = NULL; - int ret = 0; - - state = CALL_STATE(frame); - this_rsp = &rsp->compound_rsp_array.compound_rsp_array_val[index]; - - this_args_cbk = &args_cbk->rsp_list[index]; - this_rsp->fop_enum = args_cbk->enum_list[index]; - - switch (this_rsp->fop_enum) { - case GF_FOP_FSTAT: - case GF_FOP_STAT: { - gfx_common_iatt_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_stat_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - if (!this_args_cbk->op_ret) { - server4_post_common_iatt(state, rsp_args, &this_args_cbk->stat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_READLINK: { - gfx_readlink_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_readlink_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - if (this_args_cbk->op_ret >= 0) { - server4_post_readlink(rsp_args, &this_args_cbk->stat, - this_args_cbk->buf); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - if (!rsp_args->path) - rsp_args->path = ""; - break; - } - case GF_FOP_MKNOD: - case GF_FOP_MKDIR: - case GF_FOP_SYMLINK: - case GF_FOP_LINK: { - gfx_common_3iatt_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_mknod_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - if (!this_args_cbk->op_ret) { - server4_post_common_3iatt( - state, rsp_args, this_args_cbk->inode, &this_args_cbk->stat, - &this_args_cbk->preparent, &this_args_cbk->postparent); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_UNLINK: - case GF_FOP_RMDIR: { - gfx_common_2iatt_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_unlink_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - if (!this_args_cbk->op_ret) { - server4_post_entry_remove(state, rsp_args, - &this_args_cbk->preparent, - &this_args_cbk->postparent); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_RENAME: { - gfx_rename_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_rename_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - if (!this_args_cbk->op_ret) { - server4_post_rename( - frame, state, rsp_args, &this_args_cbk->stat, - &this_args_cbk->preparent, &this_args_cbk->postparent, - &this_args_cbk->preparent2, &this_args_cbk->postparent2); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FALLOCATE: - case GF_FOP_ZEROFILL: - case GF_FOP_DISCARD: - case GF_FOP_SETATTR: - case GF_FOP_FSETATTR: - case GF_FOP_FTRUNCATE: - case GF_FOP_TRUNCATE: - case GF_FOP_WRITE: - case GF_FOP_FSYNC: { - gfx_common_2iatt_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_truncate_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - if (!this_args_cbk->op_ret) { - server4_post_common_2iatt(rsp_args, &this_args_cbk->prestat, - &this_args_cbk->poststat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_OPEN: - case GF_FOP_OPENDIR: { - gfx_open_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_open_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - if (!this_args_cbk->op_ret) { - server4_post_open(frame, this, rsp_args, this_args_cbk->fd); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_READ: { - gfx_read_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_read_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - if (this_args_cbk->op_ret >= 0) { - server4_post_readv(rsp_args, &this_args_cbk->stat, - this_args_cbk->op_ret); - - if (!state->rsp_iobref) { - state->rsp_iobref = this_args_cbk->iobref; - state->rsp_count = 0; - } - iobref_merge(state->rsp_iobref, this_args_cbk->iobref); - memcpy(&state->rsp_vector[state->rsp_count], - this_args_cbk->vector, - (this_args_cbk->count * sizeof(state->rsp_vector[0]))); - state->rsp_count += this_args_cbk->count; - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_STATFS: { - gfx_statfs_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_statfs_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - if (!this_args_cbk->op_ret) { - server4_post_statfs(rsp_args, &this_args_cbk->statvfs); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FLUSH: - case GF_FOP_SETXATTR: - case GF_FOP_FSETXATTR: - case GF_FOP_REMOVEXATTR: - case GF_FOP_FREMOVEXATTR: - case GF_FOP_FSYNCDIR: - case GF_FOP_ACCESS: - case GF_FOP_INODELK: - case GF_FOP_FINODELK: - case GF_FOP_ENTRYLK: - case GF_FOP_FENTRYLK: { - gfx_common_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_flush_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_FGETXATTR: - case GF_FOP_GETXATTR: - case GF_FOP_XATTROP: - case GF_FOP_FXATTROP: { - gfx_common_dict_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_getxattr_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - if (-1 != this_args_cbk->op_ret) { - dict_to_xdr(this_args_cbk->xattr, &rsp_args->dict); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_CREATE: { - gfx_create_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_create_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - - if (!this_args_cbk->op_ret) { - rsp_args->op_ret = server4_post_create( - frame, rsp_args, state, this, this_args_cbk->fd, - this_args_cbk->inode, &this_args_cbk->stat, - &this_args_cbk->preparent, &this_args_cbk->postparent); - if (rsp_args->op_ret) { - rsp_args->op_errno = -rsp_args->op_ret; - rsp_args->op_ret = -1; - } - } - break; - } - case GF_FOP_LK: { - gfx_lk_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_lk_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - if (!this_args_cbk->op_ret) { - server4_post_lk(this, rsp_args, &this_args_cbk->lock); - } - - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_LOOKUP: { - gfx_common_2iatt_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_lookup_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - gfx_stat_from_iattx(&rsp_args->poststat, - &this_args_cbk->postparent); - - if (!this_args_cbk->op_ret) { - server4_post_lookup(rsp_args, frame, state, - this_args_cbk->inode, &this_args_cbk->stat); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_READDIR: { - gfx_readdir_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_readdir_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - - if (this_args_cbk->op_ret > 0) { - ret = server4_post_readdir(rsp_args, &this_args_cbk->entries); - if (ret < 0) { - rsp_args->op_ret = ret; - rsp_args->op_errno = ENOMEM; - } - } - break; - } - case GF_FOP_RCHECKSUM: { - gfx_rchecksum_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_rchecksum_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - if (!this_args_cbk->op_ret) { - server4_post_rchecksum(rsp_args, this_args_cbk->weak_checksum, - this_args_cbk->strong_checksum); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_READDIRP: { - gfx_readdirp_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_readdirp_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - if (this_args_cbk->op_ret > 0) { - ret = server4_post_readdirp(rsp_args, &this_args_cbk->entries); - if (ret < 0) { - rsp_args->op_ret = ret; - rsp_args->op_errno = ENOMEM; - goto out; - } - gf_link_inodes_from_dirent(this, state->fd->inode, - &this_args_cbk->entries); - } - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_SEEK: { - gfx_seek_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_seek_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - case GF_FOP_LEASE: { - gfx_lease_rsp *rsp_args = NULL; - - rsp_args = &this_rsp->compound_rsp_v2_u.compound_lease_rsp; - - dict_to_xdr(this_args_cbk->xdata, &rsp_args->xdata); - - if (!this_args_cbk->op_ret) { - server4_post_lease(rsp_args, &this_args_cbk->lease); - } - - rsp_args->op_ret = this_args_cbk->op_ret; - rsp_args->op_errno = gf_errno_to_error(this_args_cbk->op_errno); - break; - } - default: - return ENOTSUP; - } - op_errno = 0; -out: - return op_errno; -} -/* This works only when the compound fop acts on one loc/inode/gfid. - * If compound fops on more than one inode is required, multiple - * resolve and resumes will have to be done. This will have to change. - * Right now, multiple unlinks, rmdirs etc is are not supported. - * This can be added for future enhancements. - */ -int -server_get_compound_resolve_v2(server_state_t *state, gfx_compound_req *req) -{ - int i = 0; - compound_req_v2 *array = NULL; - - array = &req->compound_req_array.compound_req_array_val[i]; - - switch (array->fop_enum) { - case GF_FOP_STAT: { - gfx_stat_req this_req = array[i] - .compound_req_v2_u.compound_stat_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_READLINK: { - gfx_readlink_req this_req = - array[i].compound_req_v2_u.compound_readlink_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_MKNOD: { - gfx_mknod_req this_req = array[i] - .compound_req_v2_u.compound_mknod_req; - - state->resolve.type = RESOLVE_NOT; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_MKDIR: { - gfx_mkdir_req this_req = array[i] - .compound_req_v2_u.compound_mkdir_req; - - state->resolve.type = RESOLVE_NOT; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_UNLINK: { - gfx_unlink_req this_req = - array[i].compound_req_v2_u.compound_unlink_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_RMDIR: { - gfx_rmdir_req this_req = array[i] - .compound_req_v2_u.compound_rmdir_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_SYMLINK: { - gfx_symlink_req this_req = - array[i].compound_req_v2_u.compound_symlink_req; - - state->resolve.type = RESOLVE_NOT; - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_RENAME: { - gfx_rename_req this_req = - array[i].compound_req_v2_u.compound_rename_req; - - state->resolve.type = RESOLVE_MUST; - state->resolve.bname = gf_strdup(this_req.oldbname); - memcpy(state->resolve.pargfid, this_req.oldgfid, 16); - - state->resolve2.type = RESOLVE_MAY; - state->resolve2.bname = gf_strdup(this_req.newbname); - memcpy(state->resolve2.pargfid, this_req.newgfid, 16); - break; - } - case GF_FOP_LINK: { - gfx_link_req this_req = array[i] - .compound_req_v2_u.compound_link_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.oldgfid, 16); - - state->resolve2.type = RESOLVE_NOT; - state->resolve2.bname = gf_strdup(this_req.newbname); - memcpy(state->resolve2.pargfid, this_req.newgfid, 16); - break; - } - case GF_FOP_TRUNCATE: { - gfx_truncate_req this_req = - array[i].compound_req_v2_u.compound_truncate_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_OPEN: { - gfx_open_req this_req = array[i] - .compound_req_v2_u.compound_open_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_READ: { - gfx_read_req this_req = array[i] - .compound_req_v2_u.compound_read_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_WRITE: { - gfx_write_req this_req = array[i] - .compound_req_v2_u.compound_write_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_STATFS: { - gfx_statfs_req this_req = - array[i].compound_req_v2_u.compound_statfs_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FLUSH: { - gfx_flush_req this_req = array[i] - .compound_req_v2_u.compound_flush_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FSYNC: { - gfx_fsync_req this_req = array[i] - .compound_req_v2_u.compound_fsync_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_SETXATTR: { - gfx_setxattr_req this_req = - array[i].compound_req_v2_u.compound_setxattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_GETXATTR: { - gfx_getxattr_req this_req = - array[i].compound_req_v2_u.compound_getxattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_REMOVEXATTR: { - gfx_removexattr_req this_req = - array[i].compound_req_v2_u.compound_removexattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_OPENDIR: { - gfx_opendir_req this_req = - array[i].compound_req_v2_u.compound_opendir_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FSYNCDIR: { - gfx_fsyncdir_req this_req = - array[i].compound_req_v2_u.compound_fsyncdir_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_ACCESS: { - gfx_access_req this_req = - array[i].compound_req_v2_u.compound_access_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_CREATE: { - gfx_create_req this_req = - array[i].compound_req_v2_u.compound_create_req; - - state->flags = gf_flags_to_flags(this_req.flags); - if (state->flags & O_EXCL) { - state->resolve.type = RESOLVE_NOT; - } else { - state->resolve.type = RESOLVE_DONTCARE; - } - - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - break; - } - case GF_FOP_FTRUNCATE: { - gfx_ftruncate_req this_req = - array[i].compound_req_v2_u.compound_ftruncate_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FSTAT: { - gfx_fstat_req this_req = array[i] - .compound_req_v2_u.compound_fstat_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_LK: { - gfx_lk_req this_req = array[i].compound_req_v2_u.compound_lk_req; - - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_LOOKUP: { - gfx_lookup_req this_req = - array[i].compound_req_v2_u.compound_lookup_req; - state->resolve.type = RESOLVE_DONTCARE; - - if (this_req.bname && strcmp(this_req.bname, "")) { - memcpy(state->resolve.pargfid, this_req.pargfid, 16); - state->resolve.bname = gf_strdup(this_req.bname); - } else { - memcpy(state->resolve.gfid, this_req.gfid, 16); - } - break; - } - case GF_FOP_READDIR: { - gfx_readdir_req this_req = - array[i].compound_req_v2_u.compound_readdir_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_INODELK: { - gfx_inodelk_req this_req = - array[i].compound_req_v2_u.compound_inodelk_req; - - state->resolve.type = RESOLVE_EXACT; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FINODELK: { - gfx_finodelk_req this_req = - array[i].compound_req_v2_u.compound_finodelk_req; - - state->resolve.type = RESOLVE_EXACT; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_ENTRYLK: { - gfx_entrylk_req this_req = - array[i].compound_req_v2_u.compound_entrylk_req; - - state->resolve.type = RESOLVE_EXACT; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FENTRYLK: { - gfx_fentrylk_req this_req = - array[i].compound_req_v2_u.compound_fentrylk_req; - - state->resolve.type = RESOLVE_EXACT; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_XATTROP: { - gfx_xattrop_req this_req = - array[i].compound_req_v2_u.compound_xattrop_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FXATTROP: { - gfx_fxattrop_req this_req = - array[i].compound_req_v2_u.compound_fxattrop_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FGETXATTR: { - gfx_fgetxattr_req this_req = - array[i].compound_req_v2_u.compound_fgetxattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FSETXATTR: { - gfx_fsetxattr_req this_req = - array[i].compound_req_v2_u.compound_fsetxattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_RCHECKSUM: { - gfx_rchecksum_req this_req = - array[i].compound_req_v2_u.compound_rchecksum_req; - - state->resolve.type = RESOLVE_MAY; - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_SETATTR: { - gfx_setattr_req this_req = - array[i].compound_req_v2_u.compound_setattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - case GF_FOP_FSETATTR: { - gfx_fsetattr_req this_req = - array[i].compound_req_v2_u.compound_fsetattr_req; - - state->resolve.type = RESOLVE_MUST; - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_READDIRP: { - gfx_readdirp_req this_req = - array[i].compound_req_v2_u.compound_readdirp_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FREMOVEXATTR: { - gfx_fremovexattr_req this_req = - array[i].compound_req_v2_u.compound_fremovexattr_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_FALLOCATE: { - gfx_fallocate_req this_req = - array[i].compound_req_v2_u.compound_fallocate_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_DISCARD: { - gfx_discard_req this_req = - array[i].compound_req_v2_u.compound_discard_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_ZEROFILL: { - gfx_zerofill_req this_req = - array[i].compound_req_v2_u.compound_zerofill_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_SEEK: { - gfx_seek_req this_req = array[i] - .compound_req_v2_u.compound_seek_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - state->resolve.fd_no = this_req.fd; - break; - } - case GF_FOP_LEASE: { - gfx_lease_req this_req = array[i] - .compound_req_v2_u.compound_lease_req; - - state->resolve.type = RESOLVE_MUST; - memcpy(state->resolve.gfid, this_req.gfid, 16); - break; - } - default: - return ENOTSUP; - } - return 0; -} - -void -server_compound_rsp_cleanup_v2(gfx_compound_rsp *rsp, compound_args_cbk_t *args) -{ - int i, len = 0; - compound_rsp_v2 *this_rsp = NULL; - - if (!rsp->compound_rsp_array.compound_rsp_array_val) - return; - - len = rsp->compound_rsp_array.compound_rsp_array_len; - - for (i = 0; i < len; i++) { - this_rsp = &rsp->compound_rsp_array.compound_rsp_array_val[i]; - switch (args->enum_list[i]) { - case GF_FOP_STAT: - SERVER4_FOP_RSP_CLEANUP(rsp, stat, i, common_iatt); - break; - case GF_FOP_MKNOD: - SERVER4_FOP_RSP_CLEANUP(rsp, mknod, i, common_3iatt); - break; - case GF_FOP_MKDIR: - SERVER4_FOP_RSP_CLEANUP(rsp, mkdir, i, common_3iatt); - break; - case GF_FOP_UNLINK: - SERVER4_FOP_RSP_CLEANUP(rsp, unlink, i, common_2iatt); - break; - case GF_FOP_RMDIR: - SERVER4_FOP_RSP_CLEANUP(rsp, rmdir, i, common_2iatt); - break; - case GF_FOP_SYMLINK: - SERVER4_FOP_RSP_CLEANUP(rsp, symlink, i, common_3iatt); - break; - case GF_FOP_RENAME: - SERVER4_FOP_RSP_CLEANUP(rsp, rename, i, rename); - break; - case GF_FOP_LINK: - SERVER4_FOP_RSP_CLEANUP(rsp, link, i, common_3iatt); - break; - case GF_FOP_TRUNCATE: - SERVER4_FOP_RSP_CLEANUP(rsp, truncate, i, common_2iatt); - break; - case GF_FOP_OPEN: - SERVER4_FOP_RSP_CLEANUP(rsp, open, i, open); - break; - case GF_FOP_READ: - SERVER4_FOP_RSP_CLEANUP(rsp, read, i, read); - break; - case GF_FOP_WRITE: - SERVER4_FOP_RSP_CLEANUP(rsp, write, i, common_2iatt); - break; - case GF_FOP_STATFS: - SERVER4_FOP_RSP_CLEANUP(rsp, statfs, i, statfs); - break; - case GF_FOP_FSYNC: - SERVER4_FOP_RSP_CLEANUP(rsp, fsync, i, common_2iatt); - break; - case GF_FOP_OPENDIR: - SERVER4_FOP_RSP_CLEANUP(rsp, opendir, i, open); - break; - case GF_FOP_CREATE: - SERVER4_FOP_RSP_CLEANUP(rsp, create, i, create); - break; - case GF_FOP_FTRUNCATE: - SERVER4_FOP_RSP_CLEANUP(rsp, ftruncate, i, common_2iatt); - break; - case GF_FOP_FSTAT: - SERVER4_FOP_RSP_CLEANUP(rsp, fstat, i, common_iatt); - break; - case GF_FOP_LK: - SERVER4_FOP_RSP_CLEANUP(rsp, lk, i, lk); - break; - case GF_FOP_LOOKUP: - SERVER4_FOP_RSP_CLEANUP(rsp, lookup, i, common_2iatt); - break; - case GF_FOP_SETATTR: - SERVER4_FOP_RSP_CLEANUP(rsp, setattr, i, common_2iatt); - break; - case GF_FOP_FSETATTR: - SERVER4_FOP_RSP_CLEANUP(rsp, fsetattr, i, common_2iatt); - break; - case GF_FOP_FALLOCATE: - SERVER4_FOP_RSP_CLEANUP(rsp, fallocate, i, common_2iatt); - break; - case GF_FOP_DISCARD: - SERVER4_FOP_RSP_CLEANUP(rsp, discard, i, common_2iatt); - break; - case GF_FOP_ZEROFILL: - SERVER4_FOP_RSP_CLEANUP(rsp, zerofill, i, common_2iatt); - break; - case GF_FOP_SEEK: - SERVER4_FOP_RSP_CLEANUP(rsp, seek, i, seek); - break; - case GF_FOP_LEASE: - SERVER4_FOP_RSP_CLEANUP(rsp, lease, i, lease); - break; - case GF_FOP_READLINK: - SERVER4_FOP_RSP_CLEANUP(rsp, readlink, i, readlink); - break; - case GF_FOP_RCHECKSUM: - SERVER4_FOP_RSP_CLEANUP(rsp, rchecksum, i, rchecksum); - break; - /* fops that use gfx_common_rsp */ - case GF_FOP_IPC: - SERVER4_COMMON_RSP_CLEANUP(rsp, ipc, i); - break; - case GF_FOP_FLUSH: - SERVER4_COMMON_RSP_CLEANUP(rsp, flush, i); - break; - case GF_FOP_SETXATTR: - SERVER4_COMMON_RSP_CLEANUP(rsp, setxattr, i); - break; - case GF_FOP_REMOVEXATTR: - SERVER4_COMMON_RSP_CLEANUP(rsp, removexattr, i); - break; - case GF_FOP_FSETXATTR: - SERVER4_COMMON_RSP_CLEANUP(rsp, fsetxattr, i); - break; - case GF_FOP_FREMOVEXATTR: - SERVER4_COMMON_RSP_CLEANUP(rsp, fremovexattr, i); - break; - case GF_FOP_FSYNCDIR: - SERVER4_COMMON_RSP_CLEANUP(rsp, fsyncdir, i); - break; - case GF_FOP_ACCESS: - SERVER4_COMMON_RSP_CLEANUP(rsp, access, i); - break; - case GF_FOP_INODELK: - SERVER4_COMMON_RSP_CLEANUP(rsp, inodelk, i); - break; - case GF_FOP_FINODELK: - SERVER4_COMMON_RSP_CLEANUP(rsp, finodelk, i); - break; - case GF_FOP_ENTRYLK: - SERVER4_COMMON_RSP_CLEANUP(rsp, entrylk, i); - break; - case GF_FOP_FENTRYLK: - SERVER4_COMMON_RSP_CLEANUP(rsp, fentrylk, i); - break; - /* fops that need extra cleanup */ - case GF_FOP_XATTROP: { - gfx_common_dict_rsp *tmp_rsp = &CPD4_RSP_FIELD(this_rsp, - xattrop); - SERVER4_FOP_RSP_CLEANUP(rsp, xattrop, i, common_dict); - GF_FREE(tmp_rsp->dict.pairs.pairs_val); - break; - } - case GF_FOP_FXATTROP: { - gfx_common_dict_rsp *tmp_rsp = &CPD4_RSP_FIELD(this_rsp, - fxattrop); - SERVER4_FOP_RSP_CLEANUP(rsp, fxattrop, i, common_dict); - GF_FREE(tmp_rsp->dict.pairs.pairs_val); - break; - } - case GF_FOP_READDIR: { - gfx_readdir_rsp *tmp_rsp = &CPD4_RSP_FIELD(this_rsp, readdir); - SERVER4_FOP_RSP_CLEANUP(rsp, readdir, i, readdir); - readdir_rsp_cleanup_v2(tmp_rsp); - break; - } - case GF_FOP_READDIRP: { - gfx_readdirp_rsp *tmp_rsp = &CPD4_RSP_FIELD(this_rsp, readdirp); - SERVER4_FOP_RSP_CLEANUP(rsp, readdirp, i, readdirp); - readdirp_rsp_cleanup_v2(tmp_rsp); - break; - } - case GF_FOP_GETXATTR: { - gfx_common_dict_rsp *tmp_rsp = &CPD4_RSP_FIELD(this_rsp, - getxattr); - SERVER4_FOP_RSP_CLEANUP(rsp, getxattr, i, common_dict); - GF_FREE(tmp_rsp->dict.pairs.pairs_val); - break; - } - case GF_FOP_FGETXATTR: { - gfx_common_dict_rsp *tmp_rsp = &CPD4_RSP_FIELD(this_rsp, - fgetxattr); - SERVER4_FOP_RSP_CLEANUP(rsp, fgetxattr, i, common_dict); - GF_FREE(tmp_rsp->dict.pairs.pairs_val); - break; - } - default: - break; - } - } - GF_FREE(rsp->compound_rsp_array.compound_rsp_array_val); - return; -} - -void -server_compound_req_cleanup_v2(gfx_compound_req *req, int len) -{ - int i = 0; - compound_req_v2 *curr_req = NULL; - - if (!req->compound_req_array.compound_req_array_val) - return; - - for (i = 0; i < len; i++) { - curr_req = &req->compound_req_array.compound_req_array_val[i]; - - switch (curr_req->fop_enum) { - case GF_FOP_MKDIR: { - gfx_mkdir_req *args = &CPD4_REQ_FIELD(curr_req, mkdir); - - free(args->bname); - break; - } - case GF_FOP_UNLINK: { - gfx_unlink_req *args = &CPD4_REQ_FIELD(curr_req, unlink); - free(args->bname); - break; - } - case GF_FOP_RMDIR: { - gfx_rmdir_req *args = &CPD4_REQ_FIELD(curr_req, rmdir); - free(args->bname); - break; - } - case GF_FOP_SYMLINK: { - gfx_symlink_req *args = &CPD4_REQ_FIELD(curr_req, symlink); - free(args->bname); - free(args->linkname); - break; - } - case GF_FOP_RENAME: { - gfx_rename_req *args = &CPD4_REQ_FIELD(curr_req, rename); - free(args->oldbname); - free(args->newbname); - break; - } - case GF_FOP_LINK: { - gfx_link_req *args = &CPD4_REQ_FIELD(curr_req, link); - free(args->newbname); - break; - } - case GF_FOP_GETXATTR: { - gfx_getxattr_req *args = &CPD4_REQ_FIELD(curr_req, getxattr); - - free(args->name); - break; - } - case GF_FOP_REMOVEXATTR: { - gfx_removexattr_req *args = &CPD4_REQ_FIELD(curr_req, - removexattr); - - free(args->name); - break; - } - case GF_FOP_CREATE: { - gfx_create_req *args = &CPD4_REQ_FIELD(curr_req, create); - - free(args->bname); - break; - } - case GF_FOP_LK: { - gfx_lk_req *args = &CPD4_REQ_FIELD(curr_req, lk); - free(args->flock.lk_owner.lk_owner_val); - break; - } - case GF_FOP_LOOKUP: { - gfx_lookup_req *args = &CPD4_REQ_FIELD(curr_req, lookup); - free(args->bname); - break; - } - case GF_FOP_INODELK: { - gfx_inodelk_req *args = &CPD4_REQ_FIELD(curr_req, inodelk); - - free(args->volume); - free(args->flock.lk_owner.lk_owner_val); - break; - } - case GF_FOP_FINODELK: { - gfx_finodelk_req *args = &CPD4_REQ_FIELD(curr_req, finodelk); - - free(args->volume); - free(args->flock.lk_owner.lk_owner_val); - break; - } - case GF_FOP_ENTRYLK: { - gfx_entrylk_req *args = &CPD4_REQ_FIELD(curr_req, entrylk); - - free(args->volume); - free(args->name); - break; - } - case GF_FOP_FENTRYLK: { - gfx_fentrylk_req *args = &CPD4_REQ_FIELD(curr_req, fentrylk); - - free(args->volume); - free(args->name); - break; - } - case GF_FOP_FGETXATTR: { - gfx_fgetxattr_req *args = &CPD4_REQ_FIELD(curr_req, fgetxattr); - - free(args->name); - break; - } - case GF_FOP_FREMOVEXATTR: { - gfx_fremovexattr_req *args = &CPD4_REQ_FIELD(curr_req, - fremovexattr); - free(args->name); - break; - } - default: - break; - } - } - - return; -} |
