Whamcloud - gitweb
LU-1154 clio: rename coo_attr_set to coo_attr_update
[fs/lustre-release.git] / lnet / selftest / conctl.c
index 7cb1378..b3adca0 100644 (file)
@@ -1,11 +1,43 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
+/*
+ * GPL HEADER START
  *
- * Author: Liang Zhen <liangzhen@clusterfs.com>
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 only,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License version 2 for more details (a copy is included
+ * in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License
+ * version 2 along with this program; If not, see
+ * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ *
+ * GPL HEADER END
+ */
+/*
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Use is subject to license terms.
+ *
+ * Copyright (c) 2012, 2014, Intel Corporation.
+ */
+/*
+ * This file is part of Lustre, http://www.lustre.org/
+ * Lustre is a trademark of Sun Microsystems, Inc.
+ *
+ * lnet/selftest/conctl.c
  *
- * This file is part of Lustre, http://www.lustre.org
+ * IOC handle in kernel
  *
- * IOC handle in kernel 
+ * Author: Liang Zhen <liangzhen@clusterfs.com>
  */
 #ifdef __KERNEL__
 
@@ -14,8 +46,8 @@
 #include <lnet/lnetst.h>
 #include "console.h"
 
-int
-lst_session_new_ioctl(lstio_session_new_args_t *args) 
+static int
+lst_session_new_ioctl(lstio_session_new_args_t *args)
 {
         char      *name;
         int        rc;
@@ -26,32 +58,31 @@ lst_session_new_ioctl(lstio_session_new_args_t *args)
             args->lstio_ses_nmlen <= 0 ||
             args->lstio_ses_nmlen > LST_NAME_SIZE)
                 return -EINVAL;
-       
+
         LIBCFS_ALLOC(name, args->lstio_ses_nmlen + 1);
         if (name == NULL)
                 return -ENOMEM;
-        
-        if (copy_from_user(name,
-                           args->lstio_ses_namep,
-                           args->lstio_ses_nmlen)) {
+
+       if (copy_from_user(name, args->lstio_ses_namep,
+                          args->lstio_ses_nmlen)) {
                 LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
                 return -EFAULT;
         }
-        
+
         name[args->lstio_ses_nmlen] = 0;
-        
-        rc = lstcon_session_new(name,
-                             args->lstio_ses_key,
-                             args->lstio_ses_timeout,
-                             args->lstio_ses_force,
-                             args->lstio_ses_idp);
-        
-        LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
 
-        return rc;
+       rc = lstcon_session_new(name,
+                               args->lstio_ses_key,
+                               args->lstio_ses_feats,
+                               args->lstio_ses_force,
+                               args->lstio_ses_timeout,
+                               args->lstio_ses_idp);
+
+       LIBCFS_FREE(name, args->lstio_ses_nmlen + 1);
+       return rc;
 }
 
-int
+static int
 lst_session_end_ioctl(lstio_session_end_args_t *args)
 {
         if (args->lstio_ses_key != console_session.ses_key)
@@ -60,13 +91,14 @@ lst_session_end_ioctl(lstio_session_end_args_t *args)
         return lstcon_session_end();
 }
 
-int
+static int
 lst_session_info_ioctl(lstio_session_info_args_t *args)
 {
         /* no checking of key */
 
         if (args->lstio_ses_idp   == NULL || /* address for ouput sid */
             args->lstio_ses_keyp  == NULL || /* address for ouput key */
+           args->lstio_ses_featp  == NULL || /* address for ouput features */
             args->lstio_ses_ndinfo == NULL || /* address for output ndinfo */
             args->lstio_ses_namep == NULL || /* address for ouput name */
             args->lstio_ses_nmlen <= 0 ||
@@ -75,12 +107,13 @@ lst_session_info_ioctl(lstio_session_info_args_t *args)
 
         return lstcon_session_info(args->lstio_ses_idp,
                                    args->lstio_ses_keyp,
+                                  args->lstio_ses_featp,
                                    args->lstio_ses_ndinfo,
                                    args->lstio_ses_namep,
                                    args->lstio_ses_nmlen);
 }
 
-int
+static int
 lst_debug_ioctl(lstio_debug_args_t *args)
 {
         char   *name   = NULL;
@@ -103,8 +136,8 @@ lst_debug_ioctl(lstio_debug_args_t *args)
                 if (name == NULL)
                         return -ENOMEM;
 
-                if (copy_from_user(name, args->lstio_dbg_namep,
-                                   args->lstio_dbg_nmlen)) {
+               if (copy_from_user(name, args->lstio_dbg_namep,
+                                       args->lstio_dbg_nmlen)) {
                         LIBCFS_FREE(name, args->lstio_dbg_nmlen + 1);
 
                         return -EFAULT;
@@ -161,7 +194,7 @@ out:
         return rc;
 }
 
-int
+static int
 lst_group_add_ioctl(lstio_group_add_args_t *args)
 {
         char           *name;
@@ -171,7 +204,7 @@ lst_group_add_ioctl(lstio_group_add_args_t *args)
                 return -EACCES;
 
         if (args->lstio_grp_namep == NULL||
-            args->lstio_grp_nmlen <= 0 || 
+           args->lstio_grp_nmlen <= 0 ||
             args->lstio_grp_nmlen > LST_NAME_SIZE)
                 return -EINVAL;
 
@@ -179,9 +212,8 @@ lst_group_add_ioctl(lstio_group_add_args_t *args)
         if (name == NULL)
                 return -ENOMEM;
 
-        if (copy_from_user(name,
-                           args->lstio_grp_namep,
-                           args->lstio_grp_nmlen)) {
+       if (copy_from_user(name, args->lstio_grp_namep,
+                          args->lstio_grp_nmlen)) {
                 LIBCFS_FREE(name, args->lstio_grp_nmlen);
                 return -EFAULT;
         }
@@ -195,7 +227,7 @@ lst_group_add_ioctl(lstio_group_add_args_t *args)
         return rc;
 }
 
-int
+static int
 lst_group_del_ioctl(lstio_group_del_args_t *args)
 {
         int     rc;
@@ -203,9 +235,9 @@ lst_group_del_ioctl(lstio_group_del_args_t *args)
 
         if (args->lstio_grp_key != console_session.ses_key)
                 return -EACCES;
-        
+
         if (args->lstio_grp_namep == NULL ||
-            args->lstio_grp_nmlen <= 0 || 
+            args->lstio_grp_nmlen <= 0 ||
             args->lstio_grp_nmlen > LST_NAME_SIZE)
                 return -EINVAL;
 
@@ -213,9 +245,8 @@ lst_group_del_ioctl(lstio_group_del_args_t *args)
         if (name == NULL)
                 return -ENOMEM;
 
-        if (copy_from_user(name,
-                           args->lstio_grp_namep,
-                           args->lstio_grp_nmlen)) {
+       if (copy_from_user(name, args->lstio_grp_namep,
+                          args->lstio_grp_nmlen)) {
                 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
                 return -EFAULT;
         }
@@ -229,7 +260,7 @@ lst_group_del_ioctl(lstio_group_del_args_t *args)
         return rc;
 }
 
-int
+static int
 lst_group_update_ioctl(lstio_group_update_args_t *args)
 {
         int     rc;
@@ -240,7 +271,7 @@ lst_group_update_ioctl(lstio_group_update_args_t *args)
 
         if (args->lstio_grp_resultp == NULL ||
             args->lstio_grp_namep == NULL ||
-            args->lstio_grp_nmlen <= 0 || 
+           args->lstio_grp_nmlen <= 0 ||
             args->lstio_grp_nmlen > LST_NAME_SIZE)
                 return -EINVAL;
 
@@ -248,9 +279,8 @@ lst_group_update_ioctl(lstio_group_update_args_t *args)
         if (name == NULL)
                 return -ENOMEM;
 
-        if (copy_from_user(name,
-                           args->lstio_grp_namep,
-                           args->lstio_grp_nmlen)) {
+       if (copy_from_user(name, args->lstio_grp_namep,
+                          args->lstio_grp_nmlen)) {
                 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
                 return -EFAULT;
         }
@@ -283,13 +313,14 @@ lst_group_update_ioctl(lstio_group_update_args_t *args)
         }
 
         LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
-        
+
         return rc;
 }
 
-int
+static int
 lst_nodes_add_ioctl(lstio_group_nodes_args_t *args)
 {
+       unsigned feats;
         int     rc;
         char   *name;
 
@@ -299,8 +330,9 @@ lst_nodes_add_ioctl(lstio_group_nodes_args_t *args)
         if (args->lstio_grp_idsp == NULL || /* array of ids */
             args->lstio_grp_count <= 0 ||
             args->lstio_grp_resultp == NULL ||
-            args->lstio_grp_namep == NULL ||
-            args->lstio_grp_nmlen <= 0 || 
+           args->lstio_grp_featp == NULL ||
+           args->lstio_grp_namep == NULL ||
+           args->lstio_grp_nmlen <= 0 ||
             args->lstio_grp_nmlen > LST_NAME_SIZE)
                 return -EINVAL;
 
@@ -308,8 +340,8 @@ lst_nodes_add_ioctl(lstio_group_nodes_args_t *args)
         if (name == NULL)
                 return -ENOMEM;
 
-        if (copy_from_user(name, args->lstio_grp_namep,
-                           args->lstio_grp_nmlen)) {
+       if (copy_from_user(name, args->lstio_grp_namep,
+                               args->lstio_grp_nmlen)) {
                 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
 
                 return -EFAULT;
@@ -318,18 +350,22 @@ lst_nodes_add_ioctl(lstio_group_nodes_args_t *args)
         name[args->lstio_grp_nmlen] = 0;
 
         rc = lstcon_nodes_add(name, args->lstio_grp_count,
-                              args->lstio_grp_idsp,
-                              args->lstio_grp_resultp);
+                             args->lstio_grp_idsp, &feats,
+                             args->lstio_grp_resultp);
 
-        LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
+       LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
+       if (rc == 0 &&
+           copy_to_user(args->lstio_grp_featp, &feats, sizeof(feats))) {
+               return -EINVAL;
+       }
 
         return rc;
 }
 
-int
+static int
 lst_group_list_ioctl(lstio_group_list_args_t *args)
 {
-        if (args->lstio_grp_key != console_session.ses_key) 
+       if (args->lstio_grp_key != console_session.ses_key)
                 return -EACCES;
 
         if (args->lstio_grp_idx   < 0 ||
@@ -343,7 +379,7 @@ lst_group_list_ioctl(lstio_group_list_args_t *args)
                               args->lstio_grp_namep);
 }
 
-int
+static int
 lst_group_info_ioctl(lstio_group_info_args_t *args)
 {
         char           *name;
@@ -367,23 +403,23 @@ lst_group_info_ioctl(lstio_group_info_args_t *args)
                 if (args->lstio_grp_idxp == NULL || /* node index */
                     args->lstio_grp_ndentp == NULL) /* # of node entry */
                         return -EINVAL;
-                                
-                if (copy_from_user(&ndent,
-                                   args->lstio_grp_ndentp, sizeof(ndent)) ||
-                    copy_from_user(&index, args->lstio_grp_idxp, sizeof(index)))
-                        return -EFAULT;
 
-                if (ndent <= 0 || index < 0)
-                        return -EINVAL;
-        }
+               if (copy_from_user(&ndent, args->lstio_grp_ndentp,
+                                  sizeof(ndent)) ||
+                   copy_from_user(&index, args->lstio_grp_idxp,
+                                  sizeof(index)))
+                       return -EFAULT;
 
-        LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
-        if (name == NULL)
-                return -ENOMEM;
+               if (ndent <= 0 || index < 0)
+                       return -EINVAL;
+       }
 
-        if (copy_from_user(name,
-                           args->lstio_grp_namep,
-                           args->lstio_grp_nmlen)) {
+       LIBCFS_ALLOC(name, args->lstio_grp_nmlen + 1);
+       if (name == NULL)
+               return -ENOMEM;
+
+       if (copy_from_user(name, args->lstio_grp_namep,
+                          args->lstio_grp_nmlen)) {
                 LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
                 return -EFAULT;
         }
@@ -395,18 +431,18 @@ lst_group_info_ioctl(lstio_group_info_args_t *args)
 
         LIBCFS_FREE(name, args->lstio_grp_nmlen + 1);
 
-        if (rc != 0) 
+       if (rc != 0)
                 return rc;
 
-        if (args->lstio_grp_dentsp != NULL && 
-            (copy_to_user(args->lstio_grp_idxp, &index, sizeof(index)) ||
-             copy_to_user(args->lstio_grp_ndentp, &ndent, sizeof(ndent))))
-                rc = -EFAULT;
+       if (args->lstio_grp_dentsp != NULL &&
+           (copy_to_user(args->lstio_grp_idxp, &index, sizeof(index)) ||
+            copy_to_user(args->lstio_grp_ndentp, &ndent, sizeof(ndent))))
+               rc = -EFAULT;
 
-        return 0;
+       return 0;
 }
 
-int
+static int
 lst_batch_add_ioctl(lstio_batch_add_args_t *args)
 {
         int             rc;
@@ -424,12 +460,11 @@ lst_batch_add_ioctl(lstio_batch_add_args_t *args)
         if (name == NULL)
                 return -ENOMEM;
 
-        if (copy_from_user(name,
-                           args->lstio_bat_namep,
-                           args->lstio_bat_nmlen)) {
-                LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
-                return -EFAULT;
-        }
+       if (copy_from_user(name, args->lstio_bat_namep,
+                          args->lstio_bat_nmlen)) {
+               LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
+               return -EFAULT;
+       }
 
         name[args->lstio_bat_nmlen] = 0;
 
@@ -440,7 +475,7 @@ lst_batch_add_ioctl(lstio_batch_add_args_t *args)
         return rc;
 }
 
-int
+static int
 lst_batch_run_ioctl(lstio_batch_run_args_t *args)
 {
         int             rc;
@@ -458,12 +493,11 @@ lst_batch_run_ioctl(lstio_batch_run_args_t *args)
         if (name == NULL)
                 return -ENOMEM;
 
-        if (copy_from_user(name,
-                           args->lstio_bat_namep,
-                           args->lstio_bat_nmlen)) {
-                LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
-                return -EFAULT;
-        }
+       if (copy_from_user(name, args->lstio_bat_namep,
+                          args->lstio_bat_nmlen)) {
+               LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
+               return -EFAULT;
+       }
 
         name[args->lstio_bat_nmlen] = 0;
 
@@ -475,7 +509,7 @@ lst_batch_run_ioctl(lstio_batch_run_args_t *args)
         return rc;
 }
 
-int
+static int
 lst_batch_stop_ioctl(lstio_batch_stop_args_t *args)
 {
         int             rc;
@@ -494,12 +528,11 @@ lst_batch_stop_ioctl(lstio_batch_stop_args_t *args)
         if (name == NULL)
                 return -ENOMEM;
 
-        if (copy_from_user(name,
-                           args->lstio_bat_namep,
-                           args->lstio_bat_nmlen)) {
-                LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
-                return -EFAULT;
-        }
+       if (copy_from_user(name, args->lstio_bat_namep,
+                          args->lstio_bat_nmlen)) {
+               LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
+               return -EFAULT;
+       }
 
         name[args->lstio_bat_nmlen] = 0;
 
@@ -511,7 +544,7 @@ lst_batch_stop_ioctl(lstio_batch_stop_args_t *args)
         return rc;
 }
 
-int
+static int
 lst_batch_query_ioctl(lstio_batch_query_args_t *args)
 {
         char   *name;
@@ -533,12 +566,11 @@ lst_batch_query_ioctl(lstio_batch_query_args_t *args)
         if (name == NULL)
                 return -ENOMEM;
 
-        if (copy_from_user(name,
-                           args->lstio_bat_namep,
-                           args->lstio_bat_nmlen)) {
-                LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
-                return -EFAULT;
-        }
+       if (copy_from_user(name, args->lstio_bat_namep,
+                          args->lstio_bat_nmlen)) {
+               LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
+               return -EFAULT;
+       }
 
         name[args->lstio_bat_nmlen] = 0;
 
@@ -553,7 +585,7 @@ lst_batch_query_ioctl(lstio_batch_query_args_t *args)
         return rc;
 }
 
-int
+static int
 lst_batch_list_ioctl(lstio_batch_list_args_t *args)
 {
         if (args->lstio_bat_key != console_session.ses_key)
@@ -570,7 +602,7 @@ lst_batch_list_ioctl(lstio_batch_list_args_t *args)
                               args->lstio_bat_namep);
 }
 
-int
+static int
 lst_batch_info_ioctl(lstio_batch_info_args_t *args)
 {
         char           *name;
@@ -594,9 +626,11 @@ lst_batch_info_ioctl(lstio_batch_info_args_t *args)
                 if (args->lstio_bat_idxp == NULL || /* node index */
                     args->lstio_bat_ndentp == NULL) /* # of node entry */
                         return -EINVAL;
-                                
-                if (copy_from_user(&index, args->lstio_bat_idxp, sizeof(index)) ||
-                    copy_from_user(&ndent, args->lstio_bat_ndentp, sizeof(ndent)))
+
+               if (copy_from_user(&index, args->lstio_bat_idxp,
+                                       sizeof(index)) ||
+                   copy_from_user(&ndent, args->lstio_bat_ndentp,
+                                       sizeof(ndent)))
                         return -EFAULT;
 
                 if (ndent <= 0 || index < 0)
@@ -607,8 +641,8 @@ lst_batch_info_ioctl(lstio_batch_info_args_t *args)
         if (name == NULL)
                 return -ENOMEM;
 
-        if (copy_from_user(name,
-                           args->lstio_bat_namep, args->lstio_bat_nmlen)) {
+       if (copy_from_user(name, args->lstio_bat_namep,
+                          args->lstio_bat_nmlen)) {
                 LIBCFS_FREE(name, args->lstio_bat_nmlen + 1);
                 return -EFAULT;
         }
@@ -625,253 +659,273 @@ lst_batch_info_ioctl(lstio_batch_info_args_t *args)
         if (rc != 0)
                 return rc;
 
-        if (args->lstio_bat_dentsp != NULL && 
-            (copy_to_user(args->lstio_bat_idxp, &index, sizeof(index)) ||
-             copy_to_user(args->lstio_bat_ndentp, &ndent, sizeof(ndent))))
-                rc = -EFAULT;
+       if (args->lstio_bat_dentsp != NULL &&
+           (copy_to_user(args->lstio_bat_idxp, &index, sizeof(index)) ||
+            copy_to_user(args->lstio_bat_ndentp, &ndent, sizeof(ndent))))
+               rc = -EFAULT;
 
-        return rc;
+       return rc;
 }
 
-int
+static int
 lst_stat_query_ioctl(lstio_stat_args_t *args)
 {
         int             rc;
-        char           *name;
+       char           *name = NULL;
 
         /* TODO: not finished */
         if (args->lstio_sta_key != console_session.ses_key)
                 return -EACCES;
 
-        if (args->lstio_sta_resultp == NULL ||
-            (args->lstio_sta_namep  == NULL &&
-             args->lstio_sta_idsp   == NULL) ||
-            args->lstio_sta_nmlen <= 0 ||
-            args->lstio_sta_nmlen > LST_NAME_SIZE)
-                return -EINVAL;
-
-        if (args->lstio_sta_idsp != NULL &&
-            args->lstio_sta_count <= 0)
-                return -EINVAL;
-
-        LIBCFS_ALLOC(name, args->lstio_sta_nmlen + 1);
-        if (name == NULL)
-                return -ENOMEM;
+       if (args->lstio_sta_resultp == NULL)
+               return -EINVAL;
 
-        if (copy_from_user(name, args->lstio_sta_namep,
-                           args->lstio_sta_nmlen)) {
-                LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
-                return -EFAULT;
-        }
+       if (args->lstio_sta_idsp != NULL) {
+               if (args->lstio_sta_count <= 0)
+                       return -EINVAL;
 
-        if (args->lstio_sta_idsp == NULL) {
-                rc = lstcon_group_stat(name, args->lstio_sta_timeout,
-                                       args->lstio_sta_resultp);
-        } else {
-                rc = lstcon_nodes_stat(args->lstio_sta_count,
+               rc = lstcon_nodes_stat(args->lstio_sta_count,
                                        args->lstio_sta_idsp,
                                        args->lstio_sta_timeout,
                                        args->lstio_sta_resultp);
-        }
-
-        LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
-
-        return rc;
+       } else if (args->lstio_sta_namep != NULL) {
+               if (args->lstio_sta_nmlen <= 0 ||
+                   args->lstio_sta_nmlen > LST_NAME_SIZE)
+                       return -EINVAL;
+
+               LIBCFS_ALLOC(name, args->lstio_sta_nmlen + 1);
+               if (name == NULL)
+                       return -ENOMEM;
+
+               rc = copy_from_user(name, args->lstio_sta_namep,
+                                   args->lstio_sta_nmlen);
+               if (rc == 0)
+                       rc = lstcon_group_stat(name, args->lstio_sta_timeout,
+                                              args->lstio_sta_resultp);
+               else
+                       rc = -EFAULT;
+
+       } else {
+               rc = -EINVAL;
+       }
+
+       if (name != NULL)
+               LIBCFS_FREE(name, args->lstio_sta_nmlen + 1);
+       return rc;
 }
 
-int lst_test_add_ioctl(lstio_test_args_t *args)
+static int lst_test_add_ioctl(lstio_test_args_t *args)
 {
-        char           *name;
-        char           *srcgrp = NULL;
-        char           *dstgrp = NULL;
-        void           *param = NULL;
-        int             rc = -ENOMEM;
-
-        if (args->lstio_tes_resultp == NULL ||
-            args->lstio_tes_bat_name == NULL || /* no specified batch */
-            args->lstio_tes_bat_nmlen <= 0 ||
-            args->lstio_tes_bat_nmlen > LST_NAME_SIZE ||
-            args->lstio_tes_sgrp_name == NULL || /* no source group */
-            args->lstio_tes_sgrp_nmlen <= 0 ||
-            args->lstio_tes_sgrp_nmlen > LST_NAME_SIZE ||
-            args->lstio_tes_dgrp_name == NULL || /* no target group */
-            args->lstio_tes_dgrp_nmlen <= 0 ||
-            args->lstio_tes_dgrp_nmlen > LST_NAME_SIZE)
-                return -EINVAL;
+       char            *batch_name;
+       char            *src_name = NULL;
+       char            *dst_name = NULL;
+       void            *param = NULL;
+       int             ret = 0;
+       int             rc = -ENOMEM;
+
+       if (args->lstio_tes_resultp == NULL ||
+           args->lstio_tes_retp == NULL ||
+           args->lstio_tes_bat_name == NULL || /* no specified batch */
+           args->lstio_tes_bat_nmlen <= 0 ||
+           args->lstio_tes_bat_nmlen > LST_NAME_SIZE ||
+           args->lstio_tes_sgrp_name == NULL || /* no source group */
+           args->lstio_tes_sgrp_nmlen <= 0 ||
+           args->lstio_tes_sgrp_nmlen > LST_NAME_SIZE ||
+           args->lstio_tes_dgrp_name == NULL || /* no target group */
+           args->lstio_tes_dgrp_nmlen <= 0 ||
+           args->lstio_tes_dgrp_nmlen > LST_NAME_SIZE)
+               return -EINVAL;
+
+       if (args->lstio_tes_loop == 0 || /* negative is infinite */
+           args->lstio_tes_concur <= 0 ||
+           args->lstio_tes_dist <= 0 ||
+           args->lstio_tes_span <= 0)
+               return -EINVAL;
 
         /* have parameter, check if parameter length is valid */
         if (args->lstio_tes_param != NULL &&
             (args->lstio_tes_param_len <= 0 ||
-             args->lstio_tes_param_len > CFS_PAGE_SIZE - sizeof(lstcon_test_t)))
+            args->lstio_tes_param_len >
+            PAGE_CACHE_SIZE - sizeof(lstcon_test_t)))
                 return -EINVAL;
 
-        LIBCFS_ALLOC(name, args->lstio_tes_bat_nmlen + 1);
-        if (name == NULL)
-                return rc;
-
-        LIBCFS_ALLOC(srcgrp, args->lstio_tes_sgrp_nmlen + 1);
-        if (srcgrp == NULL) 
-                goto out;
-
-        LIBCFS_ALLOC(dstgrp, args->lstio_tes_dgrp_nmlen + 1);
-        if (srcgrp == NULL) 
-                goto out;
-
-        if (args->lstio_tes_param != NULL) {
-                LIBCFS_ALLOC(param, args->lstio_tes_param_len);
-                if (param == NULL) 
-                        goto out;
-        }
-
-        rc = -EFAULT;
-        if (copy_from_user(name,
-                           args->lstio_tes_bat_name,
-                           args->lstio_tes_bat_nmlen) ||
-            copy_from_user(srcgrp,
-                           args->lstio_tes_sgrp_name,
-                           args->lstio_tes_sgrp_nmlen) ||
-            copy_from_user(dstgrp,
-                           args->lstio_tes_dgrp_name,
-                           args->lstio_tes_dgrp_nmlen) ||
-            copy_from_user(param, args->lstio_tes_param,
-                           args->lstio_tes_param_len))
-                goto out;
-
-        rc = lstcon_test_add(name,
-                            args->lstio_tes_type,
-                            args->lstio_tes_loop,
-                            args->lstio_tes_concur,
-                            args->lstio_tes_dist, args->lstio_tes_span,
-                            srcgrp, dstgrp, param, args->lstio_tes_param_len,
-                            args->lstio_tes_resultp);
+       LIBCFS_ALLOC(batch_name, args->lstio_tes_bat_nmlen + 1);
+       if (batch_name == NULL)
+               return rc;
+
+       LIBCFS_ALLOC(src_name, args->lstio_tes_sgrp_nmlen + 1);
+       if (src_name == NULL)
+               goto out;
+
+       LIBCFS_ALLOC(dst_name, args->lstio_tes_dgrp_nmlen + 1);
+       if (dst_name == NULL)
+               goto out;
+
+       if (args->lstio_tes_param != NULL) {
+               LIBCFS_ALLOC(param, args->lstio_tes_param_len);
+               if (param == NULL)
+                       goto out;
+               if (copy_from_user(param, args->lstio_tes_param,
+                                  args->lstio_tes_param_len)) {
+                       rc = -EFAULT;
+                       goto out;
+               }
+       }
+
+       rc = -EFAULT;
+       if (copy_from_user(batch_name, args->lstio_tes_bat_name,
+                          args->lstio_tes_bat_nmlen) ||
+           copy_from_user(src_name, args->lstio_tes_sgrp_name,
+                          args->lstio_tes_sgrp_nmlen) ||
+           copy_from_user(dst_name, args->lstio_tes_dgrp_name,
+                          args->lstio_tes_dgrp_nmlen))
+               goto out;
+
+       rc = lstcon_test_add(batch_name,
+                           args->lstio_tes_type,
+                           args->lstio_tes_loop,
+                           args->lstio_tes_concur,
+                           args->lstio_tes_dist, args->lstio_tes_span,
+                           src_name, dst_name, param,
+                           args->lstio_tes_param_len,
+                           &ret, args->lstio_tes_resultp);
+
+        if (ret != 0)
+               rc = (copy_to_user(args->lstio_tes_retp, &ret,
+                                       sizeof(ret))) ? -EFAULT : 0;
 out:
-        if (name != NULL)
-                LIBCFS_FREE(name, args->lstio_tes_bat_nmlen + 1);
+       if (batch_name != NULL)
+               LIBCFS_FREE(batch_name, args->lstio_tes_bat_nmlen + 1);
 
-        if (srcgrp != NULL)
-                LIBCFS_FREE(srcgrp, args->lstio_tes_sgrp_nmlen + 1);
+       if (src_name != NULL)
+               LIBCFS_FREE(src_name, args->lstio_tes_sgrp_nmlen + 1);
 
-        if (dstgrp != NULL)
-                LIBCFS_FREE(dstgrp, args->lstio_tes_dgrp_nmlen + 1);
+       if (dst_name != NULL)
+               LIBCFS_FREE(dst_name, args->lstio_tes_dgrp_nmlen + 1);
 
-        if (param != NULL)
-                LIBCFS_FREE(param, args->lstio_tes_param_len);
+       if (param != NULL)
+               LIBCFS_FREE(param, args->lstio_tes_param_len);
 
-        return rc;
+       return rc;
 }
 
 int
-lstcon_ioctl_entry(unsigned int cmd, struct libcfs_ioctl_data *data)
+lstcon_ioctl_entry(unsigned int cmd, struct libcfs_ioctl_hdr *hdr)
 {
-        char   *buf;
-        int     opc = data->ioc_u32[0];
-        int     rc;
-
-        if (cmd != IOC_LIBCFS_LNETST)
-                return -EINVAL;
-
-        if (data->ioc_plen1 > CFS_PAGE_SIZE)
-                return -EINVAL;
-
-        LIBCFS_ALLOC(buf, data->ioc_plen1);
-        if (buf == NULL)
-                return -ENOMEM;
-
-        /* copy in parameter */
-        if (copy_from_user(buf, data->ioc_pbuf1, data->ioc_plen1)) {
-                LIBCFS_FREE(buf, data->ioc_plen1);
-                return -EFAULT;
-        }
-
-        mutex_down(&console_session.ses_mutex);
-
-        console_session.ses_laststamp = cfs_time_current_sec();
-
-        if (console_session.ses_shutdown) {
-                rc = -ESHUTDOWN;
-                goto out;
-        }
-
-        if (console_session.ses_expired)
-                lstcon_session_end();
-
-        if (opc != LSTIO_SESSION_NEW &&
-            console_session.ses_state == LST_SESSION_NONE) {
-                CDEBUG(D_NET, "LST no active session\n");
-                rc = -ESRCH;
-                goto out;
-        }
-
-        memset(&console_session.ses_trans_stat, 0, sizeof(lstcon_trans_stat_t));
-        
-        switch (opc) {
-                case LSTIO_SESSION_NEW:
-                        rc = lst_session_new_ioctl((lstio_session_new_args_t *)buf);
-                        break;
-                case LSTIO_SESSION_END:
-                        rc = lst_session_end_ioctl((lstio_session_end_args_t *)buf);
-                        break;
-                case LSTIO_SESSION_INFO:
-                        rc = lst_session_info_ioctl((lstio_session_info_args_t *)buf);
-                        break;
-                case LSTIO_DEBUG:
-                        rc = lst_debug_ioctl((lstio_debug_args_t *)buf);
-                        break;
-                case LSTIO_GROUP_ADD:
-                        rc = lst_group_add_ioctl((lstio_group_add_args_t *)buf);
-                        break;
-                case LSTIO_GROUP_DEL:
-                        rc = lst_group_del_ioctl((lstio_group_del_args_t *)buf);
-                        break;
-                case LSTIO_GROUP_UPDATE:
-                        rc = lst_group_update_ioctl((lstio_group_update_args_t *)buf);
-                        break;
-                case LSTIO_NODES_ADD:
-                        rc = lst_nodes_add_ioctl((lstio_group_nodes_args_t *)buf);
-                        break;
-                case LSTIO_GROUP_LIST:
-                        rc = lst_group_list_ioctl((lstio_group_list_args_t *)buf);
-                        break;
-                case LSTIO_GROUP_INFO:
-                        rc = lst_group_info_ioctl((lstio_group_info_args_t *)buf);
-                        break;
-                case LSTIO_BATCH_ADD:
-                        rc = lst_batch_add_ioctl((lstio_batch_add_args_t *)buf);
-                        break;
-                case LSTIO_BATCH_START:
-                        rc = lst_batch_run_ioctl((lstio_batch_run_args_t *)buf);
-                        break;
-                case LSTIO_BATCH_STOP:
-                        rc = lst_batch_stop_ioctl((lstio_batch_stop_args_t *)buf);
-                        break;
-                case LSTIO_BATCH_QUERY:
-                        rc = lst_batch_query_ioctl((lstio_batch_query_args_t *)buf);
-                        break;
-                case LSTIO_BATCH_LIST:
-                        rc = lst_batch_list_ioctl((lstio_batch_list_args_t *)buf);
-                        break;
-                case LSTIO_BATCH_INFO:
-                        rc = lst_batch_info_ioctl((lstio_batch_info_args_t *)buf);
-                        break;
-                case LSTIO_TEST_ADD:
-                        rc = lst_test_add_ioctl((lstio_test_args_t *)buf);
-                        break;
-                case LSTIO_STAT_QUERY:
-                        rc = lst_stat_query_ioctl((lstio_stat_args_t *)buf);
-                        break;
-                default:
-                        rc = -EINVAL;
-        }
-
-        if (copy_to_user(data->ioc_pbuf2, &console_session.ses_trans_stat,
-                         sizeof(lstcon_trans_stat_t)))
-                rc = -EFAULT;
+       char   *buf;
+       struct libcfs_ioctl_data *data;
+       int     opc;
+       int     rc;
+
+       if (cmd != IOC_LIBCFS_LNETST)
+               return -EINVAL;
+
+       data = container_of(hdr, struct libcfs_ioctl_data, ioc_hdr);
+
+       opc = data->ioc_u32[0];
+
+       if (data->ioc_plen1 > PAGE_CACHE_SIZE)
+               return -EINVAL;
+
+       LIBCFS_ALLOC(buf, data->ioc_plen1);
+       if (buf == NULL)
+               return -ENOMEM;
+
+       /* copy in parameter */
+       if (copy_from_user(buf, data->ioc_pbuf1, data->ioc_plen1)) {
+               LIBCFS_FREE(buf, data->ioc_plen1);
+               return -EFAULT;
+       }
+
+       mutex_lock(&console_session.ses_mutex);
+
+       console_session.ses_laststamp = cfs_time_current_sec();
+
+       if (console_session.ses_shutdown) {
+               rc = -ESHUTDOWN;
+               goto out;
+       }
+
+       if (console_session.ses_expired)
+               lstcon_session_end();
+
+       if (opc != LSTIO_SESSION_NEW &&
+           console_session.ses_state == LST_SESSION_NONE) {
+               CDEBUG(D_NET, "LST no active session\n");
+               rc = -ESRCH;
+               goto out;
+       }
+
+       memset(&console_session.ses_trans_stat, 0, sizeof(lstcon_trans_stat_t));
+
+       switch (opc) {
+       case LSTIO_SESSION_NEW:
+               rc = lst_session_new_ioctl((lstio_session_new_args_t *)buf);
+               break;
+       case LSTIO_SESSION_END:
+               rc = lst_session_end_ioctl((lstio_session_end_args_t *)buf);
+               break;
+       case LSTIO_SESSION_INFO:
+               rc = lst_session_info_ioctl((lstio_session_info_args_t *)buf);
+               break;
+       case LSTIO_DEBUG:
+               rc = lst_debug_ioctl((lstio_debug_args_t *)buf);
+               break;
+       case LSTIO_GROUP_ADD:
+               rc = lst_group_add_ioctl((lstio_group_add_args_t *)buf);
+               break;
+       case LSTIO_GROUP_DEL:
+               rc = lst_group_del_ioctl((lstio_group_del_args_t *)buf);
+               break;
+       case LSTIO_GROUP_UPDATE:
+               rc = lst_group_update_ioctl((lstio_group_update_args_t *)buf);
+               break;
+       case LSTIO_NODES_ADD:
+               rc = lst_nodes_add_ioctl((lstio_group_nodes_args_t *)buf);
+               break;
+       case LSTIO_GROUP_LIST:
+               rc = lst_group_list_ioctl((lstio_group_list_args_t *)buf);
+               break;
+       case LSTIO_GROUP_INFO:
+               rc = lst_group_info_ioctl((lstio_group_info_args_t *)buf);
+               break;
+       case LSTIO_BATCH_ADD:
+               rc = lst_batch_add_ioctl((lstio_batch_add_args_t *)buf);
+               break;
+       case LSTIO_BATCH_START:
+               rc = lst_batch_run_ioctl((lstio_batch_run_args_t *)buf);
+               break;
+       case LSTIO_BATCH_STOP:
+               rc = lst_batch_stop_ioctl((lstio_batch_stop_args_t *)buf);
+               break;
+       case LSTIO_BATCH_QUERY:
+               rc = lst_batch_query_ioctl((lstio_batch_query_args_t *)buf);
+               break;
+       case LSTIO_BATCH_LIST:
+               rc = lst_batch_list_ioctl((lstio_batch_list_args_t *)buf);
+               break;
+       case LSTIO_BATCH_INFO:
+               rc = lst_batch_info_ioctl((lstio_batch_info_args_t *)buf);
+               break;
+       case LSTIO_TEST_ADD:
+               rc = lst_test_add_ioctl((lstio_test_args_t *)buf);
+               break;
+       case LSTIO_STAT_QUERY:
+               rc = lst_stat_query_ioctl((lstio_stat_args_t *)buf);
+               break;
+       default:
+               rc = -EINVAL;
+       }
+
+       if (copy_to_user(data->ioc_pbuf2, &console_session.ses_trans_stat,
+                        sizeof(lstcon_trans_stat_t)))
+               rc = -EFAULT;
 out:
-        mutex_up(&console_session.ses_mutex);
+       mutex_unlock(&console_session.ses_mutex);
 
-        LIBCFS_FREE(buf, data->ioc_plen1);
+       LIBCFS_FREE(buf, data->ioc_plen1);
 
-        return rc;
+       return rc;
 }
 
 EXPORT_SYMBOL(lstcon_ioctl_entry);