⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 console.c

📁 lustre 1.6.5 source code
💻 C
📖 第 1 页 / 共 4 页
字号:
                               libcfs_id2str(id), rc);                        break;                }        }        if (rc != 0) {                lstcon_group_put(tmp);                return rc;        }        rc = lstcon_ndlist_stat(&tmp->grp_ndl_list, timeout, result_up);        lstcon_group_put(tmp);        return rc;}intlstcon_debug_ndlist(struct list_head *ndlist,                    struct list_head *translist,                    int timeout, struct list_head *result_up){        lstcon_rpc_trans_t *trans;        int                 rc;        rc = lstcon_rpc_trans_ndlist(ndlist, translist, LST_TRANS_SESQRY,                                     NULL, lstcon_sesrpc_condition, &trans);        if (rc != 0) {                CERROR("Can't create transaction: %d\n", rc);                return rc;        }        timeout = (timeout > LST_TRANS_MIN_TIMEOUT) ? timeout :                                                      LST_TRANS_MIN_TIMEOUT;        lstcon_rpc_trans_postwait(trans, timeout);        rc = lstcon_rpc_trans_interpreter(trans, result_up,                                          lstcon_sesrpc_readent);        lstcon_rpc_trans_destroy(trans);        return rc;}intlstcon_session_debug(int timeout, struct list_head *result_up){        return lstcon_debug_ndlist(&console_session.ses_ndl_list,                                   NULL, timeout, result_up);}intlstcon_batch_debug(int timeout, char *name,                   int client, struct list_head *result_up){        lstcon_batch_t *bat;        int             rc;        rc = lstcon_batch_find(name, &bat);        if (rc != 0)                return -ENOENT;        rc = lstcon_debug_ndlist(client ? &bat->bat_cli_list :                                          &bat->bat_srv_list,                                 NULL, timeout, result_up);        return rc;}intlstcon_group_debug(int timeout, char *name,                   struct list_head *result_up){        lstcon_group_t *grp;        int             rc;        rc = lstcon_group_find(name, &grp);        if (rc != 0)                return -ENOENT;        rc = lstcon_debug_ndlist(&grp->grp_ndl_list, NULL,                                 timeout, result_up);        lstcon_group_put(grp);        return rc;}intlstcon_nodes_debug(int timeout,                   int count, lnet_process_id_t *ids_up,                    struct list_head *result_up){        lnet_process_id_t  id;        lstcon_ndlink_t   *ndl;        lstcon_group_t    *grp;        int                i;        int                rc;        rc = lstcon_group_alloc(NULL, &grp);        if (rc != 0) {                CDEBUG(D_NET, "Out of memory\n");                return rc;        }        for (i = 0; i < count; i++) {                if (copy_from_user(&id, &ids_up[i], sizeof(id))) {                        rc = -EFAULT;                        break;                }                /* node is added to tmp group */                rc = lstcon_group_ndlink_find(grp, id, &ndl, 1);                if (rc != 0) {                        CERROR("Can't create node link\n");                        break;                }        }        if (rc != 0) {                lstcon_group_put(grp);                return rc;        }        rc = lstcon_debug_ndlist(&grp->grp_ndl_list, NULL,                                 timeout, result_up);        lstcon_group_put(grp);        return rc;}intlstcon_session_match(lst_sid_t sid){        return (console_session.ses_id.ses_nid   == sid.ses_nid &&                console_session.ses_id.ses_stamp == sid.ses_stamp) ?  1: 0;}static voidlstcon_new_session_id(lst_sid_t *sid){        lnet_process_id_t      id;        LASSERT (console_session.ses_state == LST_SESSION_NONE);        LNetGetId(1, &id);        sid->ses_nid   = id.nid;        sid->ses_stamp = cfs_time_current();}extern srpc_service_t lstcon_acceptor_service;intlstcon_session_new(char *name, int key,                   int timeout,int force, lst_sid_t *sid_up){        int     rc = 0;        int     i;        if (console_session.ses_state != LST_SESSION_NONE) {                /* session exists */                if (!force) {                        CERROR("Session %s already exists\n",                               console_session.ses_name);                        return -EEXIST;                }                rc = lstcon_session_end();                /* lstcon_session_end() only return local error */                if  (rc != 0)                        return rc;        }        for (i = 0; i < LST_GLOBAL_HASHSIZE; i++) {                LASSERT (list_empty(&console_session.ses_ndl_hash[i]));        }        rc = lstcon_batch_add(LST_DEFAULT_BATCH);        if (rc != 0)                return rc;        rc = lstcon_rpc_pinger_start();        if (rc != 0) {                lstcon_batch_t *bat;                lstcon_batch_find(LST_DEFAULT_BATCH, &bat);                lstcon_batch_destroy(bat);                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)                return rc;        lstcon_session_end();        return -EFAULT;}intlstcon_session_info(lst_sid_t *sid_up, int *key_up,                    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;        LIBCFS_ALLOC(entp, sizeof(*entp));        if (entp == NULL)                return -ENOMEM;        memset(entp, 0, sizeof(*entp));        list_for_each_entry(ndl, &console_session.ses_ndl_list, 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))                rc = -EFAULT;        LIBCFS_FREE(entp, sizeof(*entp));        return rc;}intlstcon_session_end(){        lstcon_rpc_trans_t *trans;        lstcon_group_t     *grp;        lstcon_batch_t     *bat;        int                 rc = 0;        LASSERT (console_session.ses_state == LST_SESSION_ACTIVE);        rc = lstcon_rpc_trans_ndlist(&console_session.ses_ndl_list,                                      NULL, LST_TRANS_SESEND, NULL,                                     lstcon_sesrpc_condition, &trans);        if (rc != 0) {                CERROR("Can't create transaction: %d\n", rc);                return rc;        }        console_session.ses_shutdown = 1;        lstcon_rpc_pinger_stop();        lstcon_rpc_trans_postwait(trans, LST_TRANS_TIMEOUT);        lstcon_rpc_trans_destroy(trans);        /* User can do nothing even rpc failed, so go on */        /* waiting for orphan rpcs to die */        lstcon_rpc_cleanup_wait();        console_session.ses_id    = LST_INVALID_SID;        console_session.ses_state = LST_SESSION_NONE;        console_session.ses_key   = 0;        console_session.ses_force = 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);                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);                LASSERT (grp->grp_ref == 1);                lstcon_group_put(grp);        }        /* all nodes should be released */        LASSERT (list_empty(&console_session.ses_ndl_list));        console_session.ses_shutdown = 0;        console_session.ses_expired  = 0;        return rc;}static intlstcon_acceptor_handle (srpc_server_rpc_t *rpc){        srpc_msg_t        *rep  = &rpc->srpc_replymsg;        srpc_msg_t        *req  = &rpc->srpc_reqstbuf->buf_msg;        srpc_join_reqst_t *jreq = &req->msg_body.join_reqst;        srpc_join_reply_t *jrep = &rep->msg_body.join_reply;        lstcon_group_t    *grp  = NULL;        lstcon_ndlink_t   *ndl;        int                rc   = 0;        sfw_unpack_message(req);        mutex_down(&console_session.ses_mutex);        jrep->join_sid = console_session.ses_id;        if (console_session.ses_id.ses_nid == LNET_NID_ANY) {                jrep->join_status = ESRCH;                goto out;        }        if (jreq->join_sid.ses_nid != LNET_NID_ANY &&             !lstcon_session_match(jreq->join_sid)) {                jrep->join_status = EBUSY;                goto out;        }        if (lstcon_group_find(jreq->join_group, &grp) != 0) {                rc = lstcon_group_alloc(jreq->join_group, &grp);                if (rc != 0) {                        CERROR("Out of memory\n");                        goto out;                }                list_add_tail(&grp->grp_link,                              &console_session.ses_grp_list);                lstcon_group_addref(grp);        }        if (grp->grp_ref > 2) {                /* Group in using */                jrep->join_status = EBUSY;                goto out;        }        rc = lstcon_group_ndlink_find(grp, rpc->srpc_peer, &ndl, 0);        if (rc == 0) {                jrep->join_status = EEXIST;                goto out;        }        rc = lstcon_group_ndlink_find(grp, rpc->srpc_peer, &ndl, 1);        if (rc != 0) {                CERROR("Out of memory\n");                goto out;        }        ndl->ndl_node->nd_state   = LST_NODE_ACTIVE;        ndl->ndl_node->nd_timeout = console_session.ses_timeout;        if (grp->grp_userland == 0)                grp->grp_userland = 1;        strcpy(jrep->join_session, console_session.ses_name);        jrep->join_timeout = console_session.ses_timeout;        jrep->join_status  = 0;out:        if (grp != NULL)                lstcon_group_put(grp);        mutex_up(&console_session.ses_mutex);        return rc;}srpc_service_t lstcon_acceptor_service ={        .sv_name        = "join session",        .sv_handler     = lstcon_acceptor_handle,        .sv_bulk_ready  = NULL,        .sv_id          = SRPC_SERVICE_JOIN,        .sv_concur      = SFW_SERVICE_CONCURRENCY,};extern int lstcon_ioctl_entry(unsigned int cmd, struct libcfs_ioctl_data *data);DECLARE_IOCTL_HANDLER(lstcon_ioctl_handler, lstcon_ioctl_entry);/* initialize console */intlstcon_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();           init_mutex(&console_session.ses_mutex);        CFS_INIT_LIST_HEAD(&console_session.ses_ndl_list);        CFS_INIT_LIST_HEAD(&console_session.ses_grp_list);        CFS_INIT_LIST_HEAD(&console_session.ses_bat_list);        CFS_INIT_LIST_HEAD(&console_session.ses_trans_list);        LIBCFS_ALLOC(console_session.ses_ndl_hash,                     sizeof(struct list_head) * 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]);        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);                return rc;        }        n = srpc_service_add_buffers(&lstcon_acceptor_service, SFW_POST_BUFFERS);        if (n != SFW_POST_BUFFERS) {                rc = -ENOMEM;                goto out;        }        rc = libcfs_register_ioctl(&lstcon_ioctl_handler);        if (rc == 0) {                lstcon_rpc_module_init();                return 0;        }out:        srpc_shutdown_service(&lstcon_acceptor_service);        srpc_remove_service(&lstcon_acceptor_service);        LIBCFS_FREE(console_session.ses_ndl_hash,                    sizeof(struct list_head) * LST_GLOBAL_HASHSIZE);        srpc_wait_service_shutdown(&lstcon_acceptor_service);        return rc;}intlstcon_console_fini(void){        int     i;        mutex_down(&console_session.ses_mutex);        libcfs_deregister_ioctl(&lstcon_ioctl_handler);        srpc_shutdown_service(&lstcon_acceptor_service);        srpc_remove_service(&lstcon_acceptor_service);        if (console_session.ses_state != LST_SESSION_NONE)                 lstcon_session_end();        lstcon_rpc_module_fini();        mutex_up(&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));        for (i = 0; i < LST_NODE_HASHSIZE; i++) {                LASSERT (list_empty(&console_session.ses_ndl_hash[i]));        }        LIBCFS_FREE(console_session.ses_ndl_hash,                    sizeof(struct list_head) * LST_GLOBAL_HASHSIZE);        srpc_wait_service_shutdown(&lstcon_acceptor_service);        return 0;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -