1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
6 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 only,
10 * as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License version 2 for more details (a copy is included
16 * in the LICENSE file that accompanied this code).
18 * You should have received a copy of the GNU General Public License
19 * version 2 along with this program; If not, see
20 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
22 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23 * CA 95054 USA or visit www.sun.com if you need additional information or
29 * Copyright 2008 Sun Microsystems, Inc. All rights reserved
30 * Use is subject to license terms.
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 (cfs_copy_from_user(name,
67 args->lstio_ses_namep,
68 args->lstio_ses_nmlen)) {
69 LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
73 name[args->lstio_ses_nmlen] = 0;
75 rc = lstcon_session_new(name,
77 args->lstio_ses_timeout,
78 args->lstio_ses_force,
81 LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
87 lst_session_end_ioctl(lstio_session_end_args_t *args)
89 if (args->lstio_ses_key != console_session.ses_key)
92 return lstcon_session_end();
96 lst_session_info_ioctl(lstio_session_info_args_t *args)
98 /* no checking of key */
100 if (args->lstio_ses_idp == NULL || /* address for ouput sid */
101 args->lstio_ses_keyp == NULL || /* address for ouput key */
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_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)
328 if (args->lstio_grp_key != console_session.ses_key)
331 if (args->lstio_grp_idsp == NULL || /* array of ids */
332 args->lstio_grp_count <= 0 ||
333 args->lstio_grp_resultp == 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 (cfs_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,
354 args->lstio_grp_resultp);
356 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
362 lst_group_list_ioctl(lstio_group_list_args_t *args)
364 if (args->lstio_grp_key != console_session.ses_key)
367 if (args->lstio_grp_idx < 0 ||
368 args->lstio_grp_namep == NULL ||
369 args->lstio_grp_nmlen <= 0 ||
370 args->lstio_grp_nmlen > LST_NAME_SIZE)
373 return lstcon_group_list(args->lstio_grp_idx,
374 args->lstio_grp_nmlen,
375 args->lstio_grp_namep);
379 lst_group_info_ioctl(lstio_group_info_args_t *args)
386 if (args->lstio_grp_key != console_session.ses_key)
389 if (args->lstio_grp_namep == NULL ||
390 args->lstio_grp_nmlen <= 0 ||
391 args->lstio_grp_nmlen > LST_NAME_SIZE)
394 if (args->lstio_grp_entp == NULL && /* output: group entry */
395 args->lstio_grp_dentsp == NULL) /* output: node entry */
398 if (args->lstio_grp_dentsp != NULL) { /* have node entry */
399 if (args->lstio_grp_idxp == NULL || /* node index */
400 args->lstio_grp_ndentp == NULL) /* # of node entry */
403 if (cfs_copy_from_user(&ndent, args->lstio_grp_ndentp,
405 cfs_copy_from_user(&index, args->lstio_grp_idxp,
409 if (ndent <= 0 || index < 0)
413 LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
417 if (cfs_copy_from_user(name,
418 args->lstio_grp_namep,
419 args->lstio_grp_nmlen)) {
420 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
424 name[args->lstio_grp_nmlen] = 0;
426 rc = lstcon_group_info(name, args->lstio_grp_entp,
427 &index, &ndent, args->lstio_grp_dentsp);
429 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
434 if (args->lstio_grp_dentsp != NULL &&
435 (cfs_copy_to_user(args->lstio_grp_idxp, &index, sizeof(index)) ||
436 cfs_copy_to_user(args->lstio_grp_ndentp, &ndent, sizeof(ndent))))
443 lst_batch_add_ioctl(lstio_batch_add_args_t *args)
448 if (args->lstio_bat_key != console_session.ses_key)
451 if (args->lstio_bat_namep == NULL ||
452 args->lstio_bat_nmlen <= 0 ||
453 args->lstio_bat_nmlen > LST_NAME_SIZE)
456 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
460 if (cfs_copy_from_user(name,
461 args->lstio_bat_namep,
462 args->lstio_bat_nmlen)) {
463 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
467 name[args->lstio_bat_nmlen] = 0;
469 rc = lstcon_batch_add(name);
471 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
477 lst_batch_run_ioctl(lstio_batch_run_args_t *args)
482 if (args->lstio_bat_key != console_session.ses_key)
485 if (args->lstio_bat_namep == NULL ||
486 args->lstio_bat_nmlen <= 0 ||
487 args->lstio_bat_nmlen > LST_NAME_SIZE)
490 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
494 if (cfs_copy_from_user(name,
495 args->lstio_bat_namep,
496 args->lstio_bat_nmlen)) {
497 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
501 name[args->lstio_bat_nmlen] = 0;
503 rc = lstcon_batch_run(name, args->lstio_bat_timeout,
504 args->lstio_bat_resultp);
506 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
512 lst_batch_stop_ioctl(lstio_batch_stop_args_t *args)
517 if (args->lstio_bat_key != console_session.ses_key)
520 if (args->lstio_bat_resultp == NULL ||
521 args->lstio_bat_namep == NULL ||
522 args->lstio_bat_nmlen <= 0 ||
523 args->lstio_bat_nmlen > LST_NAME_SIZE)
526 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
530 if (cfs_copy_from_user(name,
531 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 (cfs_copy_from_user(name,
570 args->lstio_bat_namep,
571 args->lstio_bat_nmlen)) {
572 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
576 name[args->lstio_bat_nmlen] = 0;
578 rc = lstcon_test_batch_query(name,
579 args->lstio_bat_testidx,
580 args->lstio_bat_client,
581 args->lstio_bat_timeout,
582 args->lstio_bat_resultp);
584 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
590 lst_batch_list_ioctl(lstio_batch_list_args_t *args)
592 if (args->lstio_bat_key != console_session.ses_key)
595 if (args->lstio_bat_idx < 0 ||
596 args->lstio_bat_namep == NULL ||
597 args->lstio_bat_nmlen <= 0 ||
598 args->lstio_bat_nmlen > LST_NAME_SIZE)
601 return lstcon_batch_list(args->lstio_bat_idx,
602 args->lstio_bat_nmlen,
603 args->lstio_bat_namep);
607 lst_batch_info_ioctl(lstio_batch_info_args_t *args)
614 if (args->lstio_bat_key != console_session.ses_key)
617 if (args->lstio_bat_namep == NULL || /* batch name */
618 args->lstio_bat_nmlen <= 0 ||
619 args->lstio_bat_nmlen > LST_NAME_SIZE)
622 if (args->lstio_bat_entp == NULL && /* output: batch entry */
623 args->lstio_bat_dentsp == NULL) /* output: node entry */
626 if (args->lstio_bat_dentsp != NULL) { /* have node entry */
627 if (args->lstio_bat_idxp == NULL || /* node index */
628 args->lstio_bat_ndentp == NULL) /* # of node entry */
631 if (cfs_copy_from_user(&index, args->lstio_bat_idxp,
633 cfs_copy_from_user(&ndent, args->lstio_bat_ndentp,
637 if (ndent <= 0 || index < 0)
641 LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
645 if (cfs_copy_from_user(name,
646 args->lstio_bat_namep, args->lstio_bat_nmlen)) {
647 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
651 name[args->lstio_bat_nmlen] = 0;
653 rc = lstcon_batch_info(name,
654 args->lstio_bat_entp, args->lstio_bat_server,
655 args->lstio_bat_testidx, &index, &ndent,
656 args->lstio_bat_dentsp);
658 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
663 if (args->lstio_bat_dentsp != NULL &&
664 (cfs_copy_to_user(args->lstio_bat_idxp, &index, sizeof(index)) ||
665 cfs_copy_to_user(args->lstio_bat_ndentp, &ndent, sizeof(ndent))))
672 lst_stat_query_ioctl(lstio_stat_args_t *args)
677 /* TODO: not finished */
678 if (args->lstio_sta_key != console_session.ses_key)
681 if (args->lstio_sta_resultp == NULL ||
682 (args->lstio_sta_namep == NULL &&
683 args->lstio_sta_idsp == NULL) ||
684 args->lstio_sta_nmlen <= 0 ||
685 args->lstio_sta_nmlen > LST_NAME_SIZE)
688 if (args->lstio_sta_idsp != NULL &&
689 args->lstio_sta_count <= 0)
692 LIBCFS_ALLOC(name, args->lstio_sta_nmlen + 1);
696 if (cfs_copy_from_user(name, args->lstio_sta_namep,
697 args->lstio_sta_nmlen)) {
698 LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
702 if (args->lstio_sta_idsp == NULL) {
703 rc = lstcon_group_stat(name, args->lstio_sta_timeout,
704 args->lstio_sta_resultp);
706 rc = lstcon_nodes_stat(args->lstio_sta_count,
707 args->lstio_sta_idsp,
708 args->lstio_sta_timeout,
709 args->lstio_sta_resultp);
712 LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
717 int lst_test_add_ioctl(lstio_test_args_t *args)
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 /* have parameter, check if parameter length is valid */
740 if (args->lstio_tes_param != NULL &&
741 (args->lstio_tes_param_len <= 0 ||
742 args->lstio_tes_param_len > CFS_PAGE_SIZE - sizeof(lstcon_test_t)))
745 LIBCFS_ALLOC(name, args->lstio_tes_bat_nmlen + 1);
749 LIBCFS_ALLOC(srcgrp, args->lstio_tes_sgrp_nmlen + 1);
753 LIBCFS_ALLOC(dstgrp, args->lstio_tes_dgrp_nmlen + 1);
757 if (args->lstio_tes_param != NULL) {
758 LIBCFS_ALLOC(param, args->lstio_tes_param_len);
764 if (cfs_copy_from_user(name,
765 args->lstio_tes_bat_name,
766 args->lstio_tes_bat_nmlen) ||
767 cfs_copy_from_user(srcgrp,
768 args->lstio_tes_sgrp_name,
769 args->lstio_tes_sgrp_nmlen) ||
770 cfs_copy_from_user(dstgrp,
771 args->lstio_tes_dgrp_name,
772 args->lstio_tes_dgrp_nmlen) ||
773 cfs_copy_from_user(param, args->lstio_tes_param,
774 args->lstio_tes_param_len))
777 rc = lstcon_test_add(name,
778 args->lstio_tes_type,
779 args->lstio_tes_loop,
780 args->lstio_tes_concur,
781 args->lstio_tes_dist, args->lstio_tes_span,
782 srcgrp, dstgrp, param, args->lstio_tes_param_len,
783 &ret, args->lstio_tes_resultp);
786 rc = (cfs_copy_to_user(args->lstio_tes_retp, &ret,
787 sizeof(ret))) ? -EFAULT : 0;
790 LIBCFS_FREE(name, args->lstio_tes_bat_nmlen + 1);
793 LIBCFS_FREE(srcgrp, args->lstio_tes_sgrp_nmlen + 1);
796 LIBCFS_FREE(dstgrp, args->lstio_tes_dgrp_nmlen + 1);
799 LIBCFS_FREE(param, args->lstio_tes_param_len);
805 lstcon_ioctl_entry(unsigned int cmd, struct libcfs_ioctl_data *data)
808 int opc = data->ioc_u32[0];
811 if (cmd != IOC_LIBCFS_LNETST)
814 if (data->ioc_plen1 > CFS_PAGE_SIZE)
817 LIBCFS_ALLOC(buf, data->ioc_plen1);
821 /* copy in parameter */
822 if (cfs_copy_from_user(buf, data->ioc_pbuf1, data->ioc_plen1)) {
823 LIBCFS_FREE(buf, data->ioc_plen1);
827 cfs_mutex_down(&console_session.ses_mutex);
829 console_session.ses_laststamp = cfs_time_current_sec();
831 if (console_session.ses_shutdown) {
836 if (console_session.ses_expired)
837 lstcon_session_end();
839 if (opc != LSTIO_SESSION_NEW &&
840 console_session.ses_state == LST_SESSION_NONE) {
841 CDEBUG(D_NET, "LST no active session\n");
846 memset(&console_session.ses_trans_stat, 0, sizeof(lstcon_trans_stat_t));
849 case LSTIO_SESSION_NEW:
850 rc = lst_session_new_ioctl((lstio_session_new_args_t *)buf);
852 case LSTIO_SESSION_END:
853 rc = lst_session_end_ioctl((lstio_session_end_args_t *)buf);
855 case LSTIO_SESSION_INFO:
856 rc = lst_session_info_ioctl((lstio_session_info_args_t *)buf);
859 rc = lst_debug_ioctl((lstio_debug_args_t *)buf);
861 case LSTIO_GROUP_ADD:
862 rc = lst_group_add_ioctl((lstio_group_add_args_t *)buf);
864 case LSTIO_GROUP_DEL:
865 rc = lst_group_del_ioctl((lstio_group_del_args_t *)buf);
867 case LSTIO_GROUP_UPDATE:
868 rc = lst_group_update_ioctl((lstio_group_update_args_t *)buf);
870 case LSTIO_NODES_ADD:
871 rc = lst_nodes_add_ioctl((lstio_group_nodes_args_t *)buf);
873 case LSTIO_GROUP_LIST:
874 rc = lst_group_list_ioctl((lstio_group_list_args_t *)buf);
876 case LSTIO_GROUP_INFO:
877 rc = lst_group_info_ioctl((lstio_group_info_args_t *)buf);
879 case LSTIO_BATCH_ADD:
880 rc = lst_batch_add_ioctl((lstio_batch_add_args_t *)buf);
882 case LSTIO_BATCH_START:
883 rc = lst_batch_run_ioctl((lstio_batch_run_args_t *)buf);
885 case LSTIO_BATCH_STOP:
886 rc = lst_batch_stop_ioctl((lstio_batch_stop_args_t *)buf);
888 case LSTIO_BATCH_QUERY:
889 rc = lst_batch_query_ioctl((lstio_batch_query_args_t *)buf);
891 case LSTIO_BATCH_LIST:
892 rc = lst_batch_list_ioctl((lstio_batch_list_args_t *)buf);
894 case LSTIO_BATCH_INFO:
895 rc = lst_batch_info_ioctl((lstio_batch_info_args_t *)buf);
898 rc = lst_test_add_ioctl((lstio_test_args_t *)buf);
900 case LSTIO_STAT_QUERY:
901 rc = lst_stat_query_ioctl((lstio_stat_args_t *)buf);
907 if (cfs_copy_to_user(data->ioc_pbuf2, &console_session.ses_trans_stat,
908 sizeof(lstcon_trans_stat_t)))
911 cfs_mutex_up(&console_session.ses_mutex);
913 LIBCFS_FREE(buf, data->ioc_plen1);
918 EXPORT_SYMBOL(lstcon_ioctl_entry);