Whamcloud - gitweb
LU-14044 llog: check fid after convert
[fs/lustre-release.git] / lustre / utils / lctl.c
index 4ed25e8..830d240 100644 (file)
 
 static int lctl_list_commands(int argc, char **argv);
 
-static int jt_opt_ignore_errors(int argc, char **argv) {
-        Parser_ignore_errors(1);
-        return 0;
+static int jt_opt_ignore_errors(int argc, char **argv)
+{
+       Parser_ignore_errors(1);
+       return 0;
 }
 
+static int jt_pcc_list_commands(int argc, char **argv);
+static int jt_pcc(int argc, char **argv);
+
+/**
+ * command_t pccdev_cmdlist - lctl pcc commands.
+ */
+command_t pccdev_cmdlist[] = {
+       { .pc_name = "add", .pc_func = jt_pcc_add,
+         .pc_help = "Add a PCC backend to a client.\n"
+               "usage: lctl pcc add <mntpath> <pccpath> [--param|-p <param>]\n"
+               "\tmntpath: Lustre mount point.\n"
+               "\tpccpath: Path of the PCC backend.\n"
+               "\tparam:   Setting parameters for PCC backend.\n" },
+       { .pc_name = "del", .pc_func = jt_pcc_del,
+         .pc_help = "Delete the specified PCC backend on a client.\n"
+               "usage: clt pcc del <mntpath> <pccpath>\n" },
+       { .pc_name = "clear", .pc_func = jt_pcc_clear,
+         .pc_help = "Remove all PCC backend on a client.\n"
+               "usage: lctl pcc clear <mntpath>\n" },
+       { .pc_name = "list", .pc_func = jt_pcc_list,
+         .pc_help = "List all PCC backends on a client.\n"
+               "usage: lctl pcc list <mntpath>\n" },
+       { .pc_name = "list-commands", .pc_func = jt_pcc_list_commands,
+         .pc_help = "list commands supported by lctl pcc"},
+       { .pc_name = "help", .pc_func = Parser_help, .pc_help = "help" },
+       { .pc_name = "exit", .pc_func = Parser_quit, .pc_help = "quit" },
+       { .pc_name = "quit", .pc_func = Parser_quit, .pc_help = "quit" },
+       { .pc_help = NULL }
+};
+
 command_t cmdlist[] = {
        /* Metacommands */
        {"===== metacommands =======", NULL, 0, "metacommands"},
@@ -84,13 +115,13 @@ command_t cmdlist[] = {
        {"===== network config =====", NULL, 0, "network config"},
        {"--net", jt_opt_net, 0, "run <command> after selecting network <net>\n"
         "usage: --net <tcp/o2ib/...> <command>"},
-       {"network", jt_ptl_network, 0, "configure LNET"
+       {"network", jt_ptl_network, 0, "configure LNET\n"
         "usage: network up|down"},
-       {"net", jt_ptl_network, 0, "configure LNET"
+       {"net", jt_ptl_network, 0, "configure LNET\n"
         "usage: net up|down"},
-       {"list_nids", jt_ptl_list_nids, 0, "list local NIDs"
+       {"list_nids", jt_ptl_list_nids, 0, "list local NIDs\n"
         "usage: list_nids [all]"},
-       {"which_nid", jt_ptl_which_nid, 0, "choose a NID"
+       {"which_nid", jt_ptl_which_nid, 0, "choose a NID\n"
         "usage: which_nid NID [NID...]"},
        {"replace_nids", jt_replace_nids, 0,
         "replace primary NIDs for a device\n"
@@ -161,6 +192,8 @@ command_t cmdlist[] = {
         "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"},
+       {"abort_recovery_mdt", jt_obd_abort_recovery_mdt, 0,
+        "abort recovery between MDTs\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)
@@ -321,7 +354,7 @@ command_t cmdlist[] = {
         "add a range to a nodemap\n"
         "usage: nodemap_del_range <nid_range>"},
        {"nodemap_modify", jt_nodemap_modify, 0,
-        "modify a nodemap parameters"
+        "modify a nodemap parameters\n"
         "usage: nodemap_modify nodemap_name param value"},
        {"nodemap_add_idmap", jt_nodemap_add_idmap, 0,
         "add a UID or GID mapping to a nodemap"},
@@ -349,6 +382,15 @@ command_t cmdlist[] = {
         "deregister an existing changelog user\n"
         "usage: --device <mdtname> changelog_deregister <id>"},
 
+       /* Persistent Client Cache (PCC) commands */
+       {"=== Persistent Client Cache ===", NULL, 0, "PCC user management"},
+       {"pcc", jt_pcc, pccdev_cmdlist,
+        "lctl commands used to interact with PCC features:\n"
+        "lctl pcc add    - add a PCC backend to a client\n"
+        "lctl pcc del    - delete a PCC backend on a client\n"
+        "lctl pcc clear  - remove all PCC backends on a client\n"
+        "lctl pcc list   - list all PCC backends on a client\n"},
+
        /* Device configuration commands */
        {"== device setup (these are not normally used post 1.4) ==",
                NULL, 0, "device config"},
@@ -382,8 +424,10 @@ command_t cmdlist[] = {
         "usage: lookup <directory> <file>"},
        {"readonly", jt_obd_set_readonly, 0,
         "disable writes to the underlying device\n"},
+#ifdef HAVE_SERVER_SUPPORT
        {"notransno", jt_obd_no_transno, 0,
         "disable sending of committed-transno updates\n"},
+#endif
        {"add_uuid", jt_lcfg_add_uuid, 0, "associate a UUID with a NID\n"
         "usage: add_uuid <uuid> <nid>"},
        {"del_uuid", jt_lcfg_del_uuid, 0, "delete a UUID association\n"
@@ -466,62 +510,57 @@ command_t cmdlist[] = {
        /* LFSCK commands */
        {"==== LFSCK ====", NULL, 0, "LFSCK"},
        {"lfsck_start", jt_lfsck_start, 0, "start LFSCK\n"
-        "usage: lfsck_start [-M | --device [MDT,OST]_device]\n"
-        "                   [-A | --all] [-c | --create-ostobj [on | off]]\n"
-        "                   [-C | --create-mdtobj [on | off]]\n"
-        "                   [-d | --delay-create-ostobj [on | off]]\n"
-        "                   [-e | --error {continue | abort}] [-h | --help]\n"
-        "                   [-n | --dryrun [on | off]] [-o | --orphan]\n"
-        "                   [-r | --reset] [-s | --speed speed_limit]\n"
-        "                   [-t | --type lfsck_type[,lfsck_type...]]\n"
-        "                   [-w | --window-size size]"},
+        "usage: lfsck_start [--device|-M [MDT,OST]_device]\n"
+        "                   [--all|-A] [--create-ostobj|-c [on | off]]\n"
+        "                   [--create-mdtobj|-C [on | off]]\n"
+        "                   [--delay-create-ostobj|-d [on | off]]\n"
+        "                   [--error|-e {continue | abort}] [--help|-h]\n"
+        "                   [--dryrun|-n [on | off]] [--orphan|-o]\n"
+        "                   [--reset|-r] [--speed|-s speed_limit]\n"
+        "                   [--type|-t lfsck_type[,lfsck_type...]]\n"
+        "                   [--window-size|-w size]"},
        {"lfsck_stop", jt_lfsck_stop, 0, "stop lfsck(s)\n"
-        "usage: lfsck_stop [-M | --device [MDT,OST]_device]\n"
-        "                  [-A | --all] [-h | --help]"},
+        "usage: lfsck_stop [--device|-M [MDT,OST]_device]\n"
+        "                  [--all|-A] [--help|-h]"},
        {"lfsck_query", jt_lfsck_query, 0, "check lfsck(s) status\n"
-        "usage: lfsck_query [-M | --device MDT_device] [-h | --help]\n"
-        "                   [-t | --type lfsck_type[,lfsck_type...]]\n"
-        "                   [-w | --wait]"},
+        "usage: lfsck_query [--device|-M MDT_device] [--help|-h]\n"
+        "                   [--type|-t lfsck_type[,lfsck_type...]]\n"
+        "                   [--wait|-w]"},
 #endif /* HAVE_SERVER_SUPPORT */
-       {"==== obsolete (DANGEROUS) ====", NULL, 0, "obsolete (DANGEROUS)"},
-       /* some test scripts still use these */
        {"cfg_device", jt_obd_device, 0,
         "set current device to <name>\n"
         "usage: device <name>"},
        {"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 <mountpoint>"},
        /* Llog operations */
        {"llog_catlist", jt_llog_catlist, 0,
-        "list all catalog logs on current device.\n"
+        "list all catalog files on current device. If current device is not\n"
+        "set, MGS device is used by default.\n"
         "usage: llog_catlist"},
        {"llog_info", jt_llog_info, 0,
         "print log header information.\n"
-        "usage: llog_info <logname|[FID]>\n"
-        "       oid, ogr and ogen are hexadecimal."},
+        "usage: llog_info <logname|LLOG_ID>\n"},
        {"llog_print", jt_llog_print, 0,
         "print log content information.\n"
-        "usage: llog_print <logname|[FID]> [start_index [end_index]]\n"
-        "       print all records from index 1 by default."},
+        "usage: llog_print <logname|LLOG_ID> [--start <index>] [--end <index>j]\n"
+        "       print all records by default, or within given index range."},
+       {"llog_cancel", jt_llog_cancel, 0,
+        "cancel one record in specified log.\n"
+        "usage:llog_cancel <logname|LLOG_ID> --log_idx <idx>\n"},
        {"llog_check", jt_llog_check, 0,
-        "print log content information.\n"
-        "usage: llog_check <logname|[FID]> [start_index] [end_index]\n"
+        "verify that log content is valid.\n"
+        "usage: llog_check <logname|LLOG_ID> [--start <index>] [--end <index>j]\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 <catalog name|[FID]> [log id] <index>\n"
-        "usage (optional args): "
-        "llog_cancel --catalog <catalog id|catalog name> --log_id <log_id> "
-        "--log_idx <index>"},
        {"llog_remove", jt_llog_remove, 0,
         "remove one log from catalog or plain log, erase it from disk.\n"
-        "usage: llog_remove <catalog name|[FID]> <log id>"},
+        "usage: llog_remove <logname|LLOG_ID> [--log_id <id>]"},
+       {"==== obsolete (DANGEROUS) ====", NULL, 0, "obsolete (DANGEROUS)"},
+       /* some test scripts still use these */
+       /* saving for sanity 44a */
+       {"lov_getconfig", jt_obd_lov_getconfig, 0,
+        "read lov configuration from an mds device\n"
+        "usage: lov_getconfig <mountpoint>"},
        /* network operations */
        {"add_interface", jt_ptl_add_interface, 0, "add interface entry\n"
         "usage: add_interface ip [netmask]"},
@@ -540,31 +579,80 @@ command_t cmdlist[] = {
        { 0, 0, 0, NULL }
 };
 
+/**
+ * jt_pcc_list_commands() - List lctl pcc commands.
+ * @argc: The count of command line arguments.
+ * @argv: Array of strings for command line arguments.
+ *
+ * This function lists lctl pcc commands defined in pccdev_cmdlist[].
+ *
+ * Return: 0 on success.
+ */
+static int jt_pcc_list_commands(int argc, char **argv)
+{
+       char buffer[81] = "";
+
+       Parser_list_commands(pccdev_cmdlist, buffer, sizeof(buffer),
+                            NULL, 0, 4);
+
+       return 0;
+}
+
+/**
+ * jt_pcc() - Parse and execute lctl pcc commands.
+ * @argc: The count of lctl pcc command line arguments.
+ * @argv: Array of strings for lctl pcc command line arguments.
+ *
+ * This function parses lfs pcc commands and performs the
+ * corresponding functions specified in pccdev_cmdlist[].
+ *
+ * Return: 0 on success or an error code on failure.
+ */
+static int jt_pcc(int argc, char **argv)
+{
+       char cmd[PATH_MAX];
+       int rc = 0;
+
+       setlinebuf(stdout);
+
+       Parser_init("lctl-pcc > ", pccdev_cmdlist);
+
+       snprintf(cmd, sizeof(cmd), "%s %s", program_invocation_short_name,
+                argv[0]);
+       program_invocation_short_name = cmd;
+       if (argc > 1)
+               rc = Parser_execarg(argc - 1, argv + 1, pccdev_cmdlist);
+       else
+               rc = Parser_commands();
+
+       return rc < 0 ? -rc : rc;
+}
+
 int lctl_main(int argc, char **argv)
 {
-        int rc;
+       int rc;
 
-        setlinebuf(stdout);
+       setlinebuf(stdout);
 
        if (ptl_initialize(argc, argv) < 0)
                exit(1);
-        if (obd_initialize(argc, argv) < 0)
-                exit(2);
-        if (dbg_initialize(argc, argv) < 0)
-                exit(3);
+       if (obd_initialize(argc, argv) < 0)
+               exit(2);
+       if (dbg_initialize(argc, argv) < 0)
+               exit(3);
 
        Parser_init("lctl > ", cmdlist);
 
-        if (argc > 1) {
+       if (argc > 1) {
                llapi_set_command_name(argv[1]);
-                rc = Parser_execarg(argc - 1, argv + 1, cmdlist);
+               rc = Parser_execarg(argc - 1, argv + 1, cmdlist);
                llapi_clear_command_name();
-        } else {
-                rc = Parser_commands();
-        }
+       } else {
+               rc = Parser_commands();
+       }
 
-        obd_finalize(argc, argv);
-        return rc < 0 ? -rc : rc;
+       obd_finalize(argc, argv);
+       return rc < 0 ? -rc : rc;
 }
 
 static int lctl_list_commands(int argc, char **argv)