diff options
Diffstat (limited to 'xlators/protocol/server/src/server-helpers.c')
-rw-r--r-- | xlators/protocol/server/src/server-helpers.c | 2439 |
1 files changed, 2439 insertions, 0 deletions
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index dc127a6cdcd..09183e8a1dd 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -13,6 +13,9 @@ #include "gidcache.h" #include "server-messages.h" #include "syscall.h" +#include "defaults.h" +#include "default-args.h" +#include "server-common.h" #include <fnmatch.h> #include <pwd.h> @@ -1345,3 +1348,2439 @@ unserialize_req_locklist (gfs3_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; + 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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_stat_store (this_args, &state->loc, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_readlink_store (this_args, &state->loc, + args->size, this_args->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, + this_args->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, + this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_mkdir_store (this_args, &state->loc, args->mode, + args->umask, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_unlink_store (this_args, &state->loc, + args->xflags, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_rmdir_store (this_args, &state->loc, + args->xflags, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_symlink_store (this_args, args->linkname, + &state->loc, + args->umask, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + + args_rename_store (this_args, &state->loc, + &state->loc2, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_link_store (this_args, &state->loc, + &state->loc2, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_truncate_store (this_args, &state->loc, + args->offset, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_open_store (this_args, &state->loc, + args->flags, state->fd, this_args->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, + this_args->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, + this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_writev_store (this_args, state->fd, + req_iovec, + args->size, args->offset, + args->flag, + this_args->iobref, this_args->xdata); + state->write_length += args->size; + 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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_statfs_store (this_args, &state->loc, + this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_flush_store (this_args, state->fd, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_fsync_store (this_args, state->fd, + args->data, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + GF_PROTOCOL_DICT_UNSERIALIZE (frame->root->client->bound_xl, + this_args->xattr, + args->dict.dict_val, + args->dict.dict_len, ret, + op_errno, out); + args_setxattr_store (this_args, &state->loc, + this_args->xattr, args->flags, + this_args->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, + this_args->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, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_removexattr_store (this_args, &state->loc, + args->name, + this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_opendir_store (this_args, &state->loc, + state->fd, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_fsyncdir_store (this_args, state->fd, + args->data, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_access_store (this_args, &state->loc, + args->mask, this_args->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, + this_args->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, + this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_ftruncate_store (this_args, state->fd, + args->offset, + this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_fstat_store (this_args, state->fd, this_args->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, + this_args->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, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_lookup_store (this_args, &state->loc, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_readdir_store (this_args, state->fd, args->size, + args->offset, this_args->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, + this_args->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, this_args->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, + this_args->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, this_args->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, + this_args->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, + this_args->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, + this_args->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, + this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + + GF_PROTOCOL_DICT_UNSERIALIZE (frame->root->client->bound_xl, + this_args->xattr, + (args->dict.dict_val), + (args->dict.dict_len), ret, + op_errno, out); + args_xattrop_store (this_args, &state->loc, args->flags, + this_args->xattr, this_args->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, + this_args->xattr, + (args->dict.dict_val), + (args->dict.dict_len), ret, + op_errno, out); + + GF_PROTOCOL_DICT_UNSERIALIZE (frame->root->client->bound_xl, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + + args_fxattrop_store (this_args, state->fd, args->flags, + this_args->xattr, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + + args_fgetxattr_store (this_args, state->fd, + args->name, this_args->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, + this_args->xattr, + (args->dict.dict_val), + (args->dict.dict_len), ret, + op_errno, out); + + GF_PROTOCOL_DICT_UNSERIALIZE (frame->root->client->bound_xl, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + + args_fsetxattr_store (this_args, state->fd, this_args->xattr, + args->flags, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + + args_rchecksum_store (this_args, state->fd, args->offset, + args->len, this_args->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, + this_args->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, this_args->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, + this_args->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, this_args->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, + this_args->xattr, + (args->dict.dict_val), + (args->dict.dict_len), ret, + op_errno, out); + + args_readdirp_store (this_args, state->fd, args->size, + args->offset, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + + args_fremovexattr_store (this_args, state->fd, args->name, + this_args->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, + this_args->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, + this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + + args_discard_store (this_args, state->fd, args->offset, + args->size, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_zerofill_store (this_args, state->fd, args->offset, + args->size, this_args->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, + this_args->xdata, + args->xdata.xdata_val, + args->xdata.xdata_len, ret, + op_errno, out); + args_seek_store (this_args, state->fd, args->offset, + args->what, this_args->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, + this_args->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, + this_args->xdata); + break; + } + default: + return ENOTSUP; + } +out: + 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 = ENOMEM; + int op_ret = -1; + 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); + rsp->compound_rsp_array.compound_rsp_array_val = GF_CALLOC + (args_cbk->fop_length, + sizeof (compound_rsp), + gf_server_mt_compound_rsp_t); + + rsp->compound_rsp_array.compound_rsp_array_len = args_cbk->fop_length; + + this_rsp = &rsp->compound_rsp_array.compound_rsp_array_val[index]; + + this_args_cbk = &args_cbk->rsp_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 (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); + 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; + + 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; + + 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; + + 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 (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; + + 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; + + 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; + } +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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = {0,}; + + 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 = { {0,} }; + + 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 = {0,}; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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 = { {0,} }; + + 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; +} |