Whamcloud - gitweb
LU-2783 ofd: Implement OBD_IOC_GET_OBJ_VERSION
[fs/lustre-release.git] / lustre / utils / lctl.c
index 264ffcc..1c8772b 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  * GPL HEADER END
  */
 /*
- * Copyright  2008 Sun Microsystems, Inc. All rights reserved
+ * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2011, 2012, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -85,7 +85,7 @@ command_t cmdlist[] = {
         /* Network configuration commands */
         {"===== network config =====", jt_noop, 0, "network config"},
         {"--net", jt_opt_net, 0,"run <command> after setting network to <net>\n"
-         "usage: --net <tcp/elan/gm/...> <command>"},
+         "usage: --net <tcp/elan/o2ib/...> <command>"},
         {"network", jt_ptl_network, 0, "configure LNET"
          "usage: network up|down"},
         {"net", jt_ptl_network, 0, "configure LNET"
@@ -94,6 +94,9 @@ command_t cmdlist[] = {
          "usage: list_nids [all]"},
         {"which_nid", jt_ptl_which_nid, 0, "choose a NID"
          "usage: which_nid NID [NID...]"},
+       {"replace_nids", jt_replace_nids, 0,
+        "replace primary NIDs for a device\n"
+        "usage: replace_nids <device> <nid1>[,nid2,nid3]"},
         {"interface_list", jt_ptl_print_interfaces,0,"print interface entries\n"
          "usage: interface_list"},
         {"peer_list", jt_ptl_print_peers, 0, "print peer entries\n"
@@ -131,20 +134,32 @@ command_t cmdlist[] = {
          "abort recovery on a restarting MDT or OST device\n"},
         {"set_timeout", jt_lcfg_set_timeout, 0,
          "usage: conf_param obd_timeout=<secs>\n"},
-        {"conf_param", jt_lcfg_mgsparam, 0, "set a permanent config param. "
+        {"conf_param", jt_lcfg_mgsparam, 0,"set a permanent config parameter.\n"
          "This command must be run on the MGS node\n"
-         "usage: conf_param <target.keyword=val> ...\n"},
+         "usage: conf_param [-d] <target.keyword=val>\n"
+         "  -d  Remove the permanent setting."},
         {"local_param", jt_lcfg_param, 0, "set a temporary, local param\n"
-         "usage: local_param <target.keyword=val> ...\n"},
+         "usage: local_param <target.keyword=val>\n"},
         {"get_param", jt_lcfg_getparam, 0, "get the Lustre or LNET parameter\n"
-         "usage: get_param [-n|-N] name.of.param\n"
-         "Get the value of Lustre or LNET parameter from the specified path\n"
-         "Use '-n' to disable printing of parameter name when printing value\n"
-         "Use '-N' to print only parameter names and not the values."},
+         "usage: get_param [-n|-N|-F] <param_path1 param_path2 ...>\n"
+         "Get the value of Lustre or LNET parameter from the specified path.\n"
+         "The path can contain shell-style filename patterns.\n"
+         "  -n  Print only the value and not parameter name.\n"
+         "  -N  Print only matched parameter names and not the values.\n"
+         "      (Especially useful when using patterns.)\n"
+         "  -F  When -N specified, add '/', '@' or '=' for directories,\n"
+         "      symlinks and writeable files, respectively."},
         {"set_param", jt_lcfg_setparam, 0, "set the Lustre or LNET parameter\n"
-         "usage: set_param [-n] name.of.param=value\n"
+         "usage: set_param [-n] <param_path1=value1 param_path2=value2 ...>\n"
          "Set the value of the Lustre or LNET parameter at the specified path\n"
-         "Use '-n' to disable printing of parameter name when setting value\n"},
+         "  -n  Disable printing of the key name when printing values."},
+        {"list_param", jt_lcfg_listparam, 0,
+         "list the Lustre or LNET parameter name\n"
+         "usage: list_param [-F|-R] <param_path1 param_path2 ...>\n"
+         "List the name of Lustre or LNET parameter from the specified path.\n"
+         "  -F  Add '/', '@' or '=' for dirs, symlinks and writeable files,\n"
+                "respectively.\n"
+         "  -R  Recursively list all parameters under the specified path.\n"},
 
         /* Debug commands */
         {"==== debugging control ====", jt_noop, 0, "debug"},
@@ -178,24 +193,6 @@ command_t cmdlist[] = {
          "provide gdb-friendly module information\n"
          "usage: modules <path>"},
 
-        /* Device configuration commands */
-        {"== device setup (these are not normally used post 1.4) ==",
-                jt_noop, 0, "device config"},
-        {"attach", jt_lcfg_attach, 0,
-         "set the type, name, and uuid of the current device\n"
-         "usage: attach type name uuid"},
-        {"detach", jt_obd_detach, 0,
-         "remove driver (and name and uuid) from current device\n"
-         "usage: detach"},
-        {"setup", jt_lcfg_setup, 0,
-         "type specific device configuration information\n"
-         "usage: setup <args...>"},
-        {"cleanup", jt_obd_cleanup, 0, "cleanup previously setup device\n"
-         "usage: cleanup [force | failover]"},
-        {"dump_cfg", jt_cfg_dump_log, 0,
-         "print log of recorded commands for this config to kernel debug log\n"
-         "usage: dump_cfg config-uuid-name"},
-
         /* virtual block operations */
         {"==== virtual block device ====", jt_noop, 0, "virtual block device"},
         {"blockdev_attach", jt_blockdev_attach, 0,
@@ -226,6 +223,33 @@ command_t cmdlist[] = {
          "list pools and pools members\n"
          "usage pool_list  <fsname>[.<poolname>] | <pathname>"},
 
+        /* Changelog commands */
+        {"===  Changelogs ==", jt_noop, 0, "changelog user management"},
+        {"changelog_register", jt_changelog_register, 0,
+         "register a new persistent changelog user, returns id\n"
+         "usage:\tdevice <mdtname>\n\tchangelog_register [-n]"},
+        {"changelog_deregister", jt_changelog_deregister, 0,
+         "deregister an existing changelog user\n"
+         "usage:\tdevice <mdtname>\n\tchangelog_deregister <id>"},
+
+        /* Device configuration commands */
+        {"== device setup (these are not normally used post 1.4) ==",
+                jt_noop, 0, "device config"},
+        {"attach", jt_lcfg_attach, 0,
+         "set the type, name, and uuid of the current device\n"
+         "usage: attach type name uuid"},
+        {"detach", jt_obd_detach, 0,
+         "remove driver (and name and uuid) from current device\n"
+         "usage: detach"},
+        {"setup", jt_lcfg_setup, 0,
+         "type specific device configuration information\n"
+         "usage: setup <args...>"},
+        {"cleanup", jt_obd_cleanup, 0, "cleanup previously setup device\n"
+         "usage: cleanup [force | failover]"},
+        {"dump_cfg", jt_cfg_dump_log, 0,
+         "print log of recorded commands for this config to kernel debug log\n"
+         "usage: dump_cfg config-uuid-name"},
+
         /* Test only commands */
         {"==== testing (DANGEROUS) ====", jt_noop, 0, "testing (DANGEROUS)"},
         {"--threads", jt_opt_threads, 0,
@@ -251,6 +275,8 @@ command_t cmdlist[] = {
          "usage: del_conn <conn_uuid> \n"},
         {"disconnect", jt_ptl_disconnect, 0, "disconnect from a remote nid\n"
          "usage: disconnect [<nid>]"},
+        {"push", jt_ptl_push_connection, 0, "flush connection to a remote nid\n"
+         "usage: push [<nid>]"},
         {"mynid", jt_ptl_mynid, 0, "inform the socknal of the local nid. "
          "The nid defaults to hostname for tcp networks and is automatically "
          "setup for elan/myrinet networks.\n"
@@ -259,13 +285,43 @@ command_t cmdlist[] = {
          "Omitting the count means indefinitely, 0 means restore, "
          "otherwise fail 'count' messages.\n"
          "usage: fail nid|_all_ [count]"},
+
+        /*Test commands for echo client*/
+        {"test_create", jt_obd_test_create, 0,
+         "create files on MDT by echo client\n"
+         "usage: test_create [-d parent_basedir] <-D parent_count> "
+         "[-b child_base_id] <-c stripe_count> <-n count> <-t time>\n"},
+        {"test_mkdir", jt_obd_test_mkdir, 0,
+         "mkdir on MDT by echo client\n"
+         "usage: test_mkdir [-d parent_basedir] <-D parent_count>"
+         "[-b child_base_id] [-n count] <-t time>\n"},
+        {"test_destroy", jt_obd_test_destroy, 0,
+         "Destroy files on MDT by echo client\n"
+         "usage: test_destroy [-d parent_basedir] <-D parent_count>"
+         "[-b child_base_id] [-n count] <-t time>\n"},
+        {"test_rmdir", jt_obd_test_rmdir, 0,
+         "rmdir on MDT by echo client\n"
+         "usage: test_rmdir [-d parent_basedir] <-D parent_count>"
+         "[-b child_base_id] [-n count] <-t time>\n"},
+        {"test_lookup", jt_obd_test_lookup, 0,
+         "lookup files on MDT by echo client\n"
+         "usage: test_lookup [-d parent_basedir] <-D parent_count>"
+         "[-b child_base_id] [-n count] <-t time>\n"},
+        {"test_setxattr", jt_obd_test_setxattr, 0,
+         "Set EA for files/directory on MDT by echo client\n"
+         "usage: test_setxattr [-d parent_baseid] <-D parent_count>"
+         "[-b child_base_id] [-x size] [-n count] <-t time>\n"},
+        {"test_md_getattr", jt_obd_test_md_getattr, 0,
+         "getattr files on MDT by echo client\n"
+         "usage: test_md_getattr [-d parent_basedir] <-D parent_count>"
+         "[-b child_base_id] [-n count] <-t time>\n"},
         {"getattr", jt_obd_getattr, 0,
          "get attribute for OST object <objid>\n"
          "usage: getattr <objid>"},
         {"setattr", jt_obd_setattr, 0,
          "set mode attribute for OST object <objid>\n"
          "usage: setattr <objid> <mode>"},
-         {"create", jt_obd_create, 0,
+        {"create", jt_obd_create, 0,
          "create <num> OST objects (with <mode>)\n"
          "usage: create [num [mode [verbose [lsm data]]]]"},
         {"destroy", jt_obd_destroy, 0,
@@ -287,6 +343,21 @@ command_t cmdlist[] = {
         {"memhog", jt_ptl_memhog, 0,
          "memory pressure testing\n"
          "usage: memhog <page count> [<gfp flags>]"},
+        {"getobjversion", jt_get_obj_version, 0,
+         "get the version of an object on servers\n"
+        "usage: getobjversion <fid>\n"
+        "       getobjversion -i <id> -g <group>"},
+
+       /* LFSCK commands */
+       {"==== LFSCK ====", jt_noop, 0, "LFSCK"},
+       {"lfsck_start", jt_lfsck_start, 0, "start LFSCK\n"
+        "usage: lfsck_start <-M | --device MDT_device>\n"
+        "                   [-e | --error error_handle] [-h | --help]\n"
+        "                   [-n | --dryrun switch] [-r | --reset]\n"
+        "                   [-s | --speed speed_limit]\n"
+        "                   [-t | --type lfsck_type[,lfsck_type...]]"},
+       {"lfsck_stop", jt_lfsck_stop, 0, "stop lfsck(s)\n"
+        "usage: lfsck_stop <-M | --device MDT_device> [-h | --help]"},
 
         {"==== obsolete (DANGEROUS) ====", jt_noop, 0, "obsolete (DANGEROUS)"},
         /* some test scripts still use these */
@@ -363,7 +434,7 @@ int lctl_main(int argc, char **argv)
         }
 
         obd_finalize(argc, argv);
-        return rc;
+        return rc < 0 ? -rc : rc;
 }
 
 #ifndef LIBLUSTRE_TEST