1d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/*
2d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER START
3d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
4d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
6d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is free software; you can redistribute it and/or modify
7d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * it under the terms of the GNU General Public License version 2 only,
8d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * as published by the Free Software Foundation.
9d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
10d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This program is distributed in the hope that it will be useful, but
11d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * WITHOUT ANY WARRANTY; without even the implied warranty of
12d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * General Public License version 2 for more details (a copy is included
14d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * in the LICENSE file that accompanied this code).
15d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
16d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * You should have received a copy of the GNU General Public License
17d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * version 2 along with this program; If not, see
18d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
19d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
20d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
21d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * CA 95054 USA or visit www.sun.com if you need additional information or
22d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * have any questions.
23d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
24d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * GPL HEADER END
25d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
26d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/*
27d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
28d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Use is subject to license terms.
29d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
30d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Copyright (c) 2012, Intel Corporation.
31d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
32d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao/*
33d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * This file is part of Lustre, http://www.lustre.org/
34d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Lustre is a trademark of Sun Microsystems, Inc.
35d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
36d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * lnet/selftest/conctl.c
37d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
38d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * IOC handle in kernel
39d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao *
40d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao * Author: Liang Zhen <liangzhen@clusterfs.com>
41d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao */
42d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
439fdaf8c0b92ab374f8501eb47855776afc928e45Greg Kroah-Hartman#include "../../include/linux/libcfs/libcfs.h"
449fdaf8c0b92ab374f8501eb47855776afc928e45Greg Kroah-Hartman#include "../../include/linux/lnet/lib-lnet.h"
459fdaf8c0b92ab374f8501eb47855776afc928e45Greg Kroah-Hartman#include "../../include/linux/lnet/lnetst.h"
46d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao#include "console.h"
47d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
48d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
49d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_session_new_ioctl(lstio_session_new_args_t *args)
50d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
51d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char      *name;
52d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	rc;
53d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
54d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_ses_idp   == NULL || /* address for output sid */
55d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_ses_key   == 0 || /* no key is specified */
56d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_ses_namep == NULL || /* session name */
57d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_ses_nmlen <= 0 ||
58d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_ses_nmlen > LST_NAME_SIZE)
59d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
60d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
61d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_ses_nmlen + 1);
62d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
63d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
64d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
65d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
66d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_ses_namep,
67d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_ses_nmlen)) {
68d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
69d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
70d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
71d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
72d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_ses_nmlen] = 0;
73d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
74d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_session_new(name,
75d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				args->lstio_ses_key,
76d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				args->lstio_ses_feats,
77d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				args->lstio_ses_force,
78d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				args->lstio_ses_timeout,
79d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				args->lstio_ses_idp);
80d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
81d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
82d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
83d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
84d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
85d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
86d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_session_end_ioctl(lstio_session_end_args_t *args)
87d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
88d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_ses_key != console_session.ses_key)
89d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
90d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
91d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return lstcon_session_end();
92d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
93d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
94d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
95d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_session_info_ioctl(lstio_session_info_args_t *args)
96d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
97d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	/* no checking of key */
98d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
9923ebb3fd1dfd70bd167b1c4758c0a23fbdd25650Masanari Iida	if (args->lstio_ses_idp   == NULL || /* address for output sid */
10023ebb3fd1dfd70bd167b1c4758c0a23fbdd25650Masanari Iida	    args->lstio_ses_keyp  == NULL || /* address for output key */
10123ebb3fd1dfd70bd167b1c4758c0a23fbdd25650Masanari Iida	    args->lstio_ses_featp  == NULL || /* address for output features */
102d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_ses_ndinfo == NULL || /* address for output ndinfo */
10323ebb3fd1dfd70bd167b1c4758c0a23fbdd25650Masanari Iida	    args->lstio_ses_namep == NULL || /* address for output name */
104d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_ses_nmlen <= 0 ||
105d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_ses_nmlen > LST_NAME_SIZE)
106d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
107d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
108d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return lstcon_session_info(args->lstio_ses_idp,
109d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				   args->lstio_ses_keyp,
110d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				   args->lstio_ses_featp,
111d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				   args->lstio_ses_ndinfo,
112d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				   args->lstio_ses_namep,
113d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				   args->lstio_ses_nmlen);
114d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
115d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
116d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
117d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_debug_ioctl(lstio_debug_args_t *args)
118d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
119d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char   *name   = NULL;
120d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int     client = 1;
121d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int     rc;
122d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
123d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_dbg_key != console_session.ses_key)
124d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
125d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
126d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_dbg_resultp == NULL)
127d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
128d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
129d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_dbg_namep != NULL && /* name of batch/group */
130d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    (args->lstio_dbg_nmlen <= 0 ||
131d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	     args->lstio_dbg_nmlen > LST_NAME_SIZE))
132d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
133d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
134d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_dbg_namep != NULL) {
135d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_ALLOC(name, args->lstio_dbg_nmlen + 1);
136d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (name == NULL)
137d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			return -ENOMEM;
138d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
139d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (copy_from_user(name, args->lstio_dbg_namep,
140d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       args->lstio_dbg_nmlen)) {
141d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			LIBCFS_FREE(name, args->lstio_dbg_nmlen + 1);
142d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
143d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			return -EFAULT;
144d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		}
145d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
146d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		name[args->lstio_dbg_nmlen] = 0;
147d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
148d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
149d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = -EINVAL;
150d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
151d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	switch (args->lstio_dbg_type) {
152d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	case LST_OPC_SESSION:
153d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = lstcon_session_debug(args->lstio_dbg_timeout,
154d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao					  args->lstio_dbg_resultp);
155d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		break;
156d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
157d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	case LST_OPC_BATCHSRV:
158d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		client = 0;
159d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	case LST_OPC_BATCHCLI:
160d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (name == NULL)
161d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			goto out;
162d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
163d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = lstcon_batch_debug(args->lstio_dbg_timeout,
164d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao					name, client, args->lstio_dbg_resultp);
165d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		break;
166d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
167d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	case LST_OPC_GROUP:
168d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (name == NULL)
169d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			goto out;
170d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
171d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = lstcon_group_debug(args->lstio_dbg_timeout,
172d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao					name, args->lstio_dbg_resultp);
173d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		break;
174d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
175d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	case LST_OPC_NODES:
176d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (args->lstio_dbg_count <= 0 ||
177d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		    args->lstio_dbg_idsp == NULL)
178d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			goto out;
179d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
180d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = lstcon_nodes_debug(args->lstio_dbg_timeout,
181d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao					args->lstio_dbg_count,
182d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao					args->lstio_dbg_idsp,
183d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao					args->lstio_dbg_resultp);
184d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		break;
185d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
186d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	default:
187d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		break;
188d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
189d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
190d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoout:
191d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name != NULL)
192d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_dbg_nmlen + 1);
193d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
194d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
195d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
196d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
197d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
198d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_group_add_ioctl(lstio_group_add_args_t *args)
199d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
200d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char	   *name;
201d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     rc;
202d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
203d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_key != console_session.ses_key)
204d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
205d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
206d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_namep == NULL||
207d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen <= 0 ||
208d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen > LST_NAME_SIZE)
209d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
210d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
211d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
212d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
213d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
214d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
215d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
216d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_grp_namep,
217d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_grp_nmlen)) {
218d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_grp_nmlen);
219d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
220d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
221d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
222d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_grp_nmlen] = 0;
223d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
224d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_group_add(name);
225d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
226d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
227d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
228d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
229d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
230d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
231d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
232d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_group_del_ioctl(lstio_group_del_args_t *args)
233d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
234d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int     rc;
235d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char   *name;
236d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
237d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_key != console_session.ses_key)
238d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
239d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
240d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_namep == NULL ||
241d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen <= 0 ||
242d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen > LST_NAME_SIZE)
243d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
244d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
245d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
246d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
247d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
248d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
249d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
250d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_grp_namep,
251d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_grp_nmlen)) {
252d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
253d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
254d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
255d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
256d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_grp_nmlen] = 0;
257d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
258d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_group_del(name);
259d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
260d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
261d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
262d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
263d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
264d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
265d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
266d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_group_update_ioctl(lstio_group_update_args_t *args)
267d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
268d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int     rc;
269d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char   *name;
270d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
271d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_key != console_session.ses_key)
272d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
273d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
274d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_resultp == NULL ||
275d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_namep == NULL ||
276d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen <= 0 ||
277d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen > LST_NAME_SIZE)
278d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
279d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
280d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
281d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
282d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
283d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
284d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
285d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			   args->lstio_grp_namep,
286d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			   args->lstio_grp_nmlen)) {
287d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
288d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
289d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
290d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
291d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_grp_nmlen] = 0;
292d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
293d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	switch (args->lstio_grp_opc) {
294d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	case LST_GROUP_CLEAN:
295d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = lstcon_group_clean(name, args->lstio_grp_args);
296d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		break;
297d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
298d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	case LST_GROUP_REFRESH:
299d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = lstcon_group_refresh(name, args->lstio_grp_resultp);
300d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		break;
301d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
302d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	case LST_GROUP_RMND:
303d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (args->lstio_grp_count  <= 0 ||
304d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		    args->lstio_grp_idsp == NULL) {
305d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = -EINVAL;
306d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
307d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		}
308d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = lstcon_nodes_remove(name, args->lstio_grp_count,
309d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao					 args->lstio_grp_idsp,
310d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao					 args->lstio_grp_resultp);
311d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		break;
312d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
313d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	default:
314d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = -EINVAL;
315d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		break;
316d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
317d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
318d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
319d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
320d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
321d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
322d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
323d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
324d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_nodes_add_ioctl(lstio_group_nodes_args_t *args)
325d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
326d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	unsigned feats;
327d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int     rc;
328d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char   *name;
329d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
330d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_key != console_session.ses_key)
331d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
332d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
333d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_idsp == NULL || /* array of ids */
334d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_count <= 0 ||
335d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_resultp == NULL ||
336d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_featp == NULL ||
337d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_namep == NULL ||
338d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen <= 0 ||
339d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen > LST_NAME_SIZE)
340d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
341d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
342d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
343d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
344d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
345d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
346d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name, args->lstio_grp_namep,
347d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_grp_nmlen)) {
348d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
349d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
350d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
351d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
352d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
353d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_grp_nmlen] = 0;
354d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
355d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_nodes_add(name, args->lstio_grp_count,
356d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			      args->lstio_grp_idsp, &feats,
357d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			      args->lstio_grp_resultp);
358d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
359d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
360d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (rc == 0 &&
361d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    copy_to_user(args->lstio_grp_featp, &feats, sizeof(feats))) {
362d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
363d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
364d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
365d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
366d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
367d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
368d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
369d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_group_list_ioctl(lstio_group_list_args_t *args)
370d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
371d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_key != console_session.ses_key)
372d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
373d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
374d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_idx   < 0 ||
375d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_namep == NULL ||
376d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen <= 0 ||
377d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen > LST_NAME_SIZE)
378d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
379d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
380d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return lstcon_group_list(args->lstio_grp_idx,
381d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			      args->lstio_grp_nmlen,
382d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			      args->lstio_grp_namep);
383d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
384d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
385d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
386d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_group_info_ioctl(lstio_group_info_args_t *args)
387d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
388d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char	   *name;
389d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     ndent;
390d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     index;
391d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     rc;
392d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
393d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_key != console_session.ses_key)
394d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
395d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
396d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_namep == NULL ||
397d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen <= 0 ||
398d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_nmlen > LST_NAME_SIZE)
399d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
400d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
401d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_entp  == NULL && /* output: group entry */
402d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_grp_dentsp == NULL)  /* output: node entry */
403d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
404d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
405d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_dentsp != NULL) { /* have node entry */
406d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (args->lstio_grp_idxp == NULL || /* node index */
407d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		    args->lstio_grp_ndentp == NULL) /* # of node entry */
408d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			return -EINVAL;
409d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
410d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (copy_from_user(&ndent, args->lstio_grp_ndentp,
411d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       sizeof(ndent)) ||
412d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		    copy_from_user(&index, args->lstio_grp_idxp,
413d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       sizeof(index)))
414d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			return -EFAULT;
415d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
416d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (ndent <= 0 || index < 0)
417d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			return -EINVAL;
418d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
419d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
420d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
421d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
422d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
423d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
424d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
425d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_grp_namep,
426d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_grp_nmlen)) {
427d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
428d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
429d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
430d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
431d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_grp_nmlen] = 0;
432d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
433d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_group_info(name, args->lstio_grp_entp,
434d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       &index, &ndent, args->lstio_grp_dentsp);
435d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
436d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
437d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
438d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (rc != 0)
439d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return rc;
440d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
441d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_grp_dentsp != NULL &&
442d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    (copy_to_user(args->lstio_grp_idxp, &index, sizeof(index)) ||
443d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	     copy_to_user(args->lstio_grp_ndentp, &ndent, sizeof(ndent))))
444d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = -EFAULT;
445d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
446d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return 0;
447d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
448d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
449d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
450d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_batch_add_ioctl(lstio_batch_add_args_t *args)
451d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
452d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     rc;
453d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char	   *name;
454d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
455d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_key != console_session.ses_key)
456d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
457d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
458d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_namep == NULL ||
459d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen <= 0 ||
460d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen > LST_NAME_SIZE)
461d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
462d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
463d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
464d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
465d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
466d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
467d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
468d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_namep,
469d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_nmlen)) {
470d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
471d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
472d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
473d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
474d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_bat_nmlen] = 0;
475d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
476d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_batch_add(name);
477d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
478d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
479d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
480d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
481d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
482d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
483d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
484d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_batch_run_ioctl(lstio_batch_run_args_t *args)
485d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
486d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     rc;
487d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char	   *name;
488d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
489d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_key != console_session.ses_key)
490d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
491d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
492d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_namep == NULL ||
493d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen <= 0 ||
494d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen > LST_NAME_SIZE)
495d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
496d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
497d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
498d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
499d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
500d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
501d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
502d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_namep,
503d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_nmlen)) {
504d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
505d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
506d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
507d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
508d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_bat_nmlen] = 0;
509d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
510d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_batch_run(name, args->lstio_bat_timeout,
511d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			      args->lstio_bat_resultp);
512d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
513d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
514d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
515d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
516d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
517d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
518d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
519d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_batch_stop_ioctl(lstio_batch_stop_args_t *args)
520d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
521d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     rc;
522d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char	   *name;
523d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
524d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_key != console_session.ses_key)
525d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
526d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
527d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_resultp == NULL ||
528d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_namep == NULL ||
529d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen <= 0 ||
530d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen > LST_NAME_SIZE)
531d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
532d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
533d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
534d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
535d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
536d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
537d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
538d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_namep,
539d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_nmlen)) {
540d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
541d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
542d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
543d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
544d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_bat_nmlen] = 0;
545d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
546d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_batch_stop(name, args->lstio_bat_force,
547d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_resultp);
548d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
549d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
550d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
551d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
552d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
553d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
554d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
555d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_batch_query_ioctl(lstio_batch_query_args_t *args)
556d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
557d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char   *name;
558d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int     rc;
559d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
560d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_key != console_session.ses_key)
561d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
562d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
563d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_resultp == NULL ||
564d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_namep == NULL ||
565d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen <= 0 ||
566d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen > LST_NAME_SIZE)
567d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
568d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
569d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_testidx < 0)
570d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
571d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
572d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
573d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
574d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
575d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
576d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
577d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_namep,
578d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_nmlen)) {
579d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
580d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
581d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
582d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
583d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_bat_nmlen] = 0;
584d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
585d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_test_batch_query(name,
586d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				     args->lstio_bat_testidx,
587d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				     args->lstio_bat_client,
588d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				     args->lstio_bat_timeout,
589d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				     args->lstio_bat_resultp);
590d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
591d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
592d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
593d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
594d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
595d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
596d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
597d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_batch_list_ioctl(lstio_batch_list_args_t *args)
598d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
599d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_key != console_session.ses_key)
600d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
601d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
602d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_idx   < 0 ||
603d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_namep == NULL ||
604d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen <= 0 ||
605d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen > LST_NAME_SIZE)
606d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
607d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
608d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return lstcon_batch_list(args->lstio_bat_idx,
609d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			      args->lstio_bat_nmlen,
610d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			      args->lstio_bat_namep);
611d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
612d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
613d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
614d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_batch_info_ioctl(lstio_batch_info_args_t *args)
615d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
616d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char	   *name;
617d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     rc;
618d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     index;
619d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     ndent;
620d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
621d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_key != console_session.ses_key)
622d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
623d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
624d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_namep == NULL || /* batch name */
625d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen <= 0 ||
626d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_nmlen > LST_NAME_SIZE)
627d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
628d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
629d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_entp == NULL && /* output: batch entry */
630d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_bat_dentsp == NULL) /* output: node entry */
631d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
632d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
633d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_dentsp != NULL) { /* have node entry */
634d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (args->lstio_bat_idxp == NULL || /* node index */
635d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		    args->lstio_bat_ndentp == NULL) /* # of node entry */
636d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			return -EINVAL;
637d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
638d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (copy_from_user(&index, args->lstio_bat_idxp,
639d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       sizeof(index)) ||
640d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		    copy_from_user(&ndent, args->lstio_bat_ndentp,
641d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       sizeof(ndent)))
642d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			return -EFAULT;
643d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
644d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (ndent <= 0 || index < 0)
645d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			return -EINVAL;
646d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
647d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
648d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_bat_nmlen + 1);
649d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
650d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
651d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
652d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name,
653d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_bat_namep, args->lstio_bat_nmlen)) {
654d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
655d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
656d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
657d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
658d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	name[args->lstio_bat_nmlen] = 0;
659d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
660d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = lstcon_batch_info(name,
661d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    args->lstio_bat_entp, args->lstio_bat_server,
662d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    args->lstio_bat_testidx, &index, &ndent,
663d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    args->lstio_bat_dentsp);
664d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
665d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
666d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
667d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (rc != 0)
668d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return rc;
669d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
670d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_bat_dentsp != NULL &&
671d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    (copy_to_user(args->lstio_bat_idxp, &index, sizeof(index)) ||
672d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	     copy_to_user(args->lstio_bat_ndentp, &ndent, sizeof(ndent))))
673d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = -EFAULT;
674d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
675d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
676d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
677d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
678d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
679d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolst_stat_query_ioctl(lstio_stat_args_t *args)
680d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
681d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int	     rc;
682d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char	   *name;
683d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
684d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	/* TODO: not finished */
685d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_sta_key != console_session.ses_key)
686d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EACCES;
687d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
688d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_sta_resultp == NULL ||
689d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    (args->lstio_sta_namep  == NULL &&
690d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	     args->lstio_sta_idsp   == NULL) ||
691d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_sta_nmlen <= 0 ||
692d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_sta_nmlen > LST_NAME_SIZE)
693d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
694d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
695d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_sta_idsp != NULL &&
696d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_sta_count <= 0)
697d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
698d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
699d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(name, args->lstio_sta_nmlen + 1);
700d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (name == NULL)
701d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
702d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
703d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(name, args->lstio_sta_namep,
704d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			       args->lstio_sta_nmlen)) {
705d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
706d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
707d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
708d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
709d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_sta_idsp == NULL) {
710d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = lstcon_group_stat(name, args->lstio_sta_timeout,
711d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       args->lstio_sta_resultp);
712d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	} else {
713d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = lstcon_nodes_stat(args->lstio_sta_count,
714d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       args->lstio_sta_idsp,
715d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       args->lstio_sta_timeout,
716d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       args->lstio_sta_resultp);
717d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
718d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
719d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
720d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
721d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
722d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
723d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
724d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint lst_test_add_ioctl(lstio_test_args_t *args)
725d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
726d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	char		*batch_name;
727d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	char		*src_name = NULL;
728d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	char		*dst_name = NULL;
729d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	void		*param = NULL;
730d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	int		ret = 0;
731d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	int		rc = -ENOMEM;
732d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
733d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_tes_resultp == NULL ||
734d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_retp == NULL ||
735d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_bat_name == NULL || /* no specified batch */
736d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_bat_nmlen <= 0 ||
737d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_bat_nmlen > LST_NAME_SIZE ||
738d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_sgrp_name == NULL || /* no source group */
739d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_sgrp_nmlen <= 0 ||
740d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_sgrp_nmlen > LST_NAME_SIZE ||
741d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_dgrp_name == NULL || /* no target group */
742d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_dgrp_nmlen <= 0 ||
743d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_dgrp_nmlen > LST_NAME_SIZE)
744d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
745d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
746d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_tes_loop == 0 || /* negative is infinite */
747d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_concur <= 0 ||
748d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_dist <= 0 ||
749d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    args->lstio_tes_span <= 0)
750d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
751d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
752d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	/* have parameter, check if parameter length is valid */
753d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_tes_param != NULL &&
754d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    (args->lstio_tes_param_len <= 0 ||
755d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	     args->lstio_tes_param_len > PAGE_CACHE_SIZE - sizeof(lstcon_test_t)))
756d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
757d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
758d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	LIBCFS_ALLOC(batch_name, args->lstio_tes_bat_nmlen + 1);
759d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	if (batch_name == NULL)
760d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return rc;
761d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
762d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	LIBCFS_ALLOC(src_name, args->lstio_tes_sgrp_nmlen + 1);
763d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	if (src_name == NULL)
764d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		goto out;
765d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
766d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	LIBCFS_ALLOC(dst_name, args->lstio_tes_dgrp_nmlen + 1);
767d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	 if (dst_name == NULL)
768d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		goto out;
769d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
770d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (args->lstio_tes_param != NULL) {
771d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_ALLOC(param, args->lstio_tes_param_len);
772d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		if (param == NULL)
773d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			goto out;
774d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
775d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
776d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	rc = -EFAULT;
777d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	if (copy_from_user(batch_name, args->lstio_tes_bat_name,
778d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata			   args->lstio_tes_bat_nmlen) ||
779d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	    copy_from_user(src_name, args->lstio_tes_sgrp_name,
780d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata			   args->lstio_tes_sgrp_nmlen) ||
781d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	    copy_from_user(dst_name, args->lstio_tes_dgrp_name,
782d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata			   args->lstio_tes_dgrp_nmlen) ||
783d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    copy_from_user(param, args->lstio_tes_param,
784d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			      args->lstio_tes_param_len))
785d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		goto out;
786d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
787d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	rc = lstcon_test_add(batch_name,
788d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    args->lstio_tes_type,
789d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    args->lstio_tes_loop,
790d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    args->lstio_tes_concur,
791d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    args->lstio_tes_dist, args->lstio_tes_span,
792d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata			    src_name, dst_name, param,
793d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata			    args->lstio_tes_param_len,
794d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			    &ret, args->lstio_tes_resultp);
795d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
796d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (ret != 0)
797d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = (copy_to_user(args->lstio_tes_retp, &ret,
798d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao				       sizeof(ret))) ? -EFAULT : 0;
799d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoout:
800d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	if (batch_name != NULL)
801d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata		LIBCFS_FREE(batch_name, args->lstio_tes_bat_nmlen + 1);
802d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
803d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	if (src_name != NULL)
804d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata		LIBCFS_FREE(src_name, args->lstio_tes_sgrp_nmlen + 1);
805d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
806d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata	if (dst_name != NULL)
807d75e265bd87a34174198fe8ebf15030919e6ad5eAmir Shehata		LIBCFS_FREE(dst_name, args->lstio_tes_dgrp_nmlen + 1);
808d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
809d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (param != NULL)
810d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(param, args->lstio_tes_param_len);
811d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
812d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
813d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
814d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
815d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoint
816d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taolstcon_ioctl_entry(unsigned int cmd, struct libcfs_ioctl_data *data)
817d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao{
818d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	char   *buf;
819d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int     opc = data->ioc_u32[0];
820d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	int     rc;
821d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
822d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (cmd != IOC_LIBCFS_LNETST)
823d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
824d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
825d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (data->ioc_plen1 > PAGE_CACHE_SIZE)
826d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EINVAL;
827d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
828d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_ALLOC(buf, data->ioc_plen1);
829d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (buf == NULL)
830d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -ENOMEM;
831d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
832d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	/* copy in parameter */
833d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_from_user(buf, data->ioc_pbuf1, data->ioc_plen1)) {
834d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		LIBCFS_FREE(buf, data->ioc_plen1);
835d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		return -EFAULT;
836d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
837d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
838d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	mutex_lock(&console_session.ses_mutex);
839d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
8407264b8a5db30b717b39394234fd3bb7dabdbda92Greg Kroah-Hartman	console_session.ses_laststamp = get_seconds();
841d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
842d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (console_session.ses_shutdown) {
843d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = -ESHUTDOWN;
844d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		goto out;
845d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
846d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
847d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (console_session.ses_expired)
848d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		lstcon_session_end();
849d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
850d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (opc != LSTIO_SESSION_NEW &&
851d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	    console_session.ses_state == LST_SESSION_NONE) {
852d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		CDEBUG(D_NET, "LST no active session\n");
853d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = -ESRCH;
854d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		goto out;
855d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
856d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
857d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	memset(&console_session.ses_trans_stat, 0, sizeof(lstcon_trans_stat_t));
858d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
859d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	switch (opc) {
860d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_SESSION_NEW:
861d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_session_new_ioctl((lstio_session_new_args_t *)buf);
862d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
863d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_SESSION_END:
864d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_session_end_ioctl((lstio_session_end_args_t *)buf);
865d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
866d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_SESSION_INFO:
867d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_session_info_ioctl((lstio_session_info_args_t *)buf);
868d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
869d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_DEBUG:
870d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_debug_ioctl((lstio_debug_args_t *)buf);
871d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
872d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_GROUP_ADD:
873d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_group_add_ioctl((lstio_group_add_args_t *)buf);
874d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
875d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_GROUP_DEL:
876d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_group_del_ioctl((lstio_group_del_args_t *)buf);
877d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
878d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_GROUP_UPDATE:
879d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_group_update_ioctl((lstio_group_update_args_t *)buf);
880d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
881d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_NODES_ADD:
882d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_nodes_add_ioctl((lstio_group_nodes_args_t *)buf);
883d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
884d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_GROUP_LIST:
885d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_group_list_ioctl((lstio_group_list_args_t *)buf);
886d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
887d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_GROUP_INFO:
888d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_group_info_ioctl((lstio_group_info_args_t *)buf);
889d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
890d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_BATCH_ADD:
891d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_batch_add_ioctl((lstio_batch_add_args_t *)buf);
892d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
893d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_BATCH_START:
894d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_batch_run_ioctl((lstio_batch_run_args_t *)buf);
895d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
896d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_BATCH_STOP:
897d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_batch_stop_ioctl((lstio_batch_stop_args_t *)buf);
898d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
899d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_BATCH_QUERY:
900d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_batch_query_ioctl((lstio_batch_query_args_t *)buf);
901d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
902d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_BATCH_LIST:
903d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_batch_list_ioctl((lstio_batch_list_args_t *)buf);
904d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
905d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_BATCH_INFO:
906d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_batch_info_ioctl((lstio_batch_info_args_t *)buf);
907d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
908d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_TEST_ADD:
909d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_test_add_ioctl((lstio_test_args_t *)buf);
910d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
911d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		case LSTIO_STAT_QUERY:
912d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = lst_stat_query_ioctl((lstio_stat_args_t *)buf);
913d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			break;
914d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		default:
915d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			rc = -EINVAL;
916d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	}
917d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
918d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	if (copy_to_user(data->ioc_pbuf2, &console_session.ses_trans_stat,
919d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao			     sizeof(lstcon_trans_stat_t)))
920d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao		rc = -EFAULT;
921d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Taoout:
922d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	mutex_unlock(&console_session.ses_mutex);
923d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
924d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	LIBCFS_FREE(buf, data->ioc_plen1);
925d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
926d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao	return rc;
927d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao}
928d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng Tao
929d7e09d0397e84eefbabfd9cb353221f3c6448d83Peng TaoEXPORT_SYMBOL(lstcon_ioctl_entry);
930