btrfs-progs: send: add quiet option

Add new options -q,--quiet to prevent printing messages on stderr, added
--verbose as alternative for -v.  Moved 'Mode NO_FILE_DATA enabled'
message to stderr. The default verboisty level is 1 to keep some
backward compatibility.

Signed-off-by: M G Berberich <btrfs@oss.m-berberich.de>
[ minor adjustments in the options, help text and changelog, added
  manual page text ]
Signed-off-by: David Sterba <dsterba@suse.com>
master
M G Berberich 2016-05-12 21:49:25 +02:00 committed by David Sterba
parent 2e8b5209c8
commit 09c052a8b4
2 changed files with 26 additions and 12 deletions

View File

@ -37,9 +37,6 @@ are exactly in the same state on both sides, the sender and the receiver.
`Options` `Options`
-v::
enable verbose output, print generated commands in a readable form, (each
occurrence of this option increases the verbosity level)
-e:: -e::
if sending multiple subvolumes at once, use the new format and omit the if sending multiple subvolumes at once, use the new format and omit the
'end cmd' marker in the stream separating the subvolumes 'end cmd' marker in the stream separating the subvolumes
@ -56,6 +53,11 @@ send in 'NO_FILE_DATA' mode
The output stream does not contain any file The output stream does not contain any file
data and thus cannot be used to transfer changes. This mode is faster and data and thus cannot be used to transfer changes. This mode is faster and
useful to show the differences in metadata. useful to show the differences in metadata.
-v|--verbose::
enable verbose output, print generated commands in a readable form, (each
occurrence of this option increases the verbosity level)
-q|--quiet::
suppress all messagese except errors
EXIT STATUS EXIT STATUS
----------- -----------

View File

@ -44,7 +44,11 @@
#include "send.h" #include "send.h"
#include "send-utils.h" #include "send-utils.h"
static int g_verbose = 0; /*
* Default is 1 for historical reasons, changing may break scripts that expect
* the 'At subvol' message.
*/
static int g_verbose = 1;
struct btrfs_send { struct btrfs_send {
int send_fd; int send_fd;
@ -301,10 +305,10 @@ static int do_send(struct btrfs_send *send, u64 parent_root_id,
"Try upgrading your kernel or don't use -e.\n"); "Try upgrading your kernel or don't use -e.\n");
goto out; goto out;
} }
if (g_verbose > 0) if (g_verbose > 1)
fprintf(stderr, "BTRFS_IOC_SEND returned %d\n", ret); fprintf(stderr, "BTRFS_IOC_SEND returned %d\n", ret);
if (g_verbose > 0) if (g_verbose > 1)
fprintf(stderr, "joining genl thread\n"); fprintf(stderr, "joining genl thread\n");
close(pipefd[1]); close(pipefd[1]);
@ -429,9 +433,11 @@ int cmd_send(int argc, char **argv)
while (1) { while (1) {
enum { GETOPT_VAL_SEND_NO_DATA = 256 }; enum { GETOPT_VAL_SEND_NO_DATA = 256 };
static const struct option long_options[] = { static const struct option long_options[] = {
{ "verbose", no_argument, NULL, 'v' },
{ "quiet", no_argument, NULL, 'q' },
{ "no-data", no_argument, NULL, GETOPT_VAL_SEND_NO_DATA } { "no-data", no_argument, NULL, GETOPT_VAL_SEND_NO_DATA }
}; };
int c = getopt_long(argc, argv, "vec:f:i:p:", long_options, NULL); int c = getopt_long(argc, argv, "vqec:f:i:p:", long_options, NULL);
if (c < 0) if (c < 0)
break; break;
@ -440,6 +446,9 @@ int cmd_send(int argc, char **argv)
case 'v': case 'v':
g_verbose++; g_verbose++;
break; break;
case 'q':
g_verbose = 0;
break;
case 'e': case 'e':
new_end_cmd_semantic = 1; new_end_cmd_semantic = 1;
break; break;
@ -622,8 +631,9 @@ int cmd_send(int argc, char **argv)
} }
} }
if (send_flags & BTRFS_SEND_FLAG_NO_FILE_DATA) if ((send_flags & BTRFS_SEND_FLAG_NO_FILE_DATA) && g_verbose > 1)
printf("Mode NO_FILE_DATA enabled\n"); if (g_verbose > 1)
fprintf(stderr, "Mode NO_FILE_DATA enabled\n");
for (i = optind; i < argc; i++) { for (i = optind; i < argc; i++) {
int is_first_subvol; int is_first_subvol;
@ -632,7 +642,8 @@ int cmd_send(int argc, char **argv)
free(subvol); free(subvol);
subvol = argv[i]; subvol = argv[i];
fprintf(stderr, "At subvol %s\n", subvol); if (g_verbose > 0)
fprintf(stderr, "At subvol %s\n", subvol);
subvol = realpath(subvol, NULL); subvol = realpath(subvol, NULL);
if (!subvol) { if (!subvol) {
@ -713,8 +724,6 @@ const char * const cmd_send_usage[] = {
"which case 'btrfs send' will determine a suitable parent among the", "which case 'btrfs send' will determine a suitable parent among the",
"clone sources itself.", "clone sources itself.",
"\n", "\n",
"-v Enable verbose debug output. Each occurrence of",
" this option increases the verbose level more.",
"-e If sending multiple subvols at once, use the new", "-e If sending multiple subvols at once, use the new",
" format and omit the end-cmd between the subvols.", " format and omit the end-cmd between the subvols.",
"-p <parent> Send an incremental stream from <parent> to", "-p <parent> Send an incremental stream from <parent> to",
@ -728,5 +737,8 @@ const char * const cmd_send_usage[] = {
" does not contain any file data and thus cannot be used", " does not contain any file data and thus cannot be used",
" to transfer changes. This mode is faster and useful to", " to transfer changes. This mode is faster and useful to",
" show the differences in metadata.", " show the differences in metadata.",
"-v|--verbose enable verbose output to stderr, each occurrence of",
" this option increases verbosity",
"-q|--quiet suppress all messages, except errors",
NULL NULL
}; };