From cf62f1947ff7af6bcb1b370b94c08ebf75cd230a Mon Sep 17 00:00:00 2001 From: Milind Changire Date: Wed, 17 Jan 2018 02:21:37 -0500 Subject: [PATCH] autobuild v3.12.2-2 Resolves: bz#1264911 bz#1277924 bz#1286820 bz#1360331 bz#1401969 Resolves: bz#1410719 bz#1419438 bz#1426042 bz#1444820 bz#1459101 Resolves: bz#1464150 bz#1464350 bz#1466122 bz#1466129 bz#1467903 Resolves: bz#1468972 bz#1476876 bz#1484446 bz#1492591 bz#1498391 Resolves: bz#1498730 bz#1499865 bz#1500704 bz#1501345 bz#1505570 Resolves: bz#1507361 bz#1507394 bz#1509102 bz#1509191 bz#1509810 Resolves: bz#1509833 bz#1511766 bz#1512470 bz#1512496 bz#1512963 Resolves: bz#1515051 bz#1519076 bz#1519740 bz#1534253 bz#1534530 Signed-off-by: Milind Changire --- 0075-cli-gluster-help-changes.patch | 749 ++++++++++++++ ...-ec-Handle-parallel-get_size_version.patch | 376 +++++++ ...c-add-functions-for-stripe-alignment.patch | 343 +++++++ ...r-default-timeout-of-5min-for-analyz.patch | 76 ++ ...ow-parallel-writes-in-EC-if-possible.patch | 959 ++++++++++++++++++ ...-heal-info-summary-to-list-the-statu.patch | 607 +++++++++++ ...er-dht-Don-t-set-ACLs-on-linkto-file.patch | 59 ++ ...t-heal-info-summary-output-in-stream.patch | 41 + ...t-heal-info-split-brain-output-in-st.patch | 55 + ...-afr-Fix-for-arbiter-becoming-source.patch | 237 +++++ ...ith-other-processes-accessing-the-mo.patch | 625 ++++++++++++ ...t-lvm-cleanup-during-snapshot-remove.patch | 59 ++ ...Validate-changelog-on-geo-rep-volume.patch | 134 +++ ...ster-ec-Implement-DISCARD-FOP-for-EC.patch | 731 +++++++++++++ ...geo-rep-Filter-out-volume-mark-xattr.patch | 43 + 0090-Quota-Adding-man-page-for-quota.patch | 75 ++ ...o-control-CPU-MEMORY-for-any-gluster.patch | 353 +++++++ ...eserve-disk-space-to-prevent-the-bri.patch | 533 ++++++++++ ...k-space-reserve-check-for-internal-F.patch | 324 ++++++ ...cluster-afr-Fail-open-on-split-brain.patch | 675 ++++++++++++ ...-errors-reported-via-shellcheck-util.patch | 309 ++++++ ...onour-all-input-arguments-to-scripts.patch | 225 ++++ 0097-extras-hooks-Fix-getopt-usage.patch | 164 +++ ...t-creation-failed-after-brick-reset-.patch | 138 +++ 0099-Tier-Stop-tierd-for-detach-start.patch | 676 ++++++++++++ ...ve-heal-info-command-to-handle-obvio.patch | 292 ++++++ ...nt-self-heal-to-work-after-PARENT_DO.patch | 188 ++++ ...ix-the-call_stack_set_group-function.patch | 261 +++++ 0103-features-locks-Fix-memory-leaks.patch | 116 +++ ...-fix-crash-when-deleting-directories.patch | 61 ++ 0105-glusterd-Fix-glusterd-mem-leaks.patch | 105 ++ ...rd-Free-up-svc-conn-on-volume-delete.patch | 42 + ...emove-internal-xattrs-from-lookup-cb.patch | 165 +++ ...stat-in-getattr-implementation-if-an.patch | 89 ++ ...fuse-never-fail-open-dir-with-ENOENT.patch | 41 + ...t-mount-fuse-report-ESTALE-as-ENOENT.patch | 57 ++ ...n-t-overfill-the-buffer-in-readdir-p.patch | 86 ++ ...ow-trickling-writes-to-be-configurab.patch | 79 ++ 0113-gfapi-set-lkowner-in-glfd.patch | 460 +++++++++ 0114-eventsapi-Add-JWT-signing-support.patch | 275 +++++ ...-signing-without-external-dependency.patch | 84 ++ ...eventsapi-HTTPS-support-for-Webhooks.patch | 242 +++++ 0117-geo-rep-Log-message-improvements.patch | 105 ++ ...rick-reset-replace-snapshot-creation.patch | 133 +++ ...ta-sync-issue-during-hardlink-rename.patch | 77 ++ ...-to-an-existing-brick-process-when-q.patch | 225 ++++ ...ec-OpenFD-heal-implementation-for-EC.patch | 572 +++++++++++ ...urandom-instead-of-dev-random-for-dd.patch | 42 + ...e-in-quota.conf-when-setting-large-n.patch | 155 +++ ...-remove-ExclusiveArch-from-spec-file.patch | 48 + ...ng-the-flaws-in-arbiter-becoming-sou.patch | 903 +++++++++++++++++ ...-files-found-for-RHEL-7-client-build.patch | 46 + ...-files-found-for-RHEL-7-client-build.patch | 51 + ...d-remove-pretrans-script-for-ganesha.patch | 87 ++ glusterfs.spec | 113 ++- 55 files changed, 13722 insertions(+), 44 deletions(-) create mode 100644 0075-cli-gluster-help-changes.patch create mode 100644 0076-cluster-ec-Handle-parallel-get_size_version.patch create mode 100644 0077-cluster-ec-add-functions-for-stripe-alignment.patch create mode 100644 0078-cluster-afr-Honor-default-timeout-of-5min-for-analyz.patch create mode 100644 0079-cluster-ec-Allow-parallel-writes-in-EC-if-possible.patch create mode 100644 0080-heal-New-feature-heal-info-summary-to-list-the-statu.patch create mode 100644 0081-cluster-dht-Don-t-set-ACLs-on-linkto-file.patch create mode 100644 0082-cluster-afr-Print-heal-info-summary-output-in-stream.patch create mode 100644 0083-cluster-afr-Print-heal-info-split-brain-output-in-st.patch create mode 100644 0084-cluster-afr-Fix-for-arbiter-becoming-source.patch create mode 100644 0085-snapshot-Issue-with-other-processes-accessing-the-mo.patch create mode 100644 0086-snapshot-lvm-cleanup-during-snapshot-remove.patch create mode 100644 0087-glusterd-Validate-changelog-on-geo-rep-volume.patch create mode 100644 0088-cluster-ec-Implement-DISCARD-FOP-for-EC.patch create mode 100644 0089-geo-rep-Filter-out-volume-mark-xattr.patch create mode 100644 0090-Quota-Adding-man-page-for-quota.patch create mode 100644 0091-extras-scripts-to-control-CPU-MEMORY-for-any-gluster.patch create mode 100644 0092-posix-Needs-to-reserve-disk-space-to-prevent-the-bri.patch create mode 100644 0093-posix-Ignore-disk-space-reserve-check-for-internal-F.patch create mode 100644 0094-cluster-afr-Fail-open-on-split-brain.patch create mode 100644 0095-extras-hooks-Fix-errors-reported-via-shellcheck-util.patch create mode 100644 0096-extras-hooks-Honour-all-input-arguments-to-scripts.patch create mode 100644 0097-extras-hooks-Fix-getopt-usage.patch create mode 100644 0098-snapshot-snapshot-creation-failed-after-brick-reset-.patch create mode 100644 0099-Tier-Stop-tierd-for-detach-start.patch create mode 100644 0100-cluster-ec-Improve-heal-info-command-to-handle-obvio.patch create mode 100644 0101-cluster-ec-Prevent-self-heal-to-work-after-PARENT_DO.patch create mode 100644 0102-libglusterfs-fix-the-call_stack_set_group-function.patch create mode 100644 0103-features-locks-Fix-memory-leaks.patch create mode 100644 0104-cluster-dht-fix-crash-when-deleting-directories.patch create mode 100644 0105-glusterd-Fix-glusterd-mem-leaks.patch create mode 100644 0106-glusterd-Free-up-svc-conn-on-volume-delete.patch create mode 100644 0107-feature-bitrot-remove-internal-xattrs-from-lookup-cb.patch create mode 100644 0108-mount-fuse-use-fstat-in-getattr-implementation-if-an.patch create mode 100644 0109-mount-fuse-never-fail-open-dir-with-ENOENT.patch create mode 100644 0110-Revert-mount-fuse-report-ESTALE-as-ENOENT.patch create mode 100644 0111-cluster-dht-don-t-overfill-the-buffer-in-readdir-p.patch create mode 100644 0112-write-behind-Allow-trickling-writes-to-be-configurab.patch create mode 100644 0113-gfapi-set-lkowner-in-glfd.patch create mode 100644 0114-eventsapi-Add-JWT-signing-support.patch create mode 100644 0115-eventsapi-JWT-signing-without-external-dependency.patch create mode 100644 0116-eventsapi-HTTPS-support-for-Webhooks.patch create mode 100644 0117-geo-rep-Log-message-improvements.patch create mode 100644 0118-snapshot-after-brick-reset-replace-snapshot-creation.patch create mode 100644 0119-geo-rep-Fix-data-sync-issue-during-hardlink-rename.patch create mode 100644 0120-glusterd-connect-to-an-existing-brick-process-when-q.patch create mode 100644 0121-cluster-ec-OpenFD-heal-implementation-for-EC.patch create mode 100644 0122-tests-Use-dev-urandom-instead-of-dev-random-for-dd.patch create mode 100644 0123-quota-fixes-issue-in-quota.conf-when-setting-large-n.patch create mode 100644 0124-build-remove-ExclusiveArch-from-spec-file.patch create mode 100644 0125-cluster-afr-Fixing-the-flaws-in-arbiter-becoming-sou.patch create mode 100644 0126-spec-unpackaged-files-found-for-RHEL-7-client-build.patch create mode 100644 0127-spec-unpackaged-files-found-for-RHEL-7-client-build.patch create mode 100644 0128-build-remove-pretrans-script-for-ganesha.patch diff --git a/0075-cli-gluster-help-changes.patch b/0075-cli-gluster-help-changes.patch new file mode 100644 index 0000000..98d47a5 --- /dev/null +++ b/0075-cli-gluster-help-changes.patch @@ -0,0 +1,749 @@ +From fb84f6c69385e35f3a62504dfebc11b21ff4082a Mon Sep 17 00:00:00 2001 +From: N Balachandran +Date: Mon, 6 Nov 2017 09:30:54 +0530 +Subject: [PATCH 075/128] cli: gluster help changes + +gluster cli help now shows only the top level +help commands. gluster help will now show +help commands for . + +> BUG: 1474768 +> Signed-off-by: N Balachandran +> BUG: 1509786 +> https://review.gluster.org/#/c/18666/ +> Signed-off-by: N Balachandran + +(cherry picked from commit 89dc54f50c9f800ca4446ea8fe736e4860588845) +Change-Id: I263f53a0870d80ef4cfaad455fdaa47e2ac4423b +BUG: 1498730 +Signed-off-by: N Balachandran +Reviewed-on: https://code.engineering.redhat.com/gerrit/123525 +Tested-by: RHGS Build Bot +Reviewed-by: Atin Mukherjee +--- + cli/src/cli-cmd-global.c | 3 + + cli/src/cli-cmd-misc.c | 77 ++++++++-- + cli/src/cli-cmd-parser.c | 20 ++- + cli/src/cli-cmd-peer.c | 9 +- + cli/src/cli-cmd-snapshot.c | 5 + + cli/src/cli-cmd-volume.c | 347 ++++++++++++++++++++++++++++++++++++++------- + cli/src/cli.c | 2 +- + 7 files changed, 387 insertions(+), 76 deletions(-) + +diff --git a/cli/src/cli-cmd-global.c b/cli/src/cli-cmd-global.c +index 881506b..1f9cb54 100644 +--- a/cli/src/cli-cmd-global.c ++++ b/cli/src/cli-cmd-global.c +@@ -68,11 +68,14 @@ cli_cmd_global_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, + count = (sizeof (global_cmds) / sizeof (struct cli_cmd)); + cli_cmd_sort (cmd, count); + ++ cli_out ("\ngluster global commands"); ++ cli_out ("========================\n"); + for (global_cmd = cmd; global_cmd->pattern; global_cmd++) + if (_gf_false == global_cmd->disable) + cli_out ("%s - %s", global_cmd->pattern, + global_cmd->desc); + ++ cli_out ("\n"); + GF_FREE (cmd); + return 0; + } +diff --git a/cli/src/cli-cmd-misc.c b/cli/src/cli-cmd-misc.c +index 9f8c159..c887515 100644 +--- a/cli/src/cli-cmd-misc.c ++++ b/cli/src/cli-cmd-misc.c +@@ -23,6 +23,9 @@ extern struct rpc_clnt *global_rpc; + extern rpc_clnt_prog_t *cli_rpc_prog; + + extern struct cli_cmd volume_cmds[]; ++extern struct cli_cmd bitrot_cmds[]; ++extern struct cli_cmd quota_cmds[]; ++extern struct cli_cmd tier_cmds[]; + extern struct cli_cmd cli_probe_cmds[]; + extern struct cli_cmd cli_log_cmds[]; + extern struct cli_cmd cli_system_cmds[]; +@@ -38,37 +41,76 @@ cli_cmd_quit_cbk (struct cli_state *state, struct cli_cmd_word *word, + exit (0); + } + ++ ++static gf_boolean_t ++cli_is_help_command (const char *pattern) ++{ ++ /* FixFixFix ++ * This is not the best way to determine whether ++ * this is a help command ++ */ ++ if (strstr (pattern, "help")) ++ return _gf_true; ++ ++ return _gf_false; ++} ++ ++ + int + cli_cmd_display_help (struct cli_state *state, struct cli_cmd_word *in_word, + const char **words, int wordcount) + { +- struct cli_cmd *cmd[] = {volume_cmds, cli_probe_cmds, +- cli_misc_cmds, snapshot_cmds, +- global_cmds, NULL}; +- struct cli_cmd *cmd_ind = NULL; +- int i = 0; ++ struct cli_cmd *cmd[] = {cli_misc_cmds, cli_probe_cmds, ++ volume_cmds, bitrot_cmds, quota_cmds, ++#if !defined(__NetBSD__) ++ tier_cmds, ++#endif ++ snapshot_cmds, global_cmds, NULL}; ++ struct cli_cmd *cmd_ind = NULL; ++ int i = 0; ++ gf_boolean_t list_all = _gf_false; + + /* cli_system_cmds commands for internal usage + they are not exposed + */ +- for (i=0; cmd[i]!=NULL; i++) +- for (cmd_ind = cmd[i]; cmd_ind->pattern; cmd_ind++) +- if (_gf_false == cmd_ind->disable) +- cli_out ("%s - %s", cmd_ind->pattern, +- cmd_ind->desc); + ++ /* If "help all" */ ++ if (wordcount == 2) ++ list_all = _gf_true; ++ ++ for (i = 0; cmd[i] != NULL; i++) { ++ for (cmd_ind = cmd[i]; cmd_ind->pattern; cmd_ind++) { ++ if ((_gf_false == cmd_ind->disable) && ++ cli_is_help_command (cmd_ind->pattern)) { ++ if (list_all && (cmd_ind->cbk)) { ++ cmd_ind->cbk (state, in_word, words, ++ wordcount); ++ } else { ++ cli_out (" %-25s- %s", cmd_ind->pattern, ++ cmd_ind->desc); ++ } ++ } ++ } ++ } ++ ++ cli_out ("\n"); + return 0; + } + ++ ++struct cli_cmd cli_help_cmds[] = { ++ { "help [all]", ++ cli_cmd_display_help, ++ "display help for command classes"}, ++ ++ { NULL, NULL, NULL } ++}; ++ ++ + struct cli_cmd cli_misc_cmds[] = { + { "quit", + cli_cmd_quit_cbk, + "quit"}, +- +- { "help", +- cli_cmd_display_help, +- "display command options"}, +- + { "exit", + cli_cmd_quit_cbk, + "exit"}, +@@ -84,7 +126,12 @@ cli_cmd_misc_register (struct cli_state *state) + struct cli_cmd *cmd = NULL; + + for (cmd = cli_misc_cmds; cmd->pattern; cmd++) { ++ ret = cli_cmd_register (&state->tree, cmd); ++ if (ret) ++ goto out; ++ } + ++ for (cmd = cli_help_cmds; cmd->pattern; cmd++) { + ret = cli_cmd_register (&state->tree, cmd); + if (ret) + goto out; +diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c +index a35fc74..c95b262 100644 +--- a/cli/src/cli-cmd-parser.c ++++ b/cli/src/cli-cmd-parser.c +@@ -1189,8 +1189,13 @@ cli_cmd_quota_parse (const char **words, int wordcount, dict_t **options) + goto out; + } + +- if (wordcount < 4) ++ if (wordcount < 4) { ++ ++ if ((wordcount == 3) && !(strcmp (words[2], "help"))) { ++ ret = 1; ++ } + goto out; ++ } + + volname = (char *)words[2]; + if (!volname) { +@@ -5588,15 +5593,22 @@ cli_cmd_bitrot_parse (const char **words, int wordcount, dict_t **options) + GF_ASSERT (words); + GF_ASSERT (options); + +- dict = dict_new (); +- if (!dict) +- goto out; ++ ++ /* Hack to print out bitrot help properly */ ++ if ((wordcount == 3) && !(strcmp (words[2], "help"))) { ++ ret = 1; ++ return ret; ++ } + + if (wordcount < 4 || wordcount > 5) { + gf_log ("cli", GF_LOG_ERROR, "Invalid syntax"); + goto out; + } + ++ dict = dict_new (); ++ if (!dict) ++ goto out; ++ + volname = (char *)words[2]; + if (!volname) { + ret = -1; +diff --git a/cli/src/cli-cmd-peer.c b/cli/src/cli-cmd-peer.c +index 4802f71..7df60bc 100644 +--- a/cli/src/cli-cmd-peer.c ++++ b/cli/src/cli-cmd-peer.c +@@ -264,7 +264,7 @@ struct cli_cmd cli_probe_cmds[] = { + + { "peer help", + cli_cmd_peer_help_cbk, +- "Help command for peer "}, ++ "display help for peer commands"}, + + { "pool list", + cli_cmd_pool_list_cbk, +@@ -281,17 +281,20 @@ cli_cmd_peer_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, + struct cli_cmd *probe_cmd = NULL; + int count = 0; + ++ cli_out ("\ngluster peer commands"); ++ cli_out ("======================\n"); ++ + cmd = GF_CALLOC (1, sizeof (cli_probe_cmds), cli_mt_cli_cmd); + memcpy (cmd, cli_probe_cmds, sizeof (cli_probe_cmds)); + count = (sizeof (cli_probe_cmds) / sizeof (struct cli_cmd)); + cli_cmd_sort (cmd, count); + +- +- + for (probe_cmd = cmd; probe_cmd->pattern; probe_cmd++) + cli_out ("%s - %s", probe_cmd->pattern, probe_cmd->desc); + + GF_FREE (cmd); ++ ++ cli_out ("\n"); + return 0; + } + +diff --git a/cli/src/cli-cmd-snapshot.c b/cli/src/cli-cmd-snapshot.c +index e79128c..88b4737 100644 +--- a/cli/src/cli-cmd-snapshot.c ++++ b/cli/src/cli-cmd-snapshot.c +@@ -140,9 +140,14 @@ cli_cmd_snapshot_help_cbk (struct cli_state *state, + count = (sizeof (snapshot_cmds) / sizeof (struct cli_cmd)); + cli_cmd_sort (cmd, count); + ++ cli_out ("\ngluster snapshot commands"); ++ cli_out ("=========================\n"); ++ + for (snap_cmd = cmd; snap_cmd->pattern; snap_cmd++) + if (_gf_false == snap_cmd->disable) + cli_out ("%s - %s", snap_cmd->pattern, snap_cmd->desc); ++ cli_out ("\n"); ++ + GF_FREE (cmd); + return 0; + } +diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c +index ca9da0a..a1e5c51 100644 +--- a/cli/src/cli-cmd-volume.c ++++ b/cli/src/cli-cmd-volume.c +@@ -36,7 +36,19 @@ extern rpc_clnt_prog_t cli_quotad_clnt; + + int + cli_cmd_volume_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, +- const char **words, int wordcount); ++ const char **words, int wordcount); ++ ++int ++cli_cmd_bitrot_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, ++ const char **words, int wordcount); ++ ++int ++cli_cmd_quota_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, ++ const char **words, int wordcount); ++ ++int ++cli_cmd_tier_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word, ++ const char **words, int wordcount); + + int + cli_cmd_volume_info_cbk (struct cli_state *state, struct cli_cmd_word *word, +@@ -1293,9 +1305,12 @@ cli_cmd_volume_tier_cbk (struct cli_state *state, + + + if (wordcount < 4) { +- cli_usage_out (word->pattern); +- if (wordcount == 3 && !strcmp(words[2], "help")) ++ if (wordcount == 3 && !strcmp(words[2], "help")) { ++ cli_cmd_tier_help_cbk (state, word, words, wordcount); + ret = 0; ++ } else { ++ cli_usage_out (word->pattern); ++ } + goto out; + } + +@@ -1719,6 +1734,8 @@ out: + return ret; + } + ++ ++ + int + cli_cmd_bitrot_cbk (struct cli_state *state, struct cli_cmd_word *word, + const char **words, int wordcount) +@@ -1746,6 +1763,13 @@ cli_cmd_bitrot_cbk (struct cli_state *state, struct cli_cmd_word *word, + goto out; + } + ++ if (ret == 1) { ++ /* this is 'volume bitrot help' */ ++ cli_cmd_bitrot_help_cbk (state, word, words, wordcount); ++ ret = 0; ++ goto out2; ++ } ++ + frame = create_frame (THIS, THIS->ctx->pool); + if (!frame) { + ret = -1; +@@ -1834,7 +1858,7 @@ out: + #endif + + CLI_STACK_DESTROY (frame); +- ++out2: + return ret; + } + +@@ -1866,6 +1890,12 @@ cli_cmd_quota_cbk (struct cli_state *state, struct cli_cmd_word *word, + } + } else { + ret = cli_cmd_quota_parse (words, wordcount, &options); ++ ++ if (ret == 1) { ++ cli_cmd_quota_help_cbk (state, word, words, wordcount); ++ ret = 0; ++ goto out; ++ } + if (ret < 0) { + cli_usage_out (word->pattern); + parse_err = 1; +@@ -3157,7 +3187,159 @@ out: + return ret; + } + ++ ++/* This is a bit of a hack to display the help. The current bitrot cmd ++ * format does not work well when registering the cmds. ++ * Ideally the should have been of the form ++ * gluster volume bitrot ... ++ */ ++ ++struct cli_cmd bitrot_cmds[] = { ++ ++ {"volume bitrot help", ++ cli_cmd_bitrot_help_cbk, ++ "display help for volume bitrot commands" ++ }, ++ ++ {"volume bitrot {enable|disable}", ++ NULL, /*cli_cmd_bitrot_cbk,*/ ++ "Enable/disable bitrot for volume " ++ }, ++ ++ {"volume bitrot scrub-throttle {lazy|normal|aggressive}", ++ NULL, /*cli_cmd_bitrot_cbk,*/ ++ "Set the speed of the scrubber for volume " ++ }, ++ ++ {"volume bitrot scrub-frequency {hourly|daily|weekly|biweekly" ++ "|monthly}", ++ NULL, /*cli_cmd_bitrot_cbk,*/ ++ "Set the frequency of the scrubber for volume " ++ }, ++ ++ {"volume bitrot scrub {pause|resume|status|ondemand}", ++ NULL, /*cli_cmd_bitrot_cbk,*/ ++ "Pause/resume the scrubber for . Status displays the status of " ++ "the scrubber. ondemand starts the scrubber immediately." ++ }, ++ ++ {"volume bitrot {enable|disable}\n" ++ "volume bitrot scrub-throttle {lazy|normal|aggressive}\n" ++ "volume bitrot scrub-frequency {hourly|daily|weekly|biweekly" ++ "|monthly}\n" ++ "volume bitrot scrub {pause|resume|status|ondemand}", ++ cli_cmd_bitrot_cbk, ++ NULL ++ }, ++ ++ { NULL, NULL, NULL } ++}; ++ ++ ++struct cli_cmd quota_cmds[] = { ++ ++ /* Quota commands */ ++ {"volume quota help", ++ cli_cmd_quota_help_cbk, ++ "display help for volume quota commands" ++ }, ++ ++ {"volume quota {enable|disable|list [ ...]| " ++ "list-objects [ ...] | remove | remove-objects | " ++ "default-soft-limit }", ++ cli_cmd_quota_cbk, ++ "Enable/disable and configure quota for " ++ }, ++ ++ {"volume quota {limit-usage []}", ++ cli_cmd_quota_cbk, ++ "Set maximum size for for " ++ }, ++ ++ {"volume quota {limit-objects []}", ++ cli_cmd_quota_cbk, ++ "Set the maximum number of entries allowed in for " ++ }, ++ ++ {"volume quota {alert-time|soft-timeout|hard-timeout} {