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.
30 * Copyright (c) 2012, Intel Corporation.
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
36 * lnet/selftest/conctl.c
38 * IOC handle in kernel
40 * Author: Liang Zhen <liangzhen@clusterfs.com>
44 #include <libcfs/libcfs.h>
45 #include <lnet/lib-lnet.h>
46 #include <lnet/lnetst.h>
50 lst_session_new_ioctl(lstio_session_new_args_t *args)
55 if (args->lstio_ses_idp == NULL || /* address for output sid */
56 args->lstio_ses_key == 0 || /* no key is specified */
57 args->lstio_ses_namep == NULL || /* session name */
58 args->lstio_ses_nmlen <= 0 ||
59 args->lstio_ses_nmlen > LST_NAME_SIZE)
62 LIBCFS_ALLOC(name, args->lstio_ses_nmlen + 1);
66 if (copy_from_user(name, args->lstio_ses_namep,
67 args->lstio_ses_nmlen)) {
68 LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
72 name[args->lstio_ses_nmlen] = 0;
74 rc = lstcon_session_new(name,
76 args->lstio_ses_feats,
77 args->lstio_ses_force,
78 args->lstio_ses_timeout,
81 LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
86 lst_session_end_ioctl(lstio_session_end_args_t *args)
88 if (args->lstio_ses_key != console_session.ses_key)
91 return lstcon_session_end();
95 lst_session_info_ioctl(lstio_session_info_args_t *args)
97 /* no checking of key */
99 if (args->lstio_ses_idp == NULL || /* address for ouput sid */
100 args->lstio_ses_keyp == NULL || /* address for ouput key */
101 args->lstio_ses_featp == NULL || /* address for ouput features */
102 args->lstio_ses_ndinfo == NULL || /* address for output ndinfo */
103 args->lstio_ses_namep == NULL || /* address for ouput name */
104 args->lstio_ses_nmlen <= 0 ||
105 args->lstio_ses_nmlen > LST_NAME_SIZE)
108 return lstcon_session_info(args->lstio_ses_idp,
109 args->lstio_ses_keyp,
110 args->lstio_ses_featp,
111 args->lstio_ses_ndinfo,
112 args->lstio_ses_namep,
113 args->lstio_ses_nmlen);
117 lst_debug_ioctl(lstio_debug_args_t *args)
123 if (args->lstio_dbg_key != console_session.ses_key)
126 if (args->lstio_dbg_resultp == NULL)
129 if (args->lstio_dbg_namep != NULL && /* name of batch/group */
130 (args->lstio_dbg_nmlen <= 0 ||
131 args->lstio_dbg_nmlen > LST_NAME_SIZE))
134 if (args->lstio_dbg_namep != NULL) {
135 LIBCFS_ALLOC(name, args->lstio_dbg_nmlen + 1);
139 if (copy_from_user(name, args->lstio_dbg_namep,
140 args->lstio_dbg_nmlen)) {
141 LIBCFS_FREE(name, args->lstio_dbg_nmlen + 1);
146 name[args->lstio_dbg_nmlen] = 0;
151 switch (args->lstio_dbg_type) {
152 case LST_OPC_SESSION:
153 rc = lstcon_session_debug(args->lstio_dbg_timeout,
154 args->lstio_dbg_resultp);
157 case LST_OPC_BATCHSRV:
159 case LST_OPC_BATCHCLI:
163 rc = lstcon_batch_debug(args->lstio_dbg_timeout,
164 name, client, args->lstio_dbg_resultp);
171 rc = lstcon_group_debug(args->lstio_dbg_timeout,
172 name, args->lstio_dbg_resultp);
176 if (args->lstio_dbg_count <= 0 ||
177 args->lstio_dbg_idsp == NULL)
180 rc = lstcon_nodes_debug(args->lstio_dbg_timeout,
181 args->lstio_dbg_count,
182 args->lstio_dbg_idsp,
183 args->lstio_dbg_resultp);
192 LIBCFS_FREE(name, args->lstio_dbg_nmlen + 1);
198 lst_group_add_ioctl(lstio_group_add_args_t *args)
203 if (args->lstio_grp_key != console_session.ses_key)
206 if (args->lstio_grp_namep == NULL||
207 args->lstio_grp_nmlen <= 0 ||
208 args->lstio_grp_nmlen > LST_NAME_SIZE)
211 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
215 if (copy_from_user(name, 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 (copy_from_user(name, args->lstio_grp_namep,
249 args->lstio_grp_nmlen)) {
250 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
254 name[args->lstio_grp_nmlen] = 0;
256 rc = lstcon_group_del(name);
258 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
264 lst_group_update_ioctl(lstio_group_update_args_t *args)
269 if (args->lstio_grp_key != console_session.ses_key)
272 if (args->lstio_grp_resultp == NULL ||
273 args->lstio_grp_namep == NULL ||
274 args->lstio_grp_nmlen <= 0 ||
275 args->lstio_grp_nmlen > LST_NAME_SIZE)
278 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
282 if (copy_from_user(name, args->lstio_grp_namep,
283 args->lstio_grp_nmlen)) {
284 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
288 name[args->lstio_grp_nmlen] = 0;
290 switch (args->lstio_grp_opc) {
291 case LST_GROUP_CLEAN:
292 rc = lstcon_group_clean(name, args->lstio_grp_args);
295 case LST_GROUP_REFRESH:
296 rc = lstcon_group_refresh(name, args->lstio_grp_resultp);
300 if (args->lstio_grp_count <= 0 ||
301 args->lstio_grp_idsp == NULL) {
305 rc = lstcon_nodes_remove(name, args->lstio_grp_count,
306 args->lstio_grp_idsp,
307 args->lstio_grp_resultp);
315 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
321 lst_nodes_add_ioctl(lstio_group_nodes_args_t *args)
327 if (args->lstio_grp_key != console_session.ses_key)
330 if (args->lstio_grp_idsp == NULL || /* array of ids */
331 args->lstio_grp_count <= 0 ||
332 args->lstio_grp_resultp == NULL ||
333 args->lstio_grp_featp == NULL ||
334 args->lstio_grp_namep == NULL ||
335 args->lstio_grp_nmlen <= 0 ||
336 args->lstio_grp_nmlen > LST_NAME_SIZE)
339 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
343 if (copy_from_user(name, args->lstio_grp_namep,
344 args->lstio_grp_nmlen)) {
345 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
350 name[args->lstio_grp_nmlen] = 0;
352 rc = lstcon_nodes_add(name, args->lstio_grp_count,
353 args->lstio_grp_idsp, &feats,
354 args->lstio_grp_resultp);
356 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
358 copy_to_user(args->lstio_grp_featp, &feats, sizeof(feats))) {
366 lst_group_list_ioctl(lstio_group_list_args_t *args)
368 if (args->lstio_grp_key != console_session.ses_key)
371 if (args->lstio_grp_idx < 0 ||
372 args->lstio_grp_namep == NULL ||
373 args->lstio_grp_nmlen <= 0 ||
374 args->lstio_grp_nmlen > LST_NAME_SIZE)
377 return lstcon_group_list(args->lstio_grp_idx,
378 args->lstio_grp_nmlen,
379 args->lstio_grp_namep);
383 lst_group_info_ioctl(lstio_group_info_args_t *args)
390 if (args->lstio_grp_key != console_session.ses_key)
393 if (args->lstio_grp_namep == NULL ||
394 args->lstio_grp_nmlen <= 0 ||
395 args->lstio_grp_nmlen > LST_NAME_SIZE)
398 if (args->lstio_grp_entp == NULL && /* output: group entry */
399 args->lstio_grp_dentsp == NULL) /* output: node entry */
402 if (args->lstio_grp_dentsp != NULL) { /* have node entry */
403 if (args->lstio_grp_idxp == NULL || /* node index */
404 args->lstio_grp_ndentp == NULL) /* # of node entry */
407 if (copy_from_user(&ndent, args->lstio_grp_ndentp,
409 copy_from_user(&index, args->lstio_grp_idxp,
413 if (ndent <= 0 || index < 0)
417 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
421 if (copy_from_user(name, args->lstio_grp_namep,
422 args->lstio_grp_nmlen)) {
423 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
427 name[args->lstio_grp_nmlen] = 0;
429 rc = lstcon_group_info(name, args->lstio_grp_entp,
430 &index, &ndent, args->lstio_grp_dentsp);
432 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
437 if (args->lstio_grp_dentsp != NULL &&
438 (copy_to_user(args->lstio_grp_idxp, &index, sizeof(index)) ||
439 copy_to_user(args->lstio_grp_ndentp, &ndent, sizeof(ndent))))
446 lst_batch_add_ioctl(lstio_batch_add_args_t *args)
451 if (args->lstio_bat_key != console_session.ses_key)
454 if (args->lstio_bat_namep == NULL ||
455 args->lstio_bat_nmlen <= 0 ||
456 args->lstio_bat_nmlen > LST_NAME_SIZE)
459 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
463 if (copy_from_user(name, args->lstio_bat_namep,
464 args->lstio_bat_nmlen)) {
465 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
469 name[args->lstio_bat_nmlen] = 0;
471 rc = lstcon_batch_add(name);
473 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
479 lst_batch_run_ioctl(lstio_batch_run_args_t *args)
484 if (args->lstio_bat_key != console_session.ses_key)
487 if (args->lstio_bat_namep == NULL ||
488 args->lstio_bat_nmlen <= 0 ||
489 args->lstio_bat_nmlen > LST_NAME_SIZE)
492 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
496 if (copy_from_user(name, args->lstio_bat_namep,
497 args->lstio_bat_nmlen)) {
498 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
502 name[args->lstio_bat_nmlen] = 0;
504 rc = lstcon_batch_run(name, args->lstio_bat_timeout,
505 args->lstio_bat_resultp);
507 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
513 lst_batch_stop_ioctl(lstio_batch_stop_args_t *args)
518 if (args->lstio_bat_key != console_session.ses_key)
521 if (args->lstio_bat_resultp == NULL ||
522 args->lstio_bat_namep == NULL ||
523 args->lstio_bat_nmlen <= 0 ||
524 args->lstio_bat_nmlen > LST_NAME_SIZE)
527 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
531 if (copy_from_user(name, args->lstio_bat_namep,
532 args->lstio_bat_nmlen)) {
533 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
537 name[args->lstio_bat_nmlen] = 0;
539 rc = lstcon_batch_stop(name, args->lstio_bat_force,
540 args->lstio_bat_resultp);
542 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
548 lst_batch_query_ioctl(lstio_batch_query_args_t *args)
553 if (args->lstio_bat_key != console_session.ses_key)
556 if (args->lstio_bat_resultp == NULL ||
557 args->lstio_bat_namep == NULL ||
558 args->lstio_bat_nmlen <= 0 ||
559 args->lstio_bat_nmlen > LST_NAME_SIZE)
562 if (args->lstio_bat_testidx < 0)
565 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
569 if (copy_from_user(name, args->lstio_bat_namep,
570 args->lstio_bat_nmlen)) {
571 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
575 name[args->lstio_bat_nmlen] = 0;
577 rc = lstcon_test_batch_query(name,
578 args->lstio_bat_testidx,
579 args->lstio_bat_client,
580 args->lstio_bat_timeout,
581 args->lstio_bat_resultp);
583 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
589 lst_batch_list_ioctl(lstio_batch_list_args_t *args)
591 if (args->lstio_bat_key != console_session.ses_key)
594 if (args->lstio_bat_idx < 0 ||
595 args->lstio_bat_namep == NULL ||
596 args->lstio_bat_nmlen <= 0 ||
597 args->lstio_bat_nmlen > LST_NAME_SIZE)
600 return lstcon_batch_list(args->lstio_bat_idx,
601 args->lstio_bat_nmlen,
602 args->lstio_bat_namep);
606 lst_batch_info_ioctl(lstio_batch_info_args_t *args)
613 if (args->lstio_bat_key != console_session.ses_key)
616 if (args->lstio_bat_namep == NULL || /* batch name */
617 args->lstio_bat_nmlen <= 0 ||
618 args->lstio_bat_nmlen > LST_NAME_SIZE)
621 if (args->lstio_bat_entp == NULL && /* output: batch entry */
622 args->lstio_bat_dentsp == NULL) /* output: node entry */
625 if (args->lstio_bat_dentsp != NULL) { /* have node entry */
626 if (args->lstio_bat_idxp == NULL || /* node index */
627 args->lstio_bat_ndentp == NULL) /* # of node entry */
630 if (copy_from_user(&index, args->lstio_bat_idxp,
632 copy_from_user(&ndent, args->lstio_bat_ndentp,
636 if (ndent <= 0 || index < 0)
640 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
644 if (copy_from_user(name, args->lstio_bat_namep,
645 args->lstio_bat_nmlen)) {
646 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
650 name[args->lstio_bat_nmlen] = 0;
652 rc = lstcon_batch_info(name,
653 args->lstio_bat_entp, args->lstio_bat_server,
654 args->lstio_bat_testidx, &index, &ndent,
655 args->lstio_bat_dentsp);
657 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
662 if (args->lstio_bat_dentsp != NULL &&
663 (copy_to_user(args->lstio_bat_idxp, &index, sizeof(index)) ||
664 copy_to_user(args->lstio_bat_ndentp, &ndent, sizeof(ndent))))
671 lst_stat_query_ioctl(lstio_stat_args_t *args)
676 /* TODO: not finished */
677 if (args->lstio_sta_key != console_session.ses_key)
680 if (args->lstio_sta_resultp == NULL)
683 if (args->lstio_sta_idsp != NULL) {
684 if (args->lstio_sta_count <= 0)
687 rc = lstcon_nodes_stat(args->lstio_sta_count,
688 args->lstio_sta_idsp,
689 args->lstio_sta_timeout,
690 args->lstio_sta_resultp);
691 } else if (args->lstio_sta_namep != NULL) {
692 if (args->lstio_sta_nmlen <= 0 ||
693 args->lstio_sta_nmlen > LST_NAME_SIZE)
696 LIBCFS_ALLOC(name, args->lstio_sta_nmlen + 1);
700 rc = copy_from_user(name, args->lstio_sta_namep,
701 args->lstio_sta_nmlen);
703 rc = lstcon_group_stat(name, args->lstio_sta_timeout,
704 args->lstio_sta_resultp);
713 LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
717 int lst_test_add_ioctl(lstio_test_args_t *args)
720 char *src_name = NULL;
721 char *dst_name = NULL;
726 if (args->lstio_tes_resultp == NULL ||
727 args->lstio_tes_retp == NULL ||
728 args->lstio_tes_bat_name == NULL || /* no specified batch */
729 args->lstio_tes_bat_nmlen <= 0 ||
730 args->lstio_tes_bat_nmlen > LST_NAME_SIZE ||
731 args->lstio_tes_sgrp_name == NULL || /* no source group */
732 args->lstio_tes_sgrp_nmlen <= 0 ||
733 args->lstio_tes_sgrp_nmlen > LST_NAME_SIZE ||
734 args->lstio_tes_dgrp_name == NULL || /* no target group */
735 args->lstio_tes_dgrp_nmlen <= 0 ||
736 args->lstio_tes_dgrp_nmlen > LST_NAME_SIZE)
739 if (args->lstio_tes_loop == 0 || /* negative is infinite */
740 args->lstio_tes_concur <= 0 ||
741 args->lstio_tes_dist <= 0 ||
742 args->lstio_tes_span <= 0)
745 /* have parameter, check if parameter length is valid */
746 if (args->lstio_tes_param != NULL &&
747 (args->lstio_tes_param_len <= 0 ||
748 args->lstio_tes_param_len >
749 PAGE_CACHE_SIZE - sizeof(lstcon_test_t)))
752 LIBCFS_ALLOC(batch_name, args->lstio_tes_bat_nmlen + 1);
753 if (batch_name == NULL)
756 LIBCFS_ALLOC(src_name, args->lstio_tes_sgrp_nmlen + 1);
757 if (src_name == NULL)
760 LIBCFS_ALLOC(dst_name, args->lstio_tes_dgrp_nmlen + 1);
761 if (dst_name == NULL)
764 if (args->lstio_tes_param != NULL) {
765 LIBCFS_ALLOC(param, args->lstio_tes_param_len);
768 if (copy_from_user(param, args->lstio_tes_param,
769 args->lstio_tes_param_len)) {
776 if (copy_from_user(batch_name, args->lstio_tes_bat_name,
777 args->lstio_tes_bat_nmlen) ||
778 copy_from_user(src_name, args->lstio_tes_sgrp_name,
779 args->lstio_tes_sgrp_nmlen) ||
780 copy_from_user(dst_name, args->lstio_tes_dgrp_name,
781 args->lstio_tes_dgrp_nmlen))
784 rc = lstcon_test_add(batch_name,
785 args->lstio_tes_type,
786 args->lstio_tes_loop,
787 args->lstio_tes_concur,
788 args->lstio_tes_dist, args->lstio_tes_span,
789 src_name, dst_name, param,
790 args->lstio_tes_param_len,
791 &ret, args->lstio_tes_resultp);
794 rc = (copy_to_user(args->lstio_tes_retp, &ret,
795 sizeof(ret))) ? -EFAULT : 0;
797 if (batch_name != NULL)
798 LIBCFS_FREE(batch_name, args->lstio_tes_bat_nmlen + 1);
800 if (src_name != NULL)
801 LIBCFS_FREE(src_name, args->lstio_tes_sgrp_nmlen + 1);
803 if (dst_name != NULL)
804 LIBCFS_FREE(dst_name, args->lstio_tes_dgrp_nmlen + 1);
807 LIBCFS_FREE(param, args->lstio_tes_param_len);
813 lstcon_ioctl_entry(unsigned int cmd, struct libcfs_ioctl_hdr *hdr)
816 struct libcfs_ioctl_data *data;
820 if (cmd != IOC_LIBCFS_LNETST)
823 data = container_of(hdr, struct libcfs_ioctl_data, ioc_hdr);
825 opc = data->ioc_u32[0];
827 if (data->ioc_plen1 > PAGE_CACHE_SIZE)
830 LIBCFS_ALLOC(buf, data->ioc_plen1);
834 /* copy in parameter */
835 if (copy_from_user(buf, data->ioc_pbuf1, data->ioc_plen1)) {
836 LIBCFS_FREE(buf, data->ioc_plen1);
840 mutex_lock(&console_session.ses_mutex);
842 console_session.ses_laststamp = cfs_time_current_sec();
844 if (console_session.ses_shutdown) {
849 if (console_session.ses_expired)
850 lstcon_session_end();
852 if (opc != LSTIO_SESSION_NEW &&
853 console_session.ses_state == LST_SESSION_NONE) {
854 CDEBUG(D_NET, "LST no active session\n");
859 memset(&console_session.ses_trans_stat, 0, sizeof(lstcon_trans_stat_t));
862 case LSTIO_SESSION_NEW:
863 rc = lst_session_new_ioctl((lstio_session_new_args_t *)buf);
865 case LSTIO_SESSION_END:
866 rc = lst_session_end_ioctl((lstio_session_end_args_t *)buf);
868 case LSTIO_SESSION_INFO:
869 rc = lst_session_info_ioctl((lstio_session_info_args_t *)buf);
872 rc = lst_debug_ioctl((lstio_debug_args_t *)buf);
874 case LSTIO_GROUP_ADD:
875 rc = lst_group_add_ioctl((lstio_group_add_args_t *)buf);
877 case LSTIO_GROUP_DEL:
878 rc = lst_group_del_ioctl((lstio_group_del_args_t *)buf);
880 case LSTIO_GROUP_UPDATE:
881 rc = lst_group_update_ioctl((lstio_group_update_args_t *)buf);
883 case LSTIO_NODES_ADD:
884 rc = lst_nodes_add_ioctl((lstio_group_nodes_args_t *)buf);
886 case LSTIO_GROUP_LIST:
887 rc = lst_group_list_ioctl((lstio_group_list_args_t *)buf);
889 case LSTIO_GROUP_INFO:
890 rc = lst_group_info_ioctl((lstio_group_info_args_t *)buf);
892 case LSTIO_BATCH_ADD:
893 rc = lst_batch_add_ioctl((lstio_batch_add_args_t *)buf);
895 case LSTIO_BATCH_START:
896 rc = lst_batch_run_ioctl((lstio_batch_run_args_t *)buf);
898 case LSTIO_BATCH_STOP:
899 rc = lst_batch_stop_ioctl((lstio_batch_stop_args_t *)buf);
901 case LSTIO_BATCH_QUERY:
902 rc = lst_batch_query_ioctl((lstio_batch_query_args_t *)buf);
904 case LSTIO_BATCH_LIST:
905 rc = lst_batch_list_ioctl((lstio_batch_list_args_t *)buf);
907 case LSTIO_BATCH_INFO:
908 rc = lst_batch_info_ioctl((lstio_batch_info_args_t *)buf);
911 rc = lst_test_add_ioctl((lstio_test_args_t *)buf);
913 case LSTIO_STAT_QUERY:
914 rc = lst_stat_query_ioctl((lstio_stat_args_t *)buf);
920 if (copy_to_user(data->ioc_pbuf2, &console_session.ses_trans_stat,
921 sizeof(lstcon_trans_stat_t)))
924 mutex_unlock(&console_session.ses_mutex);
926 LIBCFS_FREE(buf, data->ioc_plen1);
931 EXPORT_SYMBOL(lstcon_ioctl_entry);