diff options
Diffstat (limited to 'xlators/protocol/server/src/server-helpers.c')
-rw-r--r-- | xlators/protocol/server/src/server-helpers.c | 204 |
1 files changed, 141 insertions, 63 deletions
diff --git a/xlators/protocol/server/src/server-helpers.c b/xlators/protocol/server/src/server-helpers.c index 0ae8ecec932..78d850fc75d 100644 --- a/xlators/protocol/server/src/server-helpers.c +++ b/xlators/protocol/server/src/server-helpers.c @@ -32,8 +32,8 @@ server_decode_groups (call_frame_t *frame, rpcsvc_request_t *req) { int i = 0; - if ((!frame) || (!req)) - return 0; + GF_VALIDATE_OR_GOTO ("server", frame, out); + GF_VALIDATE_OR_GOTO ("server", req, out); frame->root->ngrps = req->auxgidcount; if (frame->root->ngrps == 0) @@ -44,7 +44,7 @@ server_decode_groups (call_frame_t *frame, rpcsvc_request_t *req) for (; i < frame->root->ngrps; ++i) frame->root->groups[i] = req->auxgids[i]; - +out: return 0; } @@ -155,6 +155,11 @@ gf_add_locker (struct _lock_table *table, const char *volume, int32_t ret = -1; struct _locker *new = NULL; + GF_VALIDATE_OR_GOTO ("server", table, out); + GF_VALIDATE_OR_GOTO ("server", volume, out); + GF_VALIDATE_OR_GOTO ("server", loc, out); + GF_VALIDATE_OR_GOTO ("server", fd, out); + new = GF_CALLOC (1, sizeof (struct _locker), gf_server_mt_locker_t); if (new == NULL) { gf_log ("server", GF_LOG_ERROR, @@ -193,10 +198,15 @@ gf_del_locker (struct _lock_table *table, const char *volume, { struct _locker *locker = NULL; struct _locker *tmp = NULL; - int32_t ret = 0; + int32_t ret = -1; struct list_head *head = NULL; struct list_head del; + GF_VALIDATE_OR_GOTO ("server", table, out); + GF_VALIDATE_OR_GOTO ("server", volume, out); + GF_VALIDATE_OR_GOTO ("server", loc, out); + GF_VALIDATE_OR_GOTO ("server", fd, out); + INIT_LIST_HEAD (&del); LOCK (&table->lock); @@ -237,6 +247,8 @@ gf_del_locker (struct _lock_table *table, const char *volume, GF_FREE (locker); } + ret = 0; +out: return ret; } @@ -262,14 +274,22 @@ static int server_nop_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno) { + int ret = -1; server_state_t *state = NULL; + GF_VALIDATE_OR_GOTO ("server", frame, out); + GF_VALIDATE_OR_GOTO ("server", cookie, out); + GF_VALIDATE_OR_GOTO ("server", this, out); + state = CALL_STATE(frame); if (state) free_state (state); STACK_DESTROY (frame->root); - return 0; + + ret = 0; +out: + return ret; } int @@ -284,6 +304,11 @@ do_lock_table_cleanup (xlator_t *this, server_connection_t *conn, int ret = -1; char *path = NULL; + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", conn, out); + GF_VALIDATE_OR_GOTO ("server", frame, out); + GF_VALIDATE_OR_GOTO ("server", ltable, out); + bound_xl = conn->bound_xl; INIT_LIST_HEAD (&inodelk_lockers); INIT_LIST_HEAD (&entrylk_lockers); @@ -311,8 +336,8 @@ do_lock_table_cleanup (xlator_t *this, server_connection_t *conn, goto out; } /* - lock owner = 0 is a special case that tells posix-locks - to release all locks from this transport + lock owner = 0 is a special case that tells posix-locks + to release all locks from this transport */ tmp_frame->root->pid = 0; tmp_frame->root->lk_owner = 0; @@ -416,15 +441,23 @@ server_connection_cleanup_flush_cbk (call_frame_t *frame, void *cookie, xlator_t *this, int32_t op_ret, int32_t op_errno) { + int32_t ret = -1; fd_t *fd = NULL; + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", cookie, out); + GF_VALIDATE_OR_GOTO ("server", frame, out); + fd = frame->local; fd_unref (fd); frame->local = NULL; STACK_DESTROY (frame->root); - return 0; + + ret = 0; +out: + return ret; } @@ -438,6 +471,11 @@ do_fd_cleanup (xlator_t *this, server_connection_t *conn, call_frame_t *frame, xlator_t *bound_xl = NULL; char *path = NULL; + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", conn, out); + GF_VALIDATE_OR_GOTO ("server", frame, out); + GF_VALIDATE_OR_GOTO ("server", fdentries, out); + bound_xl = conn->bound_xl; for (i = 0;i < fd_count; i++) { fd = fdentries[i].fd; @@ -493,6 +531,11 @@ do_connection_cleanup (xlator_t *this, server_connection_t *conn, call_frame_t *frame = NULL; server_state_t *state = NULL; + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", conn, out); + GF_VALIDATE_OR_GOTO ("server", fdentries, out); + GF_VALIDATE_OR_GOTO ("server", ltable, out); + frame = create_frame (this, this->ctx->pool); if (frame == NULL) { gf_log (this->name, GF_LOG_ERROR, "out of memory"); @@ -529,9 +572,8 @@ server_connection_cleanup (xlator_t *this, server_connection_t *conn) uint32_t fd_count = 0; int ret = 0; - if (conn == NULL) { - goto out; - } + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", conn, out); pthread_mutex_lock (&conn->lock); { @@ -577,10 +619,8 @@ server_connection_destroy (xlator_t *this, server_connection_t *conn) uint32_t fd_count = 0; char *path = NULL; - if (conn == NULL) { - ret = 0; - goto out; - } + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", conn, out); bound_xl = (xlator_t *) (conn->bound_xl); @@ -621,8 +661,8 @@ server_connection_destroy (xlator_t *this, server_connection_t *conn) tmp, &inodelk_lockers, lockers) { tmp_frame = copy_frame (frame); /* - lock_owner = 0 is a special case that tells posix-locks - to release all locks from this transport + lock_owner = 0 is a special case that tells posix-locks + to release all locks from this transport */ tmp_frame->root->lk_owner = 0; tmp_frame->root->trans = conn; @@ -766,9 +806,12 @@ out: server_connection_t * server_connection_get (xlator_t *this, const char *id) { - server_connection_t *conn = NULL; - server_connection_t *trav = NULL; - server_conf_t *conf = NULL; + server_connection_t *conn = NULL; + server_connection_t *trav = NULL; + server_conf_t *conf = NULL; + + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", id, out); conf = this->private; @@ -793,15 +836,15 @@ server_connection_get (xlator_t *this, const char *id) conn->this = this; pthread_mutex_init (&conn->lock, NULL); - list_add (&conn->list, &conf->conns); - } + list_add (&conn->list, &conf->conns); + } conn->ref++; conn->active_transports++; - } + } unlock: - pthread_mutex_unlock (&conf->mutex); - + pthread_mutex_unlock (&conf->mutex); +out: return conn; } @@ -812,15 +855,11 @@ server_connection_put (xlator_t *this, server_connection_t *conn) server_conf_t *conf = NULL; server_connection_t *todel = NULL; - if (conn == NULL) { - goto out; - } + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", conn, out); conf = this->private; - - if (conf == NULL) { - goto out; - } + GF_VALIDATE_OR_GOTO ("server", conf, out); pthread_mutex_lock (&conf->mutex); { @@ -848,20 +887,19 @@ server_alloc_frame (rpcsvc_request_t *req) server_state_t *state = NULL; server_connection_t *conn = NULL; - GF_VALIDATE_OR_GOTO("server", req, out); - GF_VALIDATE_OR_GOTO("server", req->trans, out); - GF_VALIDATE_OR_GOTO("server", req->svc, out); - GF_VALIDATE_OR_GOTO("server", req->svc->ctx, out); + GF_VALIDATE_OR_GOTO ("server", req, out); + GF_VALIDATE_OR_GOTO ("server", req->trans, out); + GF_VALIDATE_OR_GOTO ("server", req->svc, out); + GF_VALIDATE_OR_GOTO ("server", req->svc->ctx, out); conn = (server_connection_t *)req->trans->xl_private; - if (!conn) - goto out; + GF_VALIDATE_OR_GOTO ("server", conn, out); frame = create_frame (conn->this, req->svc->ctx->pool); - GF_VALIDATE_OR_GOTO("server", frame, out); + GF_VALIDATE_OR_GOTO ("server", frame, out); state = GF_CALLOC (1, sizeof (*state), gf_server_mt_state_t); - GF_VALIDATE_OR_GOTO("server", state, out); + GF_VALIDATE_OR_GOTO ("server", state, out); if (conn->bound_xl) state->itable = conn->bound_xl->itable; @@ -887,9 +925,10 @@ get_frame_from_request (rpcsvc_request_t *req) { call_frame_t *frame = NULL; + GF_VALIDATE_OR_GOTO ("server", req, out); + frame = server_alloc_frame (req); - if (!frame) - goto out; + GF_VALIDATE_OR_GOTO ("server", frame, out); frame->root->op = req->procnum; frame->root->type = req->type; @@ -917,6 +956,9 @@ server_build_config (xlator_t *this, server_conf_t *conf) int ret = -1; struct stat buf = {0,}; + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", conf, out); + ret = dict_get_int32 (this->options, "inode-lru-limit", &conf->inode_lru_limit); if (ret < 0) { @@ -935,14 +977,14 @@ server_build_config (xlator_t *this, server_conf_t *conf) } data = dict_get (this->options, "trace"); - if (data) { + if (data) { ret = gf_string2boolean (data->data, &conf->trace); if (ret != 0) { - gf_log (this->name, GF_LOG_WARNING, - "'trace' takes on only boolean values. " + gf_log (this->name, GF_LOG_WARNING, + "'trace' takes on only boolean values. " "Neglecting option"); - } - } + } + } /* TODO: build_rpc_config (); */ ret = dict_get_int32 (this->options, "limits.transaction-size", @@ -984,7 +1026,12 @@ out: server_connection_t * get_server_conn_state (xlator_t *this, rpc_transport_t *xprt) { + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", xprt, out); + return (server_connection_t *)xprt->xl_private; +out: + return NULL; } server_connection_t * @@ -993,6 +1040,9 @@ create_server_conn_state (xlator_t *this, rpc_transport_t *xprt) server_connection_t *conn = NULL; int ret = -1; + GF_VALIDATE_OR_GOTO ("server", this, out); + GF_VALIDATE_OR_GOTO ("server", xprt, out); + conn = GF_CALLOC (1, sizeof (*conn), gf_server_mt_conn_t); if (!conn) goto out; @@ -1022,9 +1072,7 @@ out: void destroy_server_conn_state (server_connection_t *conn) { - if (!conn) { - return; - } + GF_VALIDATE_OR_GOTO ("server", conn, out); if (conn->ltable) { /* TODO */ @@ -1038,7 +1086,7 @@ destroy_server_conn_state (server_connection_t *conn) pthread_mutex_destroy (&conn->lock); GF_FREE (conn); - +out: return; } @@ -1048,6 +1096,9 @@ print_caller (char *str, int size, call_frame_t *frame) { server_state_t *state = NULL; + GF_VALIDATE_OR_GOTO ("server", str, out); + GF_VALIDATE_OR_GOTO ("server", frame, out); + state = CALL_STATE (frame); snprintf (str, size, @@ -1055,6 +1106,7 @@ print_caller (char *str, int size, call_frame_t *frame) frame->root->unique, state->xprt->peerinfo.identifier); +out: return; } @@ -1064,6 +1116,8 @@ server_print_resolve (char *str, int size, server_resolve_t *resolve) { int filled = 0; + GF_VALIDATE_OR_GOTO ("server", str, out); + if (!resolve) { snprintf (str, size, "<nul>"); return; @@ -1091,6 +1145,8 @@ server_print_resolve (char *str, int size, server_resolve_t *resolve) "path=%s", resolve->path); snprintf (str + filled, size - filled, "}"); +out: + return; } @@ -1099,6 +1155,8 @@ server_print_loc (char *str, int size, loc_t *loc) { int filled = 0; + GF_VALIDATE_OR_GOTO ("server", str, out); + if (!loc) { snprintf (str, size, "<nul>"); return; @@ -1118,6 +1176,8 @@ server_print_loc (char *str, int size, loc_t *loc) "parent=%p", loc->parent); snprintf (str + filled, size - filled, "}"); +out: + return; } @@ -1126,6 +1186,8 @@ server_print_params (char *str, int size, server_state_t *state) { int filled = 0; + GF_VALIDATE_OR_GOTO ("server", str, out); + filled += snprintf (str + filled, size - filled, " Params={"); @@ -1165,6 +1227,8 @@ server_print_params (char *str, int size, server_state_t *state) snprintf (str + filled, size - filled, "bound_xl=%s}", state->conn->bound_xl->name); +out: + return; } int @@ -1201,11 +1265,13 @@ server_print_reply (call_frame_t *frame, int op_ret, int op_errno) char fdstr[32]; char *op = "UNKNOWN"; + GF_VALIDATE_OR_GOTO ("server", frame, out); + this = frame->this; conf = this->private; - if (!conf || !conf->trace) - return; + GF_VALIDATE_OR_GOTO ("server", conf, out); + GF_VALIDATE_OR_GOTO ("server", conf->trace, out); state = CALL_STATE (frame); @@ -1229,6 +1295,8 @@ server_print_reply (call_frame_t *frame, int op_ret, int op_errno) gf_log (this->name, GF_LOG_NORMAL, "%s%s => (%d, %d)%s", op, caller, op_ret, op_errno, fdstr); +out: + return; } @@ -1246,11 +1314,13 @@ server_print_request (call_frame_t *frame) char caller[512]; char *op = "UNKNOWN"; + GF_VALIDATE_OR_GOTO ("server", frame, out); + this = frame->this; conf = this->private; - if (!conf || !conf->trace) - return; + GF_VALIDATE_OR_GOTO ("server", conf, out); + GF_VALIDATE_OR_GOTO ("server", conf->trace, out); state = CALL_STATE (frame); @@ -1290,17 +1360,22 @@ server_print_request (call_frame_t *frame) "%s%s%s%s%s%s%s", op, caller, resolve_vars, loc_vars, resolve2_vars, loc2_vars, other_vars); +out: + return; } int serialize_rsp_direntp (gf_dirent_t *entries, gfs3_readdirp_rsp *rsp) { - gf_dirent_t *entry = NULL; + gf_dirent_t *entry = NULL; gfs3_dirplist *trav = NULL; gfs3_dirplist *prev = NULL; - int ret = -1; + int ret = -1; - list_for_each_entry (entry, &entries->list, list) { + GF_VALIDATE_OR_GOTO ("server", entries, out); + GF_VALIDATE_OR_GOTO ("server", rsp, out); + + list_for_each_entry (entry, &entries->list, list) { trav = GF_CALLOC (1, sizeof (*trav), gf_server_mt_dirent_rsp_t); if (!trav) goto out; @@ -1320,7 +1395,7 @@ serialize_rsp_direntp (gf_dirent_t *entries, gfs3_readdirp_rsp *rsp) rsp->reply = trav; prev = trav; - } + } ret = 0; out: @@ -1331,12 +1406,15 @@ out: int serialize_rsp_dirent (gf_dirent_t *entries, gfs3_readdir_rsp *rsp) { - gf_dirent_t *entry = NULL; + gf_dirent_t *entry = NULL; gfs3_dirlist *trav = NULL; gfs3_dirlist *prev = NULL; - int ret = -1; + int ret = -1; - list_for_each_entry (entry, &entries->list, list) { + GF_VALIDATE_OR_GOTO ("server", entries, out); + GF_VALIDATE_OR_GOTO ("server", rsp, out); + + list_for_each_entry (entry, &entries->list, list) { trav = GF_CALLOC (1, sizeof (*trav), gf_server_mt_dirent_rsp_t); if (!trav) goto out; @@ -1351,7 +1429,7 @@ serialize_rsp_dirent (gf_dirent_t *entries, gfs3_readdir_rsp *rsp) rsp->reply = trav; prev = trav; - } + } ret = 0; out: |