X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lnet%2Fselftest%2Fconsole.c;h=2f4b543854cbf79be5ef3a0880ea2ab74d034584;hb=86b047f2316d4b952ebaa2c9b67ce9494d0e9fb8;hp=805091b61b9b4ba5de6cb38f56082488af13f93c;hpb=ad827bb6de60b86d153918610953d4be79ef6075;p=fs%2Flustre-release.git diff --git a/lnet/selftest/console.c b/lnet/selftest/console.c index 805091b..2f4b543 100644 --- a/lnet/selftest/console.c +++ b/lnet/selftest/console.c @@ -1,12 +1,43 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * - * Author: Liang Zhen +/* + * GPL HEADER START + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 only, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License version 2 for more details (a copy is included + * in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. * - * This file is part of Lustre, http://www.lustre.org + * GPL HEADER END + */ +/* + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lnet/selftest/conctl.c * * Infrastructure of LST console + * + * Author: Liang Zhen */ + #ifdef __KERNEL__ #include @@ -45,7 +76,8 @@ lstcon_node_find(lnet_process_id_t id, lstcon_node_t **ndpp, int create) LASSERT (id.nid != LNET_NID_ANY); - list_for_each_entry(ndl, &console_session.ses_ndl_hash[idx], ndl_hlink) { + cfs_list_for_each_entry_typed(ndl, &console_session.ses_ndl_hash[idx], + lstcon_ndlink_t, ndl_hlink) { if (ndl->ndl_node->nd_id.nid != id.nid || ndl->ndl_node->nd_id.pid != id.pid) continue; @@ -76,8 +108,8 @@ lstcon_node_find(lnet_process_id_t id, lstcon_node_t **ndpp, int create) /* queued in global hash & list, no refcount is taken by * global hash & list, if caller release his refcount, * node will be released */ - list_add_tail(&ndl->ndl_hlink, &console_session.ses_ndl_hash[idx]); - list_add_tail(&ndl->ndl_link, &console_session.ses_ndl_list); + cfs_list_add_tail(&ndl->ndl_hlink, &console_session.ses_ndl_hash[idx]); + cfs_list_add_tail(&ndl->ndl_link, &console_session.ses_ndl_list); return 0; } @@ -94,18 +126,18 @@ lstcon_node_put(lstcon_node_t *nd) ndl = (lstcon_ndlink_t *)(nd + 1); - LASSERT (!list_empty(&ndl->ndl_link)); - LASSERT (!list_empty(&ndl->ndl_hlink)); + LASSERT (!cfs_list_empty(&ndl->ndl_link)); + LASSERT (!cfs_list_empty(&ndl->ndl_hlink)); /* remove from session */ - list_del(&ndl->ndl_link); - list_del(&ndl->ndl_hlink); + cfs_list_del(&ndl->ndl_link); + cfs_list_del(&ndl->ndl_hlink); LIBCFS_FREE(nd, sizeof(lstcon_node_t) + sizeof(lstcon_ndlink_t)); } static int -lstcon_ndlink_find(struct list_head *hash, +lstcon_ndlink_find(cfs_list_t *hash, lnet_process_id_t id, lstcon_ndlink_t **ndlpp, int create) { unsigned int idx = LNET_NIDADDR(id.nid) % LST_NODE_HASHSIZE; @@ -117,7 +149,8 @@ lstcon_ndlink_find(struct list_head *hash, return -EINVAL; /* search in hash */ - list_for_each_entry(ndl, &hash[idx], ndl_hlink) { + cfs_list_for_each_entry_typed(ndl, &hash[idx], + lstcon_ndlink_t, ndl_hlink) { if (ndl->ndl_node->nd_id.nid != id.nid || ndl->ndl_node->nd_id.pid != id.pid) continue; @@ -144,7 +177,7 @@ lstcon_ndlink_find(struct list_head *hash, ndl->ndl_node = nd; CFS_INIT_LIST_HEAD(&ndl->ndl_link); - list_add_tail(&ndl->ndl_hlink, &hash[idx]); + cfs_list_add_tail(&ndl->ndl_hlink, &hash[idx]); return 0; } @@ -152,10 +185,10 @@ lstcon_ndlink_find(struct list_head *hash, static void lstcon_ndlink_release(lstcon_ndlink_t *ndl) { - LASSERT (list_empty(&ndl->ndl_link)); - LASSERT (!list_empty(&ndl->ndl_hlink)); + LASSERT (cfs_list_empty(&ndl->ndl_link)); + LASSERT (!cfs_list_empty(&ndl->ndl_hlink)); - list_del(&ndl->ndl_hlink); /* delete from hash */ + cfs_list_del(&ndl->ndl_hlink); /* delete from hash */ lstcon_node_put(ndl->ndl_node); LIBCFS_FREE(ndl, sizeof(*ndl)); @@ -205,7 +238,8 @@ lstcon_group_drain(lstcon_group_t *grp, int keep) lstcon_ndlink_t *ndl; lstcon_ndlink_t *tmp; - list_for_each_entry_safe(ndl, tmp, &grp->grp_ndl_list, ndl_link) { + cfs_list_for_each_entry_safe_typed(ndl, tmp, &grp->grp_ndl_list, + lstcon_ndlink_t, ndl_link) { if ((ndl->ndl_node->nd_state & keep) == 0) lstcon_group_ndlink_release(grp, ndl); } @@ -219,13 +253,13 @@ lstcon_group_decref(lstcon_group_t *grp) if (--grp->grp_ref > 0) return; - if (!list_empty(&grp->grp_link)) - list_del(&grp->grp_link); + if (!cfs_list_empty(&grp->grp_link)) + cfs_list_del(&grp->grp_link); lstcon_group_drain(grp, 0); for (i = 0; i < LST_NODE_HASHSIZE; i++) { - LASSERT (list_empty(&grp->grp_ndl_hash[i])); + LASSERT (cfs_list_empty(&grp->grp_ndl_hash[i])); } LIBCFS_FREE(grp, offsetof(lstcon_group_t, @@ -237,7 +271,8 @@ lstcon_group_find(char *name, lstcon_group_t **grpp) { lstcon_group_t *grp; - list_for_each_entry(grp, &console_session.ses_grp_list, grp_link) { + cfs_list_for_each_entry_typed(grp, &console_session.ses_grp_list, + lstcon_group_t, grp_link) { if (strncmp(grp->grp_name, name, LST_NAME_SIZE) != 0) continue; @@ -265,10 +300,10 @@ lstcon_group_ndlink_find(lstcon_group_t *grp, lnet_process_id_t id, if (rc != 0) return rc; - if (!list_empty(&(*ndlpp)->ndl_link)) + if (!cfs_list_empty(&(*ndlpp)->ndl_link)) return 0; - list_add_tail(&(*ndlpp)->ndl_link, &grp->grp_ndl_list); + cfs_list_add_tail(&(*ndlpp)->ndl_link, &grp->grp_ndl_list); grp->grp_nnode ++; return 0; @@ -277,7 +312,7 @@ lstcon_group_ndlink_find(lstcon_group_t *grp, lnet_process_id_t id, static void lstcon_group_ndlink_release(lstcon_group_t *grp, lstcon_ndlink_t *ndl) { - list_del_init(&ndl->ndl_link); + cfs_list_del_init(&ndl->ndl_link); lstcon_ndlink_release(ndl); grp->grp_nnode --; } @@ -289,12 +324,12 @@ lstcon_group_ndlink_move(lstcon_group_t *old, unsigned int idx = LNET_NIDADDR(ndl->ndl_node->nd_id.nid) % LST_NODE_HASHSIZE; - list_del(&ndl->ndl_hlink); - list_del(&ndl->ndl_link); + cfs_list_del(&ndl->ndl_hlink); + cfs_list_del(&ndl->ndl_link); old->grp_nnode --; - list_add_tail(&ndl->ndl_hlink, &new->grp_ndl_hash[idx]); - list_add_tail(&ndl->ndl_link, &new->grp_ndl_list); + cfs_list_add_tail(&ndl->ndl_hlink, &new->grp_ndl_hash[idx]); + cfs_list_add_tail(&ndl->ndl_link, &new->grp_ndl_list); new->grp_nnode ++; return; @@ -305,9 +340,9 @@ lstcon_group_move(lstcon_group_t *old, lstcon_group_t *new) { lstcon_ndlink_t *ndl; - while (!list_empty(&old->grp_ndl_list)) { - ndl = list_entry(old->grp_ndl_list.next, - lstcon_ndlink_t, ndl_link); + while (!cfs_list_empty(&old->grp_ndl_list)) { + ndl = cfs_list_entry(old->grp_ndl_list.next, + lstcon_ndlink_t, ndl_link); lstcon_group_ndlink_move(old, new, ndl); } } @@ -355,10 +390,10 @@ lstcon_sesrpc_readent(int transop, srpc_msg_t *msg, case LST_TRANS_SESQRY: rep = &msg->msg_body.dbg_reply; - if (copy_to_user(&ent_up->rpe_priv[0], - &rep->dbg_timeout, sizeof(int)) || - copy_to_user(&ent_up->rpe_payload[0], - &rep->dbg_name, LST_NAME_SIZE)) + if (cfs_copy_to_user(&ent_up->rpe_priv[0], + &rep->dbg_timeout, sizeof(int)) || + cfs_copy_to_user(&ent_up->rpe_payload[0], + &rep->dbg_name, LST_NAME_SIZE)) return -EFAULT; return 0; @@ -371,8 +406,9 @@ lstcon_sesrpc_readent(int transop, srpc_msg_t *msg, } static int -lstcon_group_nodes_add(lstcon_group_t *grp, int count, - lnet_process_id_t *ids_up, struct list_head *result_up) +lstcon_group_nodes_add(lstcon_group_t *grp, + int count, lnet_process_id_t *ids_up, + unsigned *featp, cfs_list_t *result_up) { lstcon_rpc_trans_t *trans; lstcon_ndlink_t *ndl; @@ -388,7 +424,7 @@ lstcon_group_nodes_add(lstcon_group_t *grp, int count, } for (i = 0 ; i < count; i++) { - if (copy_from_user(&id, &ids_up[i], sizeof(id))) { + if (cfs_copy_from_user(&id, &ids_up[i], sizeof(id))) { rc = -EFAULT; break; } @@ -422,9 +458,11 @@ lstcon_group_nodes_add(lstcon_group_t *grp, int count, /* post all RPCs */ lstcon_rpc_trans_postwait(trans, LST_TRANS_TIMEOUT); - + rc = lstcon_rpc_trans_interpreter(trans, result_up, lstcon_sesrpc_readent); + *featp = trans->tas_features; + /* destroy all RPGs */ lstcon_rpc_trans_destroy(trans); @@ -437,7 +475,7 @@ lstcon_group_nodes_add(lstcon_group_t *grp, int count, static int lstcon_group_nodes_remove(lstcon_group_t *grp, int count, lnet_process_id_t *ids_up, - struct list_head *result_up) + cfs_list_t *result_up) { lstcon_rpc_trans_t *trans; lstcon_ndlink_t *ndl; @@ -455,7 +493,7 @@ lstcon_group_nodes_remove(lstcon_group_t *grp, } for (i = 0; i < count; i++) { - if (copy_from_user(&id, &ids_up[i], sizeof(id))) { + if (cfs_copy_from_user(&id, &ids_up[i], sizeof(id))) { rc = -EFAULT; goto error; } @@ -508,14 +546,14 @@ lstcon_group_add(char *name) return -ENOMEM; } - list_add_tail(&grp->grp_link, &console_session.ses_grp_list); + cfs_list_add_tail(&grp->grp_link, &console_session.ses_grp_list); return rc; } int -lstcon_nodes_add(char *name, int count, - lnet_process_id_t *ids_up, struct list_head *result_up) +lstcon_nodes_add(char *name, int count, lnet_process_id_t *ids_up, + unsigned *featp, cfs_list_t *result_up) { lstcon_group_t *grp; int rc; @@ -537,7 +575,7 @@ lstcon_nodes_add(char *name, int count, return -EBUSY; } - rc = lstcon_group_nodes_add(grp, count, ids_up, result_up); + rc = lstcon_group_nodes_add(grp, count, ids_up, featp, result_up); lstcon_group_put(grp); @@ -611,7 +649,7 @@ lstcon_group_clean(char *name, int args) lstcon_group_put(grp); /* release empty group */ - if (list_empty(&grp->grp_ndl_list)) + if (cfs_list_empty(&grp->grp_ndl_list)) lstcon_group_put(grp); return 0; @@ -619,7 +657,7 @@ lstcon_group_clean(char *name, int args) int lstcon_nodes_remove(char *name, int count, - lnet_process_id_t *ids_up, struct list_head *result_up) + lnet_process_id_t *ids_up, cfs_list_t *result_up) { lstcon_group_t *grp = NULL; int rc; @@ -641,14 +679,14 @@ lstcon_nodes_remove(char *name, int count, lstcon_group_put(grp); /* release empty group */ - if (list_empty(&grp->grp_ndl_list)) + if (cfs_list_empty(&grp->grp_ndl_list)) lstcon_group_put(grp); return rc; } int -lstcon_group_refresh(char *name, struct list_head *result_up) +lstcon_group_refresh(char *name, cfs_list_t *result_up) { lstcon_rpc_trans_t *trans; lstcon_group_t *grp; @@ -697,9 +735,10 @@ lstcon_group_list(int index, int len, char *name_up) LASSERT (index >= 0); LASSERT (name_up != NULL); - list_for_each_entry(grp, &console_session.ses_grp_list, grp_link) { + cfs_list_for_each_entry_typed(grp, &console_session.ses_grp_list, + lstcon_group_t, grp_link) { if (index-- == 0) { - return copy_to_user(name_up, grp->grp_name, len) ? + return cfs_copy_to_user(name_up, grp->grp_name, len) ? -EFAULT : 0; } } @@ -708,7 +747,7 @@ lstcon_group_list(int index, int len, char *name_up) } static int -lstcon_nodes_getent(struct list_head *head, int *index_p, +lstcon_nodes_getent(cfs_list_t *head, int *index_p, int *count_p, lstcon_node_ent_t *dents_up) { lstcon_ndlink_t *ndl; @@ -721,7 +760,7 @@ lstcon_nodes_getent(struct list_head *head, int *index_p, LASSERT (*index_p >= 0); LASSERT (*count_p > 0); - list_for_each_entry(ndl, head, ndl_link) { + cfs_list_for_each_entry_typed(ndl, head, lstcon_ndlink_t, ndl_link) { if (index++ < *index_p) continue; @@ -729,10 +768,10 @@ lstcon_nodes_getent(struct list_head *head, int *index_p, break; nd = ndl->ndl_node; - if (copy_to_user(&dents_up[count].nde_id, - &nd->nd_id, sizeof(nd->nd_id)) || - copy_to_user(&dents_up[count].nde_state, - &nd->nd_state, sizeof(nd->nd_state))) + if (cfs_copy_to_user(&dents_up[count].nde_id, + &nd->nd_id, sizeof(nd->nd_id)) || + cfs_copy_to_user(&dents_up[count].nde_state, + &nd->nd_state, sizeof(nd->nd_state))) return -EFAULT; count ++; @@ -782,14 +821,15 @@ lstcon_group_info(char *name, lstcon_ndlist_ent_t *gents_p, memset(gentp, 0, sizeof(lstcon_ndlist_ent_t)); - list_for_each_entry(ndl, &grp->grp_ndl_list, ndl_link) + cfs_list_for_each_entry_typed(ndl, &grp->grp_ndl_list, + lstcon_ndlink_t, ndl_link) LST_NODE_STATE_COUNTER(ndl->ndl_node, gentp); - rc = copy_to_user(gents_p, gentp, - sizeof(lstcon_ndlist_ent_t)) ? -EFAULT: 0; + rc = cfs_copy_to_user(gents_p, gentp, + sizeof(lstcon_ndlist_ent_t)) ? -EFAULT: 0; LIBCFS_FREE(gentp, sizeof(lstcon_ndlist_ent_t)); - + lstcon_group_put(grp); return 0; @@ -800,7 +840,8 @@ lstcon_batch_find(char *name, lstcon_batch_t **batpp) { lstcon_batch_t *bat; - list_for_each_entry(bat, &console_session.ses_bat_list, bat_link) { + cfs_list_for_each_entry_typed(bat, &console_session.ses_bat_list, + lstcon_batch_t, bat_link) { if (strncmp(bat->bat_name, name, LST_NAME_SIZE) == 0) { *batpp = bat; return 0; @@ -830,7 +871,7 @@ lstcon_batch_add(char *name) } LIBCFS_ALLOC(bat->bat_cli_hash, - sizeof(struct list_head) * LST_NODE_HASHSIZE); + sizeof(cfs_list_t) * LST_NODE_HASHSIZE); if (bat->bat_cli_hash == NULL) { CERROR("Can't allocate hash for batch %s\n", name); LIBCFS_FREE(bat, sizeof(lstcon_batch_t)); @@ -839,7 +880,7 @@ lstcon_batch_add(char *name) } LIBCFS_ALLOC(bat->bat_srv_hash, - sizeof(struct list_head) * LST_NODE_HASHSIZE); + sizeof(cfs_list_t) * LST_NODE_HASHSIZE); if (bat->bat_srv_hash == NULL) { CERROR("Can't allocate hash for batch %s\n", name); LIBCFS_FREE(bat->bat_cli_hash, LST_NODE_HASHSIZE); @@ -865,7 +906,7 @@ lstcon_batch_add(char *name) CFS_INIT_LIST_HEAD(&bat->bat_srv_hash[i]); } - list_add_tail(&bat->bat_link, &console_session.ses_bat_list); + cfs_list_add_tail(&bat->bat_link, &console_session.ses_bat_list); return rc; } @@ -878,9 +919,10 @@ lstcon_batch_list(int index, int len, char *name_up) LASSERT (name_up != NULL); LASSERT (index >= 0); - list_for_each_entry(bat, &console_session.ses_bat_list, bat_link) { + cfs_list_for_each_entry_typed(bat, &console_session.ses_bat_list, + lstcon_batch_t, bat_link) { if (index-- == 0) { - return copy_to_user(name_up,bat->bat_name, len) ? + return cfs_copy_to_user(name_up,bat->bat_name, len) ? -EFAULT: 0; } } @@ -894,8 +936,8 @@ lstcon_batch_info(char *name, lstcon_test_batch_ent_t *ent_up, int server, lstcon_node_ent_t *dents_up) { lstcon_test_batch_ent_t *entp; - struct list_head *clilst; - struct list_head *srvlst; + cfs_list_t *clilst; + cfs_list_t *srvlst; lstcon_test_t *test = NULL; lstcon_batch_t *bat; lstcon_ndlink_t *ndl; @@ -909,7 +951,8 @@ lstcon_batch_info(char *name, lstcon_test_batch_ent_t *ent_up, int server, if (testidx > 0) { /* query test, test index start from 1 */ - list_for_each_entry(test, &bat->bat_test_list, tes_link) { + cfs_list_for_each_entry_typed(test, &bat->bat_test_list, + lstcon_test_t, tes_link) { if (testidx-- == 1) break; } @@ -949,14 +992,14 @@ lstcon_batch_info(char *name, lstcon_test_batch_ent_t *ent_up, int server, entp->u.tbe_test.tse_concur = test->tes_concur; } - list_for_each_entry(ndl, clilst, ndl_link) + cfs_list_for_each_entry_typed(ndl, clilst, lstcon_ndlink_t, ndl_link) LST_NODE_STATE_COUNTER(ndl->ndl_node, &entp->tbe_cli_nle); - list_for_each_entry(ndl, srvlst, ndl_link) + cfs_list_for_each_entry_typed(ndl, srvlst, lstcon_ndlink_t, ndl_link) LST_NODE_STATE_COUNTER(ndl->ndl_node, &entp->tbe_srv_nle); - rc = copy_to_user(ent_up, entp, - sizeof(lstcon_test_batch_ent_t)) ? -EFAULT : 0; + rc = cfs_copy_to_user(ent_up, entp, + sizeof(lstcon_test_batch_ent_t)) ? -EFAULT : 0; LIBCFS_FREE(entp, sizeof(lstcon_test_batch_ent_t)); @@ -986,7 +1029,8 @@ lstcon_batrpc_condition(int transop, lstcon_node_t *nd, void *arg) } static int -lstcon_batch_op(lstcon_batch_t *bat, int transop, struct list_head *result_up) +lstcon_batch_op(lstcon_batch_t *bat, int transop, + cfs_list_t *result_up) { lstcon_rpc_trans_t *trans; int rc; @@ -1009,7 +1053,7 @@ lstcon_batch_op(lstcon_batch_t *bat, int transop, struct list_head *result_up) } int -lstcon_batch_run(char *name, int timeout, struct list_head *result_up) +lstcon_batch_run(char *name, int timeout, cfs_list_t *result_up) { lstcon_batch_t *bat; int rc; @@ -1031,7 +1075,7 @@ lstcon_batch_run(char *name, int timeout, struct list_head *result_up) } int -lstcon_batch_stop(char *name, int force, struct list_head *result_up) +lstcon_batch_stop(char *name, int force, cfs_list_t *result_up) { lstcon_batch_t *bat; int rc; @@ -1059,14 +1103,14 @@ lstcon_batch_destroy(lstcon_batch_t *bat) lstcon_test_t *test; int i; - list_del(&bat->bat_link); + cfs_list_del(&bat->bat_link); - while (!list_empty(&bat->bat_test_list)) { - test = list_entry(bat->bat_test_list.next, - lstcon_test_t, tes_link); - LASSERT (list_empty(&test->tes_trans_list)); + while (!cfs_list_empty(&bat->bat_test_list)) { + test = cfs_list_entry(bat->bat_test_list.next, + lstcon_test_t, tes_link); + LASSERT (cfs_list_empty(&test->tes_trans_list)); - list_del(&test->tes_link); + cfs_list_del(&test->tes_link); lstcon_group_put(test->tes_src_grp); lstcon_group_put(test->tes_dst_grp); @@ -1075,33 +1119,33 @@ lstcon_batch_destroy(lstcon_batch_t *bat) tes_param[test->tes_paramlen])); } - LASSERT (list_empty(&bat->bat_trans_list)); + LASSERT (cfs_list_empty(&bat->bat_trans_list)); - while (!list_empty(&bat->bat_cli_list)) { - ndl = list_entry(bat->bat_cli_list.next, - lstcon_ndlink_t, ndl_link); - list_del_init(&ndl->ndl_link); + while (!cfs_list_empty(&bat->bat_cli_list)) { + ndl = cfs_list_entry(bat->bat_cli_list.next, + lstcon_ndlink_t, ndl_link); + cfs_list_del_init(&ndl->ndl_link); lstcon_ndlink_release(ndl); } - while (!list_empty(&bat->bat_srv_list)) { - ndl = list_entry(bat->bat_srv_list.next, - lstcon_ndlink_t, ndl_link); - list_del_init(&ndl->ndl_link); + while (!cfs_list_empty(&bat->bat_srv_list)) { + ndl = cfs_list_entry(bat->bat_srv_list.next, + lstcon_ndlink_t, ndl_link); + cfs_list_del_init(&ndl->ndl_link); lstcon_ndlink_release(ndl); } for (i = 0; i < LST_NODE_HASHSIZE; i++) { - LASSERT (list_empty(&bat->bat_cli_hash[i])); - LASSERT (list_empty(&bat->bat_srv_hash[i])); + LASSERT (cfs_list_empty(&bat->bat_cli_hash[i])); + LASSERT (cfs_list_empty(&bat->bat_srv_hash[i])); } LIBCFS_FREE(bat->bat_cli_hash, - sizeof(struct list_head) * LST_NODE_HASHSIZE); + sizeof(cfs_list_t) * LST_NODE_HASHSIZE); LIBCFS_FREE(bat->bat_srv_hash, - sizeof(struct list_head) * LST_NODE_HASHSIZE); + sizeof(cfs_list_t) * LST_NODE_HASHSIZE); LIBCFS_FREE(bat, sizeof(lstcon_batch_t)); } @@ -1111,8 +1155,8 @@ lstcon_testrpc_condition(int transop, lstcon_node_t *nd, void *arg) lstcon_test_t *test; lstcon_batch_t *batch; lstcon_ndlink_t *ndl; - struct list_head *hash; - struct list_head *head; + cfs_list_t *hash; + cfs_list_t *head; test = (lstcon_test_t *)arg; LASSERT (test != NULL); @@ -1143,14 +1187,14 @@ lstcon_testrpc_condition(int transop, lstcon_node_t *nd, void *arg) if (lstcon_ndlink_find(hash, nd->nd_id, &ndl, 1) != 0) return -ENOMEM; - if (list_empty(&ndl->ndl_link)) - list_add_tail(&ndl->ndl_link, head); + if (cfs_list_empty(&ndl->ndl_link)) + cfs_list_add_tail(&ndl->ndl_link, head); return 1; } static int -lstcon_test_nodes_add(lstcon_test_t *test, struct list_head *result_up) +lstcon_test_nodes_add(lstcon_test_t *test, cfs_list_t *result_up) { lstcon_rpc_trans_t *trans; lstcon_group_t *grp; @@ -1204,8 +1248,8 @@ again: int lstcon_test_add(char *name, int type, int loop, int concur, int dist, int span, char *src_name, char * dst_name, - void *param, int paramlen, int *retp, struct list_head *result_up) - + void *param, int paramlen, int *retp, + cfs_list_t *result_up) { lstcon_group_t *src_grp = NULL; lstcon_group_t *dst_grp = NULL; @@ -1223,7 +1267,7 @@ lstcon_test_add(char *name, int type, int loop, int concur, CDEBUG(D_NET, "Can't change running batch %s\n", name); return rc; } - + rc = lstcon_group_find(src_name, &src_grp); if (rc != 0) { CDEBUG(D_NET, "Can't find group %s\n", src_name); @@ -1277,7 +1321,7 @@ lstcon_test_add(char *name, int type, int loop, int concur, CDEBUG(D_NET, "Failed to add test %d to batch %s\n", type, name); /* add to test list anyway, so user can check what's going on */ - list_add_tail(&test->tes_link, &batch->bat_test_list); + cfs_list_add_tail(&test->tes_link, &batch->bat_test_list); batch->bat_ntest ++; test->tes_hdr.tsb_index = batch->bat_ntest; @@ -1302,7 +1346,8 @@ lstcon_test_find(lstcon_batch_t *batch, int idx, lstcon_test_t **testpp) { lstcon_test_t *test; - list_for_each_entry(test, &batch->bat_test_list, tes_link) { + cfs_list_for_each_entry_typed(test, &batch->bat_test_list, + lstcon_test_t, tes_link) { if (idx == test->tes_hdr.tsb_index) { *testpp = test; return 0; @@ -1322,8 +1367,8 @@ lstcon_tsbrpc_readent(int transop, srpc_msg_t *msg, transop == LST_TRANS_TSBSRVQRY); /* positive errno, framework error code */ - if (copy_to_user(&ent_up->rpe_priv[0], - &rep->bar_active, sizeof(rep->bar_active))) + if (cfs_copy_to_user(&ent_up->rpe_priv[0], + &rep->bar_active, sizeof(rep->bar_active))) return -EFAULT; return 0; @@ -1331,11 +1376,11 @@ lstcon_tsbrpc_readent(int transop, srpc_msg_t *msg, int lstcon_test_batch_query(char *name, int testidx, int client, - int timeout, struct list_head *result_up) + int timeout, cfs_list_t *result_up) { lstcon_rpc_trans_t *trans; - struct list_head *translist; - struct list_head *ndlist; + cfs_list_t *translist; + cfs_list_t *ndlist; lstcon_tsb_hdr_t *hdr; lstcon_batch_t *batch; lstcon_test_t *test = NULL; @@ -1407,19 +1452,19 @@ lstcon_statrpc_readent(int transop, srpc_msg_t *msg, srpc_stat = (srpc_counters_t *)((char *)sfwk_stat + sizeof(*sfwk_stat)); lnet_stat = (lnet_counters_t *)((char *)srpc_stat + sizeof(*srpc_stat)); - if (copy_to_user(sfwk_stat, &rep->str_fw, sizeof(*sfwk_stat)) || - copy_to_user(srpc_stat, &rep->str_rpc, sizeof(*srpc_stat)) || - copy_to_user(lnet_stat, &rep->str_lnet, sizeof(*lnet_stat))) + if (cfs_copy_to_user(sfwk_stat, &rep->str_fw, sizeof(*sfwk_stat)) || + cfs_copy_to_user(srpc_stat, &rep->str_rpc, sizeof(*srpc_stat)) || + cfs_copy_to_user(lnet_stat, &rep->str_lnet, sizeof(*lnet_stat))) return -EFAULT; return 0; } int -lstcon_ndlist_stat(struct list_head *ndlist, - int timeout, struct list_head *result_up) +lstcon_ndlist_stat(cfs_list_t *ndlist, + int timeout, cfs_list_t *result_up) { - struct list_head head; + cfs_list_t head; lstcon_rpc_trans_t *trans; int rc; @@ -1432,9 +1477,7 @@ lstcon_ndlist_stat(struct list_head *ndlist, return rc; } - timeout = (timeout > LST_TRANS_MIN_TIMEOUT) ? timeout : - LST_TRANS_MIN_TIMEOUT; - lstcon_rpc_trans_postwait(trans, timeout); + lstcon_rpc_trans_postwait(trans, LST_VALIDATE_TIMEOUT(timeout)); rc = lstcon_rpc_trans_interpreter(trans, result_up, lstcon_statrpc_readent); @@ -1444,7 +1487,7 @@ lstcon_ndlist_stat(struct list_head *ndlist, } int -lstcon_group_stat(char *grp_name, int timeout, struct list_head *result_up) +lstcon_group_stat(char *grp_name, int timeout, cfs_list_t *result_up) { lstcon_group_t *grp; int rc; @@ -1464,7 +1507,7 @@ lstcon_group_stat(char *grp_name, int timeout, struct list_head *result_up) int lstcon_nodes_stat(int count, lnet_process_id_t *ids_up, - int timeout, struct list_head *result_up) + int timeout, cfs_list_t *result_up) { lstcon_ndlink_t *ndl; lstcon_group_t *tmp; @@ -1479,7 +1522,7 @@ lstcon_nodes_stat(int count, lnet_process_id_t *ids_up, } for (i = 0 ; i < count; i++) { - if (copy_from_user(&id, &ids_up[i], sizeof(id))) { + if (cfs_copy_from_user(&id, &ids_up[i], sizeof(id))) { rc = -EFAULT; break; } @@ -1507,9 +1550,9 @@ lstcon_nodes_stat(int count, lnet_process_id_t *ids_up, } int -lstcon_debug_ndlist(struct list_head *ndlist, - struct list_head *translist, - int timeout, struct list_head *result_up) +lstcon_debug_ndlist(cfs_list_t *ndlist, + cfs_list_t *translist, + int timeout, cfs_list_t *result_up) { lstcon_rpc_trans_t *trans; int rc; @@ -1521,10 +1564,7 @@ lstcon_debug_ndlist(struct list_head *ndlist, return rc; } - timeout = (timeout > LST_TRANS_MIN_TIMEOUT) ? timeout : - LST_TRANS_MIN_TIMEOUT; - - lstcon_rpc_trans_postwait(trans, timeout); + lstcon_rpc_trans_postwait(trans, LST_VALIDATE_TIMEOUT(timeout)); rc = lstcon_rpc_trans_interpreter(trans, result_up, lstcon_sesrpc_readent); @@ -1534,7 +1574,7 @@ lstcon_debug_ndlist(struct list_head *ndlist, } int -lstcon_session_debug(int timeout, struct list_head *result_up) +lstcon_session_debug(int timeout, cfs_list_t *result_up) { return lstcon_debug_ndlist(&console_session.ses_ndl_list, NULL, timeout, result_up); @@ -1542,7 +1582,7 @@ lstcon_session_debug(int timeout, struct list_head *result_up) int lstcon_batch_debug(int timeout, char *name, - int client, struct list_head *result_up) + int client, cfs_list_t *result_up) { lstcon_batch_t *bat; int rc; @@ -1560,7 +1600,7 @@ lstcon_batch_debug(int timeout, char *name, int lstcon_group_debug(int timeout, char *name, - struct list_head *result_up) + cfs_list_t *result_up) { lstcon_group_t *grp; int rc; @@ -1579,7 +1619,7 @@ lstcon_group_debug(int timeout, char *name, int lstcon_nodes_debug(int timeout, int count, lnet_process_id_t *ids_up, - struct list_head *result_up) + cfs_list_t *result_up) { lnet_process_id_t id; lstcon_ndlink_t *ndl; @@ -1594,7 +1634,7 @@ lstcon_nodes_debug(int timeout, } for (i = 0; i < count; i++) { - if (copy_from_user(&id, &ids_up[i], sizeof(id))) { + if (cfs_copy_from_user(&id, &ids_up[i], sizeof(id))) { rc = -EFAULT; break; } @@ -1642,8 +1682,8 @@ lstcon_new_session_id(lst_sid_t *sid) extern srpc_service_t lstcon_acceptor_service; int -lstcon_session_new(char *name, int key, - int timeout,int force, lst_sid_t *sid_up) +lstcon_session_new(char *name, int key, unsigned feats, + int timeout, int force, lst_sid_t *sid_up) { int rc = 0; int i; @@ -1651,8 +1691,8 @@ lstcon_session_new(char *name, int key, if (console_session.ses_state != LST_SESSION_NONE) { /* session exists */ if (!force) { - CERROR("Session %s already exists\n", - console_session.ses_name); + CNETERR("Session %s already exists\n", + console_session.ses_name); return -EEXIST; } @@ -1663,9 +1703,25 @@ lstcon_session_new(char *name, int key, return rc; } - for (i = 0; i < LST_GLOBAL_HASHSIZE; i++) { - LASSERT (list_empty(&console_session.ses_ndl_hash[i])); - } + if ((feats & ~LST_FEATS_MASK) != 0) { + CNETERR("Unknown session features %x\n", + (feats & ~LST_FEATS_MASK)); + return -EINVAL; + } + + for (i = 0; i < LST_GLOBAL_HASHSIZE; i++) + LASSERT(cfs_list_empty(&console_session.ses_ndl_hash[i])); + + lstcon_new_session_id(&console_session.ses_id); + + console_session.ses_key = key; + console_session.ses_state = LST_SESSION_ACTIVE; + console_session.ses_force = !!force; + console_session.ses_features = feats; + console_session.ses_feats_updated = 0; + console_session.ses_timeout = (timeout <= 0) ? + LST_CONSOLE_TIMEOUT : timeout; + strcpy(console_session.ses_name, name); rc = lstcon_batch_add(LST_DEFAULT_BATCH); if (rc != 0) @@ -1673,7 +1729,7 @@ lstcon_session_new(char *name, int key, rc = lstcon_rpc_pinger_start(); if (rc != 0) { - lstcon_batch_t *bat; + lstcon_batch_t *bat = NULL; lstcon_batch_find(LST_DEFAULT_BATCH, &bat); lstcon_batch_destroy(bat); @@ -1681,17 +1737,8 @@ lstcon_session_new(char *name, int key, return rc; } - lstcon_new_session_id(&console_session.ses_id); - - console_session.ses_key = key; - console_session.ses_state = LST_SESSION_ACTIVE; - console_session.ses_force = !!force; - console_session.ses_timeout = (timeout <= 0)? LST_CONSOLE_TIMEOUT: - timeout; - strcpy(console_session.ses_name, name); - - if (copy_to_user(sid_up, &console_session.ses_id, - sizeof(lst_sid_t)) == 0) + if (cfs_copy_to_user(sid_up, &console_session.ses_id, + sizeof(lst_sid_t)) == 0) return rc; lstcon_session_end(); @@ -1700,13 +1747,13 @@ lstcon_session_new(char *name, int key, } int -lstcon_session_info(lst_sid_t *sid_up, int *key_up, +lstcon_session_info(lst_sid_t *sid_up, int *key_up, unsigned *featp, lstcon_ndlist_ent_t *ndinfo_up, char *name_up, int len) { lstcon_ndlist_ent_t *entp; lstcon_ndlink_t *ndl; int rc = 0; - + if (console_session.ses_state != LST_SESSION_ACTIVE) return -ESRCH; @@ -1716,13 +1763,18 @@ lstcon_session_info(lst_sid_t *sid_up, int *key_up, memset(entp, 0, sizeof(*entp)); - list_for_each_entry(ndl, &console_session.ses_ndl_list, ndl_link) + cfs_list_for_each_entry_typed(ndl, &console_session.ses_ndl_list, + lstcon_ndlink_t, ndl_link) LST_NODE_STATE_COUNTER(ndl->ndl_node, entp); - if (copy_to_user(sid_up, &console_session.ses_id, sizeof(lst_sid_t)) || - copy_to_user(key_up, &console_session.ses_key, sizeof(int)) || - copy_to_user(ndinfo_up, entp, sizeof(*entp)) || - copy_to_user(name_up, console_session.ses_name, len)) + if (cfs_copy_to_user(sid_up, &console_session.ses_id, + sizeof(lst_sid_t)) || + cfs_copy_to_user(key_up, &console_session.ses_key, + sizeof(*key_up)) || + cfs_copy_to_user(featp, &console_session.ses_features, + sizeof(*featp)) || + cfs_copy_to_user(ndinfo_up, entp, sizeof(*entp)) || + cfs_copy_to_user(name_up, console_session.ses_name, len)) rc = -EFAULT; LIBCFS_FREE(entp, sizeof(*entp)); @@ -1764,26 +1816,27 @@ lstcon_session_end() console_session.ses_state = LST_SESSION_NONE; console_session.ses_key = 0; console_session.ses_force = 0; + console_session.ses_feats_updated = 0; /* destroy all batches */ - while (!list_empty(&console_session.ses_bat_list)) { - bat = list_entry(console_session.ses_bat_list.next, - lstcon_batch_t, bat_link); + while (!cfs_list_empty(&console_session.ses_bat_list)) { + bat = cfs_list_entry(console_session.ses_bat_list.next, + lstcon_batch_t, bat_link); lstcon_batch_destroy(bat); } /* destroy all groups */ - while (!list_empty(&console_session.ses_grp_list)) { - grp = list_entry(console_session.ses_grp_list.next, - lstcon_group_t, grp_link); + while (!cfs_list_empty(&console_session.ses_grp_list)) { + grp = cfs_list_entry(console_session.ses_grp_list.next, + lstcon_group_t, grp_link); LASSERT (grp->grp_ref == 1); lstcon_group_put(grp); } /* all nodes should be released */ - LASSERT (list_empty(&console_session.ses_ndl_list)); + LASSERT (cfs_list_empty(&console_session.ses_ndl_list)); console_session.ses_shutdown = 0; console_session.ses_expired = 0; @@ -1791,6 +1844,38 @@ lstcon_session_end() return rc; } +int +lstcon_session_feats_check(unsigned feats) +{ + int rc = 0; + + if ((feats & ~LST_FEATS_MASK) != 0) { + CERROR("Can't support these features: %x\n", + (feats & ~LST_FEATS_MASK)); + return -EPROTO; + } + + cfs_spin_lock(&console_session.ses_rpc_lock); + + if (!console_session.ses_feats_updated) { + console_session.ses_feats_updated = 1; + console_session.ses_features = feats; + } + + if (console_session.ses_features != feats) + rc = -EPROTO; + + cfs_spin_unlock(&console_session.ses_rpc_lock); + + if (rc != 0) { + CERROR("remote features %x do not match with " + "session features %x of console\n", + feats, console_session.ses_features); + } + + return rc; +} + static int lstcon_acceptor_handle (srpc_server_rpc_t *rpc) { @@ -1804,7 +1889,7 @@ lstcon_acceptor_handle (srpc_server_rpc_t *rpc) sfw_unpack_message(req); - mutex_down(&console_session.ses_mutex); + cfs_mutex_lock(&console_session.ses_mutex); jrep->join_sid = console_session.ses_id; @@ -1813,6 +1898,11 @@ lstcon_acceptor_handle (srpc_server_rpc_t *rpc) goto out; } + if (lstcon_session_feats_check(req->msg_ses_feats) != 0) { + jrep->join_status = EPROTO; + goto out; + } + if (jreq->join_sid.ses_nid != LNET_NID_ANY && !lstcon_session_match(jreq->join_sid)) { jrep->join_status = EBUSY; @@ -1826,8 +1916,8 @@ lstcon_acceptor_handle (srpc_server_rpc_t *rpc) goto out; } - list_add_tail(&grp->grp_link, - &console_session.ses_grp_list); + cfs_list_add_tail(&grp->grp_link, + &console_session.ses_grp_list); lstcon_group_addref(grp); } @@ -1860,22 +1950,24 @@ lstcon_acceptor_handle (srpc_server_rpc_t *rpc) jrep->join_status = 0; out: + rep->msg_ses_feats = console_session.ses_features; if (grp != NULL) lstcon_group_put(grp); - mutex_up(&console_session.ses_mutex); + cfs_mutex_unlock(&console_session.ses_mutex); return rc; } -srpc_service_t lstcon_acceptor_service = +srpc_service_t lstcon_acceptor_service; +void lstcon_init_acceptor_service(void) { - .sv_name = "join session", - .sv_handler = lstcon_acceptor_handle, - .sv_bulk_ready = NULL, - .sv_id = SRPC_SERVICE_JOIN, - .sv_concur = SFW_SERVICE_CONCURRENCY, -}; + /* initialize selftest console acceptor service table */ + lstcon_acceptor_service.sv_name = "join session"; + lstcon_acceptor_service.sv_handler = lstcon_acceptor_handle; + lstcon_acceptor_service.sv_id = SRPC_SERVICE_JOIN; + lstcon_acceptor_service.sv_wi_total = SFW_FRWK_WI_MAX; +} extern int lstcon_ioctl_entry(unsigned int cmd, struct libcfs_ioctl_data *data); @@ -1886,19 +1978,20 @@ int lstcon_console_init(void) { int i; - int n; int rc; memset(&console_session, 0, sizeof(lstcon_session_t)); - console_session.ses_id = LST_INVALID_SID; - console_session.ses_state = LST_SESSION_NONE; - console_session.ses_timeout = 0; - console_session.ses_force = 0; - console_session.ses_expired = 0; - console_session.ses_laststamp = cfs_time_current_sec(); + console_session.ses_id = LST_INVALID_SID; + console_session.ses_state = LST_SESSION_NONE; + console_session.ses_timeout = 0; + console_session.ses_force = 0; + console_session.ses_expired = 0; + console_session.ses_feats_updated = 0; + console_session.ses_features = LST_FEATS_MASK; + console_session.ses_laststamp = cfs_time_current_sec(); - init_mutex(&console_session.ses_mutex); + cfs_mutex_init(&console_session.ses_mutex); CFS_INIT_LIST_HEAD(&console_session.ses_ndl_list); CFS_INIT_LIST_HEAD(&console_session.ses_grp_list); @@ -1906,23 +1999,28 @@ lstcon_console_init(void) CFS_INIT_LIST_HEAD(&console_session.ses_trans_list); LIBCFS_ALLOC(console_session.ses_ndl_hash, - sizeof(struct list_head) * LST_GLOBAL_HASHSIZE); + sizeof(cfs_list_t) * LST_GLOBAL_HASHSIZE); if (console_session.ses_ndl_hash == NULL) return -ENOMEM; for (i = 0; i < LST_GLOBAL_HASHSIZE; i++) CFS_INIT_LIST_HEAD(&console_session.ses_ndl_hash[i]); + + /* initialize acceptor service table */ + lstcon_init_acceptor_service(); + rc = srpc_add_service(&lstcon_acceptor_service); LASSERT (rc != -EBUSY); if (rc != 0) { LIBCFS_FREE(console_session.ses_ndl_hash, - sizeof(struct list_head) * LST_GLOBAL_HASHSIZE); + sizeof(cfs_list_t) * LST_GLOBAL_HASHSIZE); return rc; } - n = srpc_service_add_buffers(&lstcon_acceptor_service, SFW_POST_BUFFERS); - if (n != SFW_POST_BUFFERS) { + rc = srpc_service_add_buffers(&lstcon_acceptor_service, + lstcon_acceptor_service.sv_wi_total); + if (rc != 0) { rc = -ENOMEM; goto out; } @@ -1939,7 +2037,7 @@ out: srpc_remove_service(&lstcon_acceptor_service); LIBCFS_FREE(console_session.ses_ndl_hash, - sizeof(struct list_head) * LST_GLOBAL_HASHSIZE); + sizeof(cfs_list_t) * LST_GLOBAL_HASHSIZE); srpc_wait_service_shutdown(&lstcon_acceptor_service); @@ -1951,31 +2049,31 @@ lstcon_console_fini(void) { int i; - mutex_down(&console_session.ses_mutex); - libcfs_deregister_ioctl(&lstcon_ioctl_handler); + cfs_mutex_lock(&console_session.ses_mutex); + srpc_shutdown_service(&lstcon_acceptor_service); srpc_remove_service(&lstcon_acceptor_service); - if (console_session.ses_state != LST_SESSION_NONE) + if (console_session.ses_state != LST_SESSION_NONE) lstcon_session_end(); lstcon_rpc_module_fini(); - mutex_up(&console_session.ses_mutex); + cfs_mutex_unlock(&console_session.ses_mutex); - LASSERT (list_empty(&console_session.ses_ndl_list)); - LASSERT (list_empty(&console_session.ses_grp_list)); - LASSERT (list_empty(&console_session.ses_bat_list)); - LASSERT (list_empty(&console_session.ses_trans_list)); + LASSERT (cfs_list_empty(&console_session.ses_ndl_list)); + LASSERT (cfs_list_empty(&console_session.ses_grp_list)); + LASSERT (cfs_list_empty(&console_session.ses_bat_list)); + LASSERT (cfs_list_empty(&console_session.ses_trans_list)); for (i = 0; i < LST_NODE_HASHSIZE; i++) { - LASSERT (list_empty(&console_session.ses_ndl_hash[i])); + LASSERT (cfs_list_empty(&console_session.ses_ndl_hash[i])); } LIBCFS_FREE(console_session.ses_ndl_hash, - sizeof(struct list_head) * LST_GLOBAL_HASHSIZE); + sizeof(cfs_list_t) * LST_GLOBAL_HASHSIZE); srpc_wait_service_shutdown(&lstcon_acceptor_service);