+ {"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=<secs>\n"},
+#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(3, 0, 53, 0)
+ {"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] <target.keyword=val>\n"
+ " -d Remove the permanent setting."},
+#endif
+ {"local_param", jt_lcfg_param, 0, "set a temporary, local param\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|-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] [-P] [-d]"
+ "<param_path1=value1 param_path2=value2 ...>\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] <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"},
+ {"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 <input> [output]"},
+ {"df", jt_dbg_debug_file, 0,
+ "read debug buffer from input and dump to output, same as debug_file\n"
+ "usage: df <input> [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 <text>"},
+ {"filter", jt_dbg_filter, 0, "filter message type\n"
+ "usage: filter <subsystem id/debug mask>"},
+ {"show", jt_dbg_show, 0, "Show specific type of messages\n"
+ "usage: show <subsystem id/debug mask>"},
+ {"debug_list", jt_dbg_list, 0, "list subsystem and debug types\n"
+ "usage: debug_list <subs/types>"},
+ {"modules", jt_dbg_modules, 0,
+ "provide gdb-friendly module information\n"
+ "usage: modules <path>"},
+
+ /* 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 <file_name> <device_name>"},
+ {"blockdev_detach", jt_blockdev_detach, 0,
+ "detach a lustre regular file from a virtual block device\n"
+ "usage: blockdev_detach <device_name>"},
+ {"blockdev_info", jt_blockdev_info, 0,
+ "get the device info of a attached file\n"
+ "usage: blockdev_info <device_name>"},
+
+ /* Pool commands */
+ {"=== Pools ==", jt_noop, 0, "pool management"},
+ {"pool_new", jt_pool_cmd, 0,
+ "add a new pool\n"
+ "usage: pool_new <fsname>.<poolname>"},
+ {"pool_add", jt_pool_cmd, 0,
+ "add the named OSTs to the pool\n"
+ "usage: pool_add <fsname>.<poolname> <ostname indexed list>"},
+ {"pool_remove", jt_pool_cmd, 0,
+ "remove the named OST from the pool\n"
+ "usage: pool_remove <fsname>.<poolname> <ostname indexed list>"},
+ {"pool_destroy", jt_pool_cmd, 0,
+ "destroy a pool\n"
+ "usage: pool_destroy <fsname>.<poolname>"},
+ {"pool_list", jt_pool_cmd, 0,
+ "list pools and pools members\n"
+ "usage: pool_list <fsname>[.<poolname>] | <pathname>"},
+
+ /* Nodemap commands */
+ {"=== Nodemap ===", jt_noop, 0, "nodemap management"},
+ {"nodemap_activate", jt_nodemap_activate, 0,
+ "activate nodemap idmapping functions\n"
+ "usage: nodemap_activate"},
+ {"nodemap_add", jt_nodemap_add, 0,
+ "add a new nodemap\n"
+ "usage: nodemap_add <nodemap_name>"},
+ {"nodemap_del", jt_nodemap_del, 0,
+ "remove a nodemap\n"
+ "usage: nodemap_del <nodemap_name>"},
+ {"nodemap_add_range", jt_nodemap_add_range, 0,
+ "add a range to a nodemap\n"
+ "usage: nodemap_add_range <NID range>"},
+ {"nodemap_del_range", jt_nodemap_del_range, 0,
+ "add a range to a nodemap\n"
+ "usage: nodemap_del_range <NID range>"},
+ {"nodemap_modify", jt_nodemap_modify, 0,
+ "modify a nodemap parameters"
+ "usage: nodemap_modify nodemap_name param value"},
+ {"nodemap_add_idmap", jt_nodemap_add_idmap, 0,
+ "add a UID or GID mapping to a nodemap"},
+ {"nodemap_del_idmap", jt_nodemap_del_idmap, 0,
+ "delete a UID or GID mapping from a nodemap"},
+ {"nodemap_test_nid", jt_nodemap_test_nid, 0,
+ "usage: nodemap_test_nid <nid>"},
+ {"nodemap_test_id", jt_nodemap_test_id, 0,
+ "Usage: nodemap_test_id --nid <nid> --idtype [uid|gid] --id <id>"},
+
+ /* 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>"},