X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Futils%2Flctl.c;h=0145064fcc888cfbaf52651b569b7df6e5f750f4;hp=a14364755c572332a6a9cd8b302a52b7165fffde;hb=7e81f13c4a852cdba9fbebcc2b6385d6c2effa4b;hpb=a4346f1ee87f221d8541ad31b2efb3bba41a4df4 diff --git a/lustre/utils/lctl.c b/lustre/utils/lctl.c index a143647..0145064 100644 --- a/lustre/utils/lctl.c +++ b/lustre/utils/lctl.c @@ -1,35 +1,50 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: +/* + * GPL HEADER START * - * Copyright (C) 2002 Cluster File Systems, Inc. - * Author: Peter J. Braam - * Author: Phil Schwan - * Author: Robert Read + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * - * This file is part of Lustre, http://www.lustre.org. + * 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. * - * Lustre is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License 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). * - * Lustre 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 for more details. + * 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 * - * You should have received a copy of the GNU General Public License - * along with Lustre; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + * 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) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Use is subject to license terms. + * + * Copyright (c) 2012, 2013, Intel Corporation. + */ +/* + * This file is part of Lustre, http://www.lustre.org/ + * Lustre is a trademark of Sun Microsystems, Inc. + * + * lustre/utils/lctl.c + * + * Author: Peter J. Braam + * Author: Phil Schwan + * Author: Robert Read */ - #include #include -#include -#include +#include #include "obdctl.h" -#include "parser.h" +#include static int jt_quit(int argc, char **argv) { Parser_quit(argc, argv); @@ -47,192 +62,379 @@ static int jt_opt_ignore_errors(int argc, char **argv) { command_t cmdlist[] = { /* Metacommands */ + {"===== metacommands =======", jt_noop, 0, "metacommands"}, {"--device", jt_opt_device, 0, "run after connecting to device \n" "--device "}, - {"--threads", jt_opt_threads, 0, - "run separate instances of on device \n" - "--threads "}, {"--ignore_errors", jt_opt_ignore_errors, 0, "ignore errors that occur during script processing\n" "--ignore_errors"}, {"ignore_errors", jt_opt_ignore_errors, 0, "ignore errors that occur during script processing\n" "ignore_errors"}, - {"dump", jt_ioc_dump, 0, "usage: dump file, save ioctl buffer to file"}, + + /* User interface commands */ + {"======== control =========", jt_noop, 0, "control commands"}, + {"help", Parser_help, 0, "help"}, + {"lustre_build_version", jt_get_version, 0, + "print the build version of lustre\n" + "usage: lustre_build_version"}, + {"exit", jt_quit, 0, "quit"}, + {"quit", jt_quit, 0, "quit"}, /* Network configuration commands */ - {"==== network config ====", jt_noop, 0, "network config"}, - {"network", jt_ptl_network, 0, "commands that follow apply to net\n" - "usage: network "}, - {"connect", jt_ptl_connect, 0, "connect to a remote nid\n" - "usage: connect [[ ] | ]"}, - {"disconnect", jt_ptl_disconnect, 0, "disconnect from a remote nid\n" - "usage: disconnect "}, - {"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" - "usage: mynid [nid]"}, - {"add_uuid", jt_obd_add_uuid, 0, "associate a UUID with a nid\n" - "usage: add_uuid "}, - {"close_uuid", jt_obd_close_uuid, 0, "disconnect a UUID\n" - "usage: close_uuid )"}, - {"del_uuid", jt_obd_del_uuid, 0, "delete a UUID association\n" - "usage: del_uuid "}, - {"add_route", jt_ptl_add_route, 0, - "add an entry to the routing table\n" - "usage: add_route [target]"}, - {"del_route", jt_ptl_del_route, 0, - "delete an entry from the routing table\n" - "usage: del_route "}, - {"route_list", jt_ptl_print_routes, 0, "print the routing table\n" + {"===== network config =====", jt_noop, 0, "network config"}, + {"--net", jt_opt_net, 0,"run after setting network to \n" + "usage: --net "}, + {"network", jt_ptl_network, 0, "configure LNET" + "usage: network up|down"}, + {"net", jt_ptl_network, 0, "configure LNET" + "usage: net up|down"}, + {"list_nids", jt_ptl_list_nids, 0, "list local NIDs" + "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 [,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" + "usage: peer_list"}, + {"conn_list", jt_ptl_print_connections, 0, + "print all the connected remote nid\n" + "usage: conn_list"}, + {"active_tx", jt_ptl_print_active_txs, 0, "print active transmits\n" + "usage: active_tx"}, + {"route_list", jt_ptl_print_routes, 0, + "print the portals routing table, same as show_route\n" "usage: route_list"}, - {"recv_mem", jt_ptl_rxmem, 0, "set socket receive buffer size, " - "if size is omited the current size is reported.\n" - "usage: recv_mem [size]"}, - {"send_mem", jt_ptl_txmem, 0, "set socket send buffer size, " - "if size is omited the current size is reported.\n" - "usage: send_mem [size]"}, - {"nagle", jt_ptl_nagle, 0, "enable/disable nagle, omiting the " - "argument will cause the current nagle setting to be reported.\n" - "usage: nagle [on/off]"}, + {"show_route", jt_ptl_print_routes, 0, + "print the portals routing table, same as route_list\n" + "usage: show_route"}, + {"ping", jt_ptl_ping, 0, "Check LNET connectivity\n" + "usage: ping nid [timeout] [pid]"}, /* Device selection commands */ - {"=== device selection ===", jt_noop, 0, "device selection"}, - {"newdev", jt_obd_newdev, 0, "create a new device\n" - "usage: newdev"}, -#if 0 - {"uuid2dev", jt_obd_uuid2dev, 0, - "find device attached with and make it the current device\n" - "usage: uuid2dev "}, -#endif - {"name2dev", jt_obd_name2dev, 0, - "find device attached with and make it the current device\n" - "usage: name2dev "}, - {"device", jt_obd_device, 0, "set current device to \n" - "usage: device "}, + {"==== obd device selection ====", jt_noop, 0, "device selection"}, + {"device", jt_obd_device, 0, + "set current device to \n" + "usage: device <%name|$name|devno>"}, {"device_list", jt_obd_list, 0, "show all devices\n" "usage: device_list"}, - {"lustre_build_version", jt_get_version, 0, - "print the build version of lustre\n" - "usage: lustre_build_version"}, + {"dl", jt_obd_list, 0, "show all devices\n" + "usage: dl [-t]"}, + + /* Device operations */ + {"==== obd device operations ====", jt_noop, 0, "device operations"}, + {"activate", jt_obd_activate, 0, "activate an import\n"}, + {"deactivate", jt_obd_deactivate, 0, "deactivate an import. " + "This command should be used on failed OSC devices in an MDT LOV.\n"}, + {"abort_recovery", jt_obd_abort_recovery, 0, + "abort recovery on a restarting MDT or OST device\n"}, + {"set_timeout", jt_lcfg_set_timeout, 0, + "usage: conf_param obd_timeout=\n"}, +#if LUSTRE_VERSION >= OBD_OCD_VERSION(3,0,53,0) +#warning "remove conf_param option" +#else + {"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 [-d] \n" + " -d Remove the permanent setting."}, +#endif + {"local_param", jt_lcfg_param, 0, "set a temporary, local param\n" + "usage: local_param \n"}, + {"get_param", jt_lcfg_getparam, 0, "get the Lustre or LNET parameter\n" + "usage: get_param [-n|-N|-F] \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] [-P] [-d]" + "\n" + "Set the value of the Lustre or LNET parameter at the specified path.\n" + " -n Disable printing of the key name when printing values.\n" + " -P Set the parameter permanently, filesystem-wide.\n" + " -d Remove the permanent setting (only with -P option).\n"}, + {"list_param", jt_lcfg_listparam, 0, + "list the Lustre or LNET parameter name\n" + "usage: list_param [-F|-R] \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"}, + {"debug_daemon", jt_dbg_debug_daemon, 0, + "debug daemon control and dump to a file\n" + "usage: debug_daemon {start file [#MB]|stop}"}, + {"debug_kernel", jt_dbg_debug_kernel, 0, + "get debug buffer and dump to a file, same as dk\n" + "usage: debug_kernel [file] [raw]"}, + {"dk", jt_dbg_debug_kernel, 0, + "get debug buffer and dump to a file, same as debug_kernel\n" + "usage: dk [file] [raw]"}, + {"debug_file", jt_dbg_debug_file, 0, + "convert a binary debug file dumped by the kernel to ASCII text\n" + "usage: debug_file [output]"}, + {"df", jt_dbg_debug_file, 0, + "read debug buffer from input and dump to output, same as debug_file\n" + "usage: df [output]"}, + {"clear", jt_dbg_clear_debug_buf, 0, "clear kernel debug buffer\n" + "usage: clear"}, + {"mark", jt_dbg_mark_debug_buf, 0, + "insert marker text in kernel debug buffer\n" + "usage: mark "}, + {"filter", jt_dbg_filter, 0, "filter message type\n" + "usage: filter "}, + {"show", jt_dbg_show, 0, "Show specific type of messages\n" + "usage: show "}, + {"debug_list", jt_dbg_list, 0, "list subsystem and debug types\n" + "usage: debug_list "}, + {"modules", jt_dbg_modules, 0, + "provide gdb-friendly module information\n" + "usage: modules "}, + + /* virtual block operations */ + {"==== virtual block device ====", jt_noop, 0, "virtual block device"}, + {"blockdev_attach", jt_blockdev_attach, 0, + "attach a lustre regular file to a virtual block device\n" + "usage: blockdev_attach "}, + {"blockdev_detach", jt_blockdev_detach, 0, + "detach a lustre regular file from a virtual block device\n" + "usage: blockdev_detach "}, + {"blockdev_info", jt_blockdev_info, 0, + "get the device info of a attached file\n" + "usage: blockdev_info "}, + + /* Pool commands */ + {"=== Pools ==", jt_noop, 0, "pool management"}, + {"pool_new", jt_pool_cmd, 0, + "add a new pool\n" + "usage: pool_new ."}, + {"pool_add", jt_pool_cmd, 0, + "add the named OSTs to the pool\n" + "usage: pool_add . "}, + {"pool_remove", jt_pool_cmd, 0, + "remove the named OST from the pool\n" + "usage: pool_remove . "}, + {"pool_destroy", jt_pool_cmd, 0, + "destroy a pool\n" + "usage: pool_destroy ."}, + {"pool_list", jt_pool_cmd, 0, + "list pools and pools members\n" + "usage: pool_list [.] | "}, + + /* Nodemap commands */ + {"=== Nodemap ===", jt_noop, 0, "nodemap management"}, + {"nodemap_activate_idmap", jt_nodemap_activate, 0, + "activate nodemap idmapping functions\n" + "usage: nodemap_activate_idmap"}, + {"nodemap_add", jt_nodemap_add, 0, + "add a new nodemap\n" + "usage: nodemap_add "}, + {"nodemap_del", jt_nodemap_del, 0, + "remove a nodemap\n" + "usage: nodemap_del "}, + + /* 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 \n\tchangelog_register [-n]"}, + {"changelog_deregister", jt_changelog_deregister, 0, + "deregister an existing changelog user\n" + "usage:\tdevice \n\tchangelog_deregister "}, /* Device configuration commands */ - {"==== device config =====", jt_noop, 0, "device config"}, - {"attach", jt_obd_attach, 0, - "set the type of the current device (with and )\n" - "usage: attach type [name [uuid]]"}, - {"setup", jt_obd_setup, 0, - "type specific device configuration information\n" - "usage: setup "}, - {"cleanup", jt_obd_cleanup, 0, "cleanup previously setup device\n" - "usage: cleanup [force]"}, + {"== 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"}, - {"lov_setconfig", jt_obd_lov_setconfig, 0, - "write lov configuration to an mds device\n" - "usage: lov_setconfig lov-uuid stripe-count stripe-size offset pattern UUID1 [UUID2 ...]"}, - {"lov_getconfig", jt_obd_lov_getconfig, 0, - "read lov configuration from an mds device\n" - "usage: lov_getconfig lov-uuid"}, + {"setup", jt_lcfg_setup, 0, + "type specific device configuration information\n" + "usage: setup "}, + {"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"}, - /* Device operations */ - {"=== device operations ==", jt_noop, 0, "device operations"}, - {"probe", jt_obd_connect, 0, - "build a connection handle to a device. This command is used to " - "suspend configuration until lctl has ensured that the mds and osc " - "services are available. This is to avoid mount failures in a " - "rebooting cluster.\n" - "usage: probe [timeout]"}, - {"close", jt_obd_disconnect, 0, - "close the connection handle\n" - "usage: close"}, + /* Test only commands */ + {"==== testing (DANGEROUS) ====", jt_noop, 0, "testing (DANGEROUS)"}, + {"--threads", jt_opt_threads, 0, + "run separate instances of on device \n" + "--threads "}, + {"lookup", jt_obd_mdc_lookup, 0, "report file mode info\n" + "usage: lookup "}, + {"readonly", jt_obd_set_readonly, 0, + "disable writes to the underlying device\n"}, + {"notransno", jt_obd_no_transno, 0, + "disable sending of committed-transno updates\n"}, + {"add_uuid", jt_lcfg_add_uuid, 0, "associate a UUID with a nid\n" + "usage: add_uuid "}, + {"del_uuid", jt_lcfg_del_uuid, 0, "delete a UUID association\n" + "usage: del_uuid "}, + {"add_peer", jt_ptl_add_peer, 0, "add an peer entry\n" + "usage: add_peer "}, + {"del_peer", jt_ptl_del_peer, 0, "remove an peer entry\n" + "usage: del_peer [] []"}, + {"add_conn ", jt_lcfg_add_conn, 0, + "usage: add_conn [priority]\n"}, + {"del_conn ", jt_lcfg_del_conn, 0, + "usage: del_conn \n"}, + {"disconnect", jt_ptl_disconnect, 0, "disconnect from a remote nid\n" + "usage: disconnect []"}, + {"push", jt_ptl_push_connection, 0, "flush connection to a remote nid\n" + "usage: push []"}, + {"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" + "usage: mynid []"}, + {"fail", jt_ptl_fail_nid, 0, "fail/restore communications.\n" + "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] [-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 \n" "usage: getattr "}, {"setattr", jt_obd_setattr, 0, "set mode attribute for OST object \n" "usage: setattr "}, - {"create", jt_obd_create, 0, + {"create", jt_obd_create, 0, "create OST objects (with )\n" - "usage: create [num [mode [verbose]]]"}, + "usage: create [num [mode [verbose [lsm data]]]]"}, {"destroy", jt_obd_destroy, 0, "destroy OST object [num [verbose]]\n" "usage: destroy objects, starting at objid "}, {"test_getattr", jt_obd_test_getattr, 0, "do getattrs (on OST object (objid+1 on each thread))\n" "usage: test_getattr [verbose [[t]objid]]"}, + {"test_setattr", jt_obd_test_setattr, 0, + "do setattrs (on OST object (objid+1 on each thread))\n" + "usage: test_setattr [verbose [[t]objid]]"}, {"test_brw", jt_obd_test_brw, 0, "do bulk read/writes ( per I/O, on OST object )\n" "usage: test_brw [t] [write [verbose [npages [[t]objid]]]]"}, - {"get_stripe", jt_obd_get_stripe, 0, - "show stripe info for an echo client object\n" - "usage: get_stripe objid\n"}, - {"set_stripe", jt_obd_set_stripe, 0, - "set stripe info for an echo client object\n" - "usage: set_stripe objid[=width!count[@offset][:id:id...]\n"}, - {"unset_stripe", jt_obd_unset_stripe, 0, - "unset stripe info for an echo client object\n" - "usage: unset_stripe objid\n"}, - {"test_ldlm", jt_obd_test_ldlm, 0, - "perform lock manager test\n" - "usage: test_ldlm"}, - {"ldlm_regress_start", jt_obd_ldlm_regress_start, 0, - "start lock manager stress test\n" - "usage: ldlm_regress_start [numthreads [refheld [numres [numext]]]]"}, - {"ldlm_regress_stop", jt_obd_ldlm_regress_stop, 0, - "stop lock manager stress test (no args)\n"}, - {"dump_ldlm", jt_obd_dump_ldlm, 0, - "dump all lock manager state (no args)"}, - {"lov_set_osc_active", jt_obd_lov_set_osc_active, 0, - "(de)activate an OSC in a LOV\n" - "usage: lov_set_osc_active <1|0 (active|inactive)>"}, - {"newconn", jt_obd_newconn, 0, "newconn [newuuid]"}, - {"failconn", jt_obd_failconn, 0, "failconn "}, - {"lookup", jt_obd_mdc_lookup, 0, "usage: lookup "}, - {"notransno", jt_obd_no_transno, 0, - "disable sending of committed-transno updates\n" - "usage: notransno"}, - {"readonly", jt_obd_set_readonly, 0, - "disable writes to the underlying device\n" - "usage: readonly"}, + {"memhog", jt_ptl_memhog, 0, + "memory pressure testing\n" + "usage: memhog []"}, + {"getobjversion", jt_get_obj_version, 0, + "get the version of an object on servers\n" + "usage: getobjversion \n" + " getobjversion -i -g "}, - /* Debug commands */ - {"======== debug =========", jt_noop, 0, "debug"}, - {"debug_kernel", jt_dbg_debug_kernel, 0, - "get debug buffer and dump to a file" - "usage: debug_kernel [file] [raw]"}, - {"debug_file", jt_dbg_debug_file, 0, - "read debug buffer from input and dump to output" - "usage: debug_file [output] [raw]"}, - {"clear", jt_dbg_clear_debug_buf, 0, "clear kernel debug buffer\n" - "usage: clear"}, - {"mark", jt_dbg_mark_debug_buf, 0,"insert marker text in kernel debug buffer\n" - "usage: mark "}, - {"filter", jt_dbg_filter, 0, "filter message type\n" - "usage: filter "}, - {"show", jt_dbg_show, 0, "show message type\n" - "usage: show "}, - {"debug_list", jt_dbg_list, 0, "list subsystem and debug types\n" - "usage: debug_list "}, - {"modules", jt_dbg_modules, 0, - "provide gdb-friendly module information\n" - "usage: modules "}, - {"panic", jt_dbg_panic, 0, "force the kernel to panic\n" - "usage: panic"}, - - /* User interface commands */ - {"======= control ========", jt_noop, 0, "control commands"}, - {"help", Parser_help, 0, "help"}, - {"exit", jt_quit, 0, "quit"}, - {"quit", jt_quit, 0, "quit"}, - { 0, 0, 0, NULL } -}; + /* LFSCK commands */ + {"==== LFSCK ====", jt_noop, 0, "LFSCK"}, + {"lfsck_start", jt_lfsck_start, 0, "start LFSCK\n" + "usage: lfsck_start <-M | --device [MDT,OST]_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...]]\n" + " [-w | --windows win_size]"}, + {"lfsck_stop", jt_lfsck_stop, 0, "stop lfsck(s)\n" + "usage: lfsck_stop <-M | --device [MDT,OST]_device> [-h | --help]"}, + {"==== obsolete (DANGEROUS) ====", jt_noop, 0, "obsolete (DANGEROUS)"}, + /* some test scripts still use these */ + {"cfg_device", jt_obd_device, 0, + "set current device to \n" + "usage: device "}, + {"recover", jt_obd_recover, 0, + "try to restore a lost connection immediately\n" + "usage: recover [MDC/OSC device]"}, + /* saving for sanity 44a */ + {"lov_getconfig", jt_obd_lov_getconfig, 0, + "read lov configuration from an mds device\n" + "usage: lov_getconfig "}, + /* Llog operations */ + {"llog_catlist", jt_llog_catlist, 0, + "list all catalog logs on current device.\n" + "usage: llog_catlist"}, + {"llog_info", jt_llog_info, 0, + "print log header information.\n" + "usage: llog_info <$logname|#oid#ogr#ogen>\n" + " oid, ogr and ogen are hexadecimal."}, + {"llog_print", jt_llog_print, 0, + "print log content information.\n" + "usage: llog_print <$logname|#oid#ogr#ogen> [from] [to]\n" + " oid, ogr and ogen are hexadecimal.\n" + " print all records from index 1 by default."}, + {"llog_check", jt_llog_check, 0, + "print log content information.\n" + "usage: llog_check <$logname|#oid#ogr#ogen> [from] [to]\n" + " oid, ogr and ogen are hexadecimal.\n" + " check all records from index 1 by default."}, + {"llog_cancel", jt_llog_cancel, 0, + "cancel one record in log.\n" + "This command supports both positional and optional arguments\n" + "usage (positional args): " + "llog_cancel [log id] \n" + "usage (optional args): " + "llog_cancel --catalog --log_id " + "--log_idx "}, + {"llog_remove", jt_llog_remove, 0, + "remove one log from catalog or plain log, erase it from disk.\n" + "usage: llog_remove "}, + /* network operations */ + {"add_interface", jt_ptl_add_interface, 0, "add interface entry\n" + "usage: add_interface ip [netmask]"}, + {"del_interface", jt_ptl_del_interface, 0, "del interface entry\n" + "usage: del_interface [ip]"}, + {"add_route", jt_ptl_add_route, 0, + "add an entry to the portals routing table\n" + "usage: add_route [ []]"}, + {"del_route", jt_ptl_del_route, 0, + "delete route via gateway to targets from the portals routing table\n" + "usage: del_route [] []"}, + {"set_route", jt_ptl_notify_router, 0, + "enable/disable routes via gateway in the portals routing table\n" + "usage: set_route [