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