4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 only,
8 * as published by the Free Software Foundation.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License version 2 for more details (a copy is included
14 * in the LICENSE file that accompanied this code).
16 * You should have received a copy of the GNU General Public License
17 * version 2 along with this program; If not, see
18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21 * CA 95054 USA or visit www.sun.com if you need additional information or
27 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28 * Use is subject to license terms.
31 * This file is part of Lustre, http://www.lustre.org/
32 * Lustre is a trademark of Sun Microsystems, Inc.
34 * lnet/selftest/conctl.c
36 * IOC handle in kernel
38 * Author: Liang Zhen <liangzhen@clusterfs.com>
42 #include <libcfs/libcfs.h>
43 #include <lnet/lib-lnet.h>
44 #include <lnet/lnetst.h>
48 lst_session_new_ioctl(lstio_session_new_args_t *args)
53 if (args->lstio_ses_idp == NULL || /* address for output sid */
54 args->lstio_ses_key == 0 || /* no key is specified */
55 args->lstio_ses_namep == NULL || /* session name */
56 args->lstio_ses_nmlen <= 0 ||
57 args->lstio_ses_nmlen > LST_NAME_SIZE)
60 LIBCFS_ALLOC(name, args->lstio_ses_nmlen + 1);
64 if (cfs_copy_from_user(name,
65 args->lstio_ses_namep,
66 args->lstio_ses_nmlen)) {
67 LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
71 name[args->lstio_ses_nmlen] = 0;
73 rc = lstcon_session_new(name,
75 args->lstio_ses_feats,
76 args->lstio_ses_force,
77 args->lstio_ses_timeout,
80 LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
85 lst_session_end_ioctl(lstio_session_end_args_t *args)
87 if (args->lstio_ses_key != console_session.ses_key)
90 return lstcon_session_end();
94 lst_session_info_ioctl(lstio_session_info_args_t *args)
96 /* no checking of key */
98 if (args->lstio_ses_idp == NULL || /* address for ouput sid */
99 args->lstio_ses_keyp == NULL || /* address for ouput key */
100 args->lstio_ses_featp == NULL || /* address for ouput features */
101 args->lstio_ses_ndinfo == NULL || /* address for output ndinfo */
102 args->lstio_ses_namep == NULL || /* address for ouput name */
103 args->lstio_ses_nmlen <= 0 ||
104 args->lstio_ses_nmlen > LST_NAME_SIZE)
107 return lstcon_session_info(args->lstio_ses_idp,
108 args->lstio_ses_keyp,
109 args->lstio_ses_featp,
110 args->lstio_ses_ndinfo,
111 args->lstio_ses_namep,
112 args->lstio_ses_nmlen);
116 lst_debug_ioctl(lstio_debug_args_t *args)
122 if (args->lstio_dbg_key != console_session.ses_key)
125 if (args->lstio_dbg_resultp == NULL)
128 if (args->lstio_dbg_namep != NULL && /* name of batch/group */
129 (args->lstio_dbg_nmlen <= 0 ||
130 args->lstio_dbg_nmlen > LST_NAME_SIZE))
133 if (args->lstio_dbg_namep != NULL) {
134 LIBCFS_ALLOC(name, args->lstio_dbg_nmlen + 1);
138 if (cfs_copy_from_user(name, args->lstio_dbg_namep,
139 args->lstio_dbg_nmlen)) {
140 LIBCFS_FREE(name, args->lstio_dbg_nmlen + 1);
145 name[args->lstio_dbg_nmlen] = 0;
150 switch (args->lstio_dbg_type) {
151 case LST_OPC_SESSION:
152 rc = lstcon_session_debug(args->lstio_dbg_timeout,
153 args->lstio_dbg_resultp);
156 case LST_OPC_BATCHSRV:
158 case LST_OPC_BATCHCLI:
162 rc = lstcon_batch_debug(args->lstio_dbg_timeout,
163 name, client, args->lstio_dbg_resultp);
170 rc = lstcon_group_debug(args->lstio_dbg_timeout,
171 name, args->lstio_dbg_resultp);
175 if (args->lstio_dbg_count <= 0 ||
176 args->lstio_dbg_idsp == NULL)
179 rc = lstcon_nodes_debug(args->lstio_dbg_timeout,
180 args->lstio_dbg_count,
181 args->lstio_dbg_idsp,
182 args->lstio_dbg_resultp);
191 LIBCFS_FREE(name, args->lstio_dbg_nmlen + 1);
197 lst_group_add_ioctl(lstio_group_add_args_t *args)
202 if (args->lstio_grp_key != console_session.ses_key)
205 if (args->lstio_grp_namep == NULL||
206 args->lstio_grp_nmlen <= 0 ||
207 args->lstio_grp_nmlen > LST_NAME_SIZE)
210 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
214 if (cfs_copy_from_user(name,
215 args->lstio_grp_namep,
216 args->lstio_grp_nmlen)) {
217 LIBCFS_FREE(name, args->lstio_grp_nmlen);
221 name[args->lstio_grp_nmlen] = 0;
223 rc = lstcon_group_add(name);
225 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
231 lst_group_del_ioctl(lstio_group_del_args_t *args)
236 if (args->lstio_grp_key != console_session.ses_key)
239 if (args->lstio_grp_namep == NULL ||
240 args->lstio_grp_nmlen <= 0 ||
241 args->lstio_grp_nmlen > LST_NAME_SIZE)
244 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
248 if (cfs_copy_from_user(name,
249 args->lstio_grp_namep,
250 args->lstio_grp_nmlen)) {
251 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
255 name[args->lstio_grp_nmlen] = 0;
257 rc = lstcon_group_del(name);
259 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
265 lst_group_update_ioctl(lstio_group_update_args_t *args)
270 if (args->lstio_grp_key != console_session.ses_key)
273 if (args->lstio_grp_resultp == NULL ||
274 args->lstio_grp_namep == NULL ||
275 args->lstio_grp_nmlen <= 0 ||
276 args->lstio_grp_nmlen > LST_NAME_SIZE)
279 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
283 if (cfs_copy_from_user(name,
284 args->lstio_grp_namep,
285 args->lstio_grp_nmlen)) {
286 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
290 name[args->lstio_grp_nmlen] = 0;
292 switch (args->lstio_grp_opc) {
293 case LST_GROUP_CLEAN:
294 rc = lstcon_group_clean(name, args->lstio_grp_args);
297 case LST_GROUP_REFRESH:
298 rc = lstcon_group_refresh(name, args->lstio_grp_resultp);
302 if (args->lstio_grp_count <= 0 ||
303 args->lstio_grp_idsp == NULL) {
307 rc = lstcon_nodes_remove(name, args->lstio_grp_count,
308 args->lstio_grp_idsp,
309 args->lstio_grp_resultp);
317 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
323 lst_nodes_add_ioctl(lstio_group_nodes_args_t *args)
329 if (args->lstio_grp_key != console_session.ses_key)
332 if (args->lstio_grp_idsp == NULL || /* array of ids */
333 args->lstio_grp_count <= 0 ||
334 args->lstio_grp_resultp == NULL ||
335 args->lstio_grp_featp == NULL ||
336 args->lstio_grp_namep == NULL ||
337 args->lstio_grp_nmlen <= 0 ||
338 args->lstio_grp_nmlen > LST_NAME_SIZE)
341 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
345 if (cfs_copy_from_user(name, args->lstio_grp_namep,
346 args->lstio_grp_nmlen)) {
347 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
352 name[args->lstio_grp_nmlen] = 0;
354 rc = lstcon_nodes_add(name, args->lstio_grp_count,
355 args->lstio_grp_idsp, &feats,
356 args->lstio_grp_resultp);
358 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
360 cfs_copy_to_user(args->lstio_grp_featp, &feats, sizeof(feats))) {
368 lst_group_list_ioctl(lstio_group_list_args_t *args)
370 if (args->lstio_grp_key != console_session.ses_key)
373 if (args->lstio_grp_idx < 0 ||
374 args->lstio_grp_namep == NULL ||
375 args->lstio_grp_nmlen <= 0 ||
376 args->lstio_grp_nmlen > LST_NAME_SIZE)
379 return lstcon_group_list(args->lstio_grp_idx,
380 args->lstio_grp_nmlen,
381 args->lstio_grp_namep);
385 lst_group_info_ioctl(lstio_group_info_args_t *args)
392 if (args->lstio_grp_key != console_session.ses_key)
395 if (args->lstio_grp_namep == NULL ||
396 args->lstio_grp_nmlen <= 0 ||
397 args->lstio_grp_nmlen > LST_NAME_SIZE)
400 if (args->lstio_grp_entp == NULL && /* output: group entry */
401 args->lstio_grp_dentsp == NULL) /* output: node entry */
404 if (args->lstio_grp_dentsp != NULL) { /* have node entry */
405 if (args->lstio_grp_idxp == NULL || /* node index */
406 args->lstio_grp_ndentp == NULL) /* # of node entry */
409 if (cfs_copy_from_user(&ndent, args->lstio_grp_ndentp,
411 cfs_copy_from_user(&index, args->lstio_grp_idxp,
415 if (ndent <= 0 || index < 0)
419 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
423 if (cfs_copy_from_user(name,
424 args->lstio_grp_namep,
425 args->lstio_grp_nmlen)) {
426 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
430 name[args->lstio_grp_nmlen] = 0;
432 rc = lstcon_group_info(name, args->lstio_grp_entp,
433 &index, &ndent, args->lstio_grp_dentsp);
435 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
440 if (args->lstio_grp_dentsp != NULL &&
441 (cfs_copy_to_user(args->lstio_grp_idxp, &index, sizeof(index)) ||
442 cfs_copy_to_user(args->lstio_grp_ndentp, &ndent, sizeof(ndent))))
449 lst_batch_add_ioctl(lstio_batch_add_args_t *args)
454 if (args->lstio_bat_key != console_session.ses_key)
457 if (args->lstio_bat_namep == NULL ||
458 args->lstio_bat_nmlen <= 0 ||
459 args->lstio_bat_nmlen > LST_NAME_SIZE)
462 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
466 if (cfs_copy_from_user(name,
467 args->lstio_bat_namep,
468 args->lstio_bat_nmlen)) {
469 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
473 name[args->lstio_bat_nmlen] = 0;
475 rc = lstcon_batch_add(name);
477 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
483 lst_batch_run_ioctl(lstio_batch_run_args_t *args)
488 if (args->lstio_bat_key != console_session.ses_key)
491 if (args->lstio_bat_namep == NULL ||
492 args->lstio_bat_nmlen <= 0 ||
493 args->lstio_bat_nmlen > LST_NAME_SIZE)
496 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
500 if (cfs_copy_from_user(name,
501 args->lstio_bat_namep,
502 args->lstio_bat_nmlen)) {
503 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
507 name[args->lstio_bat_nmlen] = 0;
509 rc = lstcon_batch_run(name, args->lstio_bat_timeout,
510 args->lstio_bat_resultp);
512 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
518 lst_batch_stop_ioctl(lstio_batch_stop_args_t *args)
523 if (args->lstio_bat_key != console_session.ses_key)
526 if (args->lstio_bat_resultp == NULL ||
527 args->lstio_bat_namep == NULL ||
528 args->lstio_bat_nmlen <= 0 ||
529 args->lstio_bat_nmlen > LST_NAME_SIZE)
532 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
536 if (cfs_copy_from_user(name,
537 args->lstio_bat_namep,
538 args->lstio_bat_nmlen)) {
539 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
543 name[args->lstio_bat_nmlen] = 0;
545 rc = lstcon_batch_stop(name, args->lstio_bat_force,
546 args->lstio_bat_resultp);
548 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
554 lst_batch_query_ioctl(lstio_batch_query_args_t *args)
559 if (args->lstio_bat_key != console_session.ses_key)
562 if (args->lstio_bat_resultp == NULL ||
563 args->lstio_bat_namep == NULL ||
564 args->lstio_bat_nmlen <= 0 ||
565 args->lstio_bat_nmlen > LST_NAME_SIZE)
568 if (args->lstio_bat_testidx < 0)
571 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
575 if (cfs_copy_from_user(name,
576 args->lstio_bat_namep,
577 args->lstio_bat_nmlen)) {
578 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
582 name[args->lstio_bat_nmlen] = 0;
584 rc = lstcon_test_batch_query(name,
585 args->lstio_bat_testidx,
586 args->lstio_bat_client,
587 args->lstio_bat_timeout,
588 args->lstio_bat_resultp);
590 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
596 lst_batch_list_ioctl(lstio_batch_list_args_t *args)
598 if (args->lstio_bat_key != console_session.ses_key)
601 if (args->lstio_bat_idx < 0 ||
602 args->lstio_bat_namep == NULL ||
603 args->lstio_bat_nmlen <= 0 ||
604 args->lstio_bat_nmlen > LST_NAME_SIZE)
607 return lstcon_batch_list(args->lstio_bat_idx,
608 args->lstio_bat_nmlen,
609 args->lstio_bat_namep);
613 lst_batch_info_ioctl(lstio_batch_info_args_t *args)
620 if (args->lstio_bat_key != console_session.ses_key)
623 if (args->lstio_bat_namep == NULL || /* batch name */
624 args->lstio_bat_nmlen <= 0 ||
625 args->lstio_bat_nmlen > LST_NAME_SIZE)
628 if (args->lstio_bat_entp == NULL && /* output: batch entry */
629 args->lstio_bat_dentsp == NULL) /* output: node entry */
632 if (args->lstio_bat_dentsp != NULL) { /* have node entry */
633 if (args->lstio_bat_idxp == NULL || /* node index */
634 args->lstio_bat_ndentp == NULL) /* # of node entry */
637 if (cfs_copy_from_user(&index, args->lstio_bat_idxp,
639 cfs_copy_from_user(&ndent, args->lstio_bat_ndentp,
643 if (ndent <= 0 || index < 0)
647 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
651 if (cfs_copy_from_user(name,
652 args->lstio_bat_namep, args->lstio_bat_nmlen)) {
653 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
657 name[args->lstio_bat_nmlen] = 0;
659 rc = lstcon_batch_info(name,
660 args->lstio_bat_entp, args->lstio_bat_server,
661 args->lstio_bat_testidx, &index, &ndent,
662 args->lstio_bat_dentsp);
664 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
669 if (args->lstio_bat_dentsp != NULL &&
670 (cfs_copy_to_user(args->lstio_bat_idxp, &index, sizeof(index)) ||
671 cfs_copy_to_user(args->lstio_bat_ndentp, &ndent, sizeof(ndent))))
678 lst_stat_query_ioctl(lstio_stat_args_t *args)
683 /* TODO: not finished */
684 if (args->lstio_sta_key != console_session.ses_key)
687 if (args->lstio_sta_resultp == NULL ||
688 (args->lstio_sta_namep == NULL &&
689 args->lstio_sta_idsp == NULL) ||
690 args->lstio_sta_nmlen <= 0 ||
691 args->lstio_sta_nmlen > LST_NAME_SIZE)
694 if (args->lstio_sta_idsp != NULL &&
695 args->lstio_sta_count <= 0)
698 LIBCFS_ALLOC(name, args->lstio_sta_nmlen + 1);
702 if (cfs_copy_from_user(name, args->lstio_sta_namep,
703 args->lstio_sta_nmlen)) {
704 LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
708 if (args->lstio_sta_idsp == NULL) {
709 rc = lstcon_group_stat(name, args->lstio_sta_timeout,
710 args->lstio_sta_resultp);
712 rc = lstcon_nodes_stat(args->lstio_sta_count,
713 args->lstio_sta_idsp,
714 args->lstio_sta_timeout,
715 args->lstio_sta_resultp);
718 LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
723 int lst_test_add_ioctl(lstio_test_args_t *args)
732 if (args->lstio_tes_resultp == NULL ||
733 args->lstio_tes_retp == NULL ||
734 args->lstio_tes_bat_name == NULL || /* no specified batch */
735 args->lstio_tes_bat_nmlen <= 0 ||
736 args->lstio_tes_bat_nmlen > LST_NAME_SIZE ||
737 args->lstio_tes_sgrp_name == NULL || /* no source group */
738 args->lstio_tes_sgrp_nmlen <= 0 ||
739 args->lstio_tes_sgrp_nmlen > LST_NAME_SIZE ||
740 args->lstio_tes_dgrp_name == NULL || /* no target group */
741 args->lstio_tes_dgrp_nmlen <= 0 ||
742 args->lstio_tes_dgrp_nmlen > LST_NAME_SIZE)
745 if (args->lstio_tes_loop == 0 || /* negative is infinite */
746 args->lstio_tes_concur <= 0 ||
747 args->lstio_tes_dist <= 0 ||
748 args->lstio_tes_span <= 0)
751 /* have parameter, check if parameter length is valid */
752 if (args->lstio_tes_param != NULL &&
753 (args->lstio_tes_param_len <= 0 ||
754 args->lstio_tes_param_len > CFS_PAGE_SIZE - sizeof(lstcon_test_t)))
757 LIBCFS_ALLOC(name, args->lstio_tes_bat_nmlen + 1);
761 LIBCFS_ALLOC(srcgrp, args->lstio_tes_sgrp_nmlen + 1);
765 LIBCFS_ALLOC(dstgrp, args->lstio_tes_dgrp_nmlen + 1);
769 if (args->lstio_tes_param != NULL) {
770 LIBCFS_ALLOC(param, args->lstio_tes_param_len);
776 if (cfs_copy_from_user(name,
777 args->lstio_tes_bat_name,
778 args->lstio_tes_bat_nmlen) ||
779 cfs_copy_from_user(srcgrp,
780 args->lstio_tes_sgrp_name,
781 args->lstio_tes_sgrp_nmlen) ||
782 cfs_copy_from_user(dstgrp,
783 args->lstio_tes_dgrp_name,
784 args->lstio_tes_dgrp_nmlen) ||
785 cfs_copy_from_user(param, args->lstio_tes_param,
786 args->lstio_tes_param_len))
789 rc = lstcon_test_add(name,
790 args->lstio_tes_type,
791 args->lstio_tes_loop,
792 args->lstio_tes_concur,
793 args->lstio_tes_dist, args->lstio_tes_span,
794 srcgrp, dstgrp, param, args->lstio_tes_param_len,
795 &ret, args->lstio_tes_resultp);
798 rc = (cfs_copy_to_user(args->lstio_tes_retp, &ret,
799 sizeof(ret))) ? -EFAULT : 0;
802 LIBCFS_FREE(name, args->lstio_tes_bat_nmlen + 1);
805 LIBCFS_FREE(srcgrp, args->lstio_tes_sgrp_nmlen + 1);
808 LIBCFS_FREE(dstgrp, args->lstio_tes_dgrp_nmlen + 1);
811 LIBCFS_FREE(param, args->lstio_tes_param_len);
817 lstcon_ioctl_entry(unsigned int cmd, struct libcfs_ioctl_data *data)
820 int opc = data->ioc_u32[0];
823 if (cmd != IOC_LIBCFS_LNETST)
826 if (data->ioc_plen1 > CFS_PAGE_SIZE)
829 LIBCFS_ALLOC(buf, data->ioc_plen1);
833 /* copy in parameter */
834 if (cfs_copy_from_user(buf, data->ioc_pbuf1, data->ioc_plen1)) {
835 LIBCFS_FREE(buf, data->ioc_plen1);
839 mutex_lock(&console_session.ses_mutex);
841 console_session.ses_laststamp = cfs_time_current_sec();
843 if (console_session.ses_shutdown) {
848 if (console_session.ses_expired)
849 lstcon_session_end();
851 if (opc != LSTIO_SESSION_NEW &&
852 console_session.ses_state == LST_SESSION_NONE) {
853 CDEBUG(D_NET, "LST no active session\n");
858 memset(&console_session.ses_trans_stat, 0, sizeof(lstcon_trans_stat_t));
861 case LSTIO_SESSION_NEW:
862 rc = lst_session_new_ioctl((lstio_session_new_args_t *)buf);
864 case LSTIO_SESSION_END:
865 rc = lst_session_end_ioctl((lstio_session_end_args_t *)buf);
867 case LSTIO_SESSION_INFO:
868 rc = lst_session_info_ioctl((lstio_session_info_args_t *)buf);
871 rc = lst_debug_ioctl((lstio_debug_args_t *)buf);
873 case LSTIO_GROUP_ADD:
874 rc = lst_group_add_ioctl((lstio_group_add_args_t *)buf);
876 case LSTIO_GROUP_DEL:
877 rc = lst_group_del_ioctl((lstio_group_del_args_t *)buf);
879 case LSTIO_GROUP_UPDATE:
880 rc = lst_group_update_ioctl((lstio_group_update_args_t *)buf);
882 case LSTIO_NODES_ADD:
883 rc = lst_nodes_add_ioctl((lstio_group_nodes_args_t *)buf);
885 case LSTIO_GROUP_LIST:
886 rc = lst_group_list_ioctl((lstio_group_list_args_t *)buf);
888 case LSTIO_GROUP_INFO:
889 rc = lst_group_info_ioctl((lstio_group_info_args_t *)buf);
891 case LSTIO_BATCH_ADD:
892 rc = lst_batch_add_ioctl((lstio_batch_add_args_t *)buf);
894 case LSTIO_BATCH_START:
895 rc = lst_batch_run_ioctl((lstio_batch_run_args_t *)buf);
897 case LSTIO_BATCH_STOP:
898 rc = lst_batch_stop_ioctl((lstio_batch_stop_args_t *)buf);
900 case LSTIO_BATCH_QUERY:
901 rc = lst_batch_query_ioctl((lstio_batch_query_args_t *)buf);
903 case LSTIO_BATCH_LIST:
904 rc = lst_batch_list_ioctl((lstio_batch_list_args_t *)buf);
906 case LSTIO_BATCH_INFO:
907 rc = lst_batch_info_ioctl((lstio_batch_info_args_t *)buf);
910 rc = lst_test_add_ioctl((lstio_test_args_t *)buf);
912 case LSTIO_STAT_QUERY:
913 rc = lst_stat_query_ioctl((lstio_stat_args_t *)buf);
919 if (cfs_copy_to_user(data->ioc_pbuf2, &console_session.ses_trans_stat,
920 sizeof(lstcon_trans_stat_t)))
923 mutex_unlock(&console_session.ses_mutex);
925 LIBCFS_FREE(buf, data->ioc_plen1);
930 EXPORT_SYMBOL(lstcon_ioctl_entry);