Hello community,

here is the log from the commit of package btrfsprogs for openSUSE:Factory 
checked in at 2015-09-03 18:01:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/btrfsprogs (Old)
 and      /work/SRC/openSUSE:Factory/.btrfsprogs.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "btrfsprogs"

Changes:
--------
--- /work/SRC/openSUSE:Factory/btrfsprogs/btrfsprogs.changes    2015-07-28 
11:42:21.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.btrfsprogs.new/btrfsprogs.changes       
2015-09-03 18:07:25.000000000 +0200
@@ -1,0 +2,7 @@
+Tue Sep  1 00:00:00 CEST 2015 - dste...@suse.cz
+
+- add warning before full balance starts (bsc#940467, fate#319317)
+- Added patches:
+  2000-btrfs-full-balance-warning.diff
+
+-------------------------------------------------------------------

New:
----
  2000-btrfs-full-balance-warning.diff

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ btrfsprogs.spec ++++++
--- /var/tmp/diff_new_pack.FFzmg4/_old  2015-09-03 18:07:32.000000000 +0200
+++ /var/tmp/diff_new_pack.FFzmg4/_new  2015-09-03 18:07:32.000000000 +0200
@@ -39,6 +39,7 @@
 
 Patch1000:      local-version-override.patch
 Patch1001:      fix-doc-build-on-SLE11SP3.diff
+Patch1002:      2000-btrfs-full-balance-warning.diff
 
 BuildRequires:  asciidoc
 BuildRequires:  autoconf
@@ -89,6 +90,7 @@
 %patch2106 -p1
 %patch1000 -p1
 %patch1001 -p1
+%patch1002 -p1
 
 %build
 ./autogen.sh

++++++ 2000-btrfs-full-balance-warning.diff ++++++
diff --git a/Documentation/btrfs-balance.asciidoc 
b/Documentation/btrfs-balance.asciidoc
index 6d2fd0c36086..12c2a2dc9fbd 100644
--- a/Documentation/btrfs-balance.asciidoc
+++ b/Documentation/btrfs-balance.asciidoc
@@ -45,6 +45,12 @@ If filter list is not given balance all chunks of that type.
 In case none of the -d, -m or -s options is
 given balance all chunks in a filesystem.
 +
+NOTE: the balance command without filters will basically rewrite everything
+int the filesystem. The run time is potentially very long, depending on the
+filesystem size. To prevent starting a full balance by accident, the user is
+warned and has a few seconds to cancel the operation before it starts. The
+warning and delay can be skipped with '--full-balance' option.
++
 `Options`
 +
 -d[<filters>]::::
@@ -57,6 +63,8 @@ act on system chunks (only under -f). See `FILTERS` section 
for details about <f
 be verbose
 -f::::
 force reducing of metadata integrity
+--full-balance::::
+do not print the warning and do not delay start
 
 *status* [-v] <path>::
 Show status of running or paused balance.
diff --git a/cmds-balance.c b/cmds-balance.c
index 9af218bbfa51..bab0e053c8bc 100644
--- a/cmds-balance.c
+++ b/cmds-balance.c
@@ -298,8 +298,13 @@ static int do_balance_v1(int fd)
        return ret;
 }
 
+enum {
+       BALANCE_START_FILTERS = 1 << 0,
+       BALANCE_START_NOWARN  = 1 << 1
+};
+
 static int do_balance(const char *path, struct btrfs_ioctl_balance_args *args,
-                     int nofilters)
+                     unsigned flags)
 {
        int fd;
        int ret;
@@ -312,6 +317,24 @@ static int do_balance(const char *path, struct 
btrfs_ioctl_balance_args *args,
                return 1;
        }
 
+       if (!(flags & BALANCE_START_FILTERS) && !(flags & 
BALANCE_START_NOWARN)) {
+               int delay = 10;
+
+               printf("WARNING:\n\n");
+               printf("\tFull balance without filters requested. This 
operation is very\n");
+               printf("\tintense and takes potentially very long. It is 
recommended to\n");
+               printf("\tuse the balance filters to narrow down the balanced 
data.\n");
+               printf("\tUse 'btrfs balance start --full-balance' option to 
skip this\n");
+               printf("\twarning. The operation printf will start in %d 
seconds.\n", delay);
+               printf("\tUse Ctrl-C to stop it.\n");
+               while (delay) {
+                       sleep(1);
+                       printf("%2d", delay--);
+                       fflush(stdout);
+               }
+               printf("\nStarting balance without any filters.\n");
+       }
+
        ret = ioctl(fd, BTRFS_IOC_BALANCE_V2, args);
        e = errno;
 
@@ -321,7 +344,7 @@ static int do_balance(const char *path, struct 
btrfs_ioctl_balance_args *args,
                 * old one.  But, the old one doesn't know any filters, so
                 * don't fall back if they tried to use the fancy new things
                 */
-               if (e == ENOTTY && nofilters) {
+               if (e == ENOTTY && !(flags & BALANCE_START_FILTERS)) {
                        ret = do_balance_v1(fd);
                        if (ret == 0)
                                goto out;
@@ -361,13 +384,16 @@ static const char * const cmd_balance_start_usage[] = {
        "passed all filters in a comma-separated list of filters for a",
        "particular chunk type.  If filter list is not given balance all",
        "chunks of that type.  In case none of the -d, -m or -s options is",
-       "given balance all chunks in a filesystem.",
+       "given balance all chunks in a filesystem. This is potentially",
+       "long operation and the user is warned before this start, with",
+       "a delay to stop it.",
        "",
        "-d[filters]    act on data chunks",
        "-m[filters]    act on metadata chunks",
        "-s[filters]    act on system chunks (only under -f)",
        "-v             be verbose",
        "-f             force reducing of metadata integrity",
+       "--full-balance do not print warning and do not delay start",
        NULL
 };
 
@@ -378,19 +404,22 @@ static int cmd_balance_start(int argc, char **argv)
                                                &args.meta, NULL };
        int force = 0;
        int verbose = 0;
-       int nofilters = 1;
+       unsigned start_flags = 0;
        int i;
 
        memset(&args, 0, sizeof(args));
 
        optind = 1;
        while (1) {
+               enum { GETOPT_VAL_FULL_BALANCE = 256 };
                static const struct option longopts[] = {
                        { "data", optional_argument, NULL, 'd'},
                        { "metadata", optional_argument, NULL, 'm' },
                        { "system", optional_argument, NULL, 's' },
                        { "force", no_argument, NULL, 'f' },
                        { "verbose", no_argument, NULL, 'v' },
+                       { "full-balance", no_argument, NULL,
+                               GETOPT_VAL_FULL_BALANCE },
                        { NULL, 0, NULL, 0 }
                };
 
@@ -400,21 +429,21 @@ static int cmd_balance_start(int argc, char **argv)
 
                switch (opt) {
                case 'd':
-                       nofilters = 0;
+                       start_flags |= BALANCE_START_FILTERS;
                        args.flags |= BTRFS_BALANCE_DATA;
 
                        if (parse_filters(optarg, &args.data))
                                return 1;
                        break;
                case 's':
-                       nofilters = 0;
+                       start_flags |= BALANCE_START_FILTERS;
                        args.flags |= BTRFS_BALANCE_SYSTEM;
 
                        if (parse_filters(optarg, &args.sys))
                                return 1;
                        break;
                case 'm':
-                       nofilters = 0;
+                       start_flags |= BALANCE_START_FILTERS;
                        args.flags |= BTRFS_BALANCE_METADATA;
 
                        if (parse_filters(optarg, &args.meta))
@@ -426,6 +455,9 @@ static int cmd_balance_start(int argc, char **argv)
                case 'v':
                        verbose = 1;
                        break;
+               case GETOPT_VAL_FULL_BALANCE:
+                       start_flags |= BALANCE_START_NOWARN;
+                       break;
                default:
                        usage(cmd_balance_start_usage);
                }
@@ -451,7 +483,7 @@ static int cmd_balance_start(int argc, char **argv)
                        sizeof(struct btrfs_balance_args));
        }
 
-       if (nofilters) {
+       if (!(start_flags & BALANCE_START_FILTERS)) {
                /* relocate everything - no filters */
                args.flags |= BTRFS_BALANCE_TYPE_MASK;
        }
@@ -481,7 +513,7 @@ static int cmd_balance_start(int argc, char **argv)
        if (verbose)
                dump_ioctl_balance_args(&args);
 
-       return do_balance(argv[optind], &args, nofilters);
+       return do_balance(argv[optind], &args, start_flags);
 }
 
 static const char * const cmd_balance_pause_usage[] = {
@@ -723,6 +755,16 @@ static int cmd_balance_status(int argc, char **argv)
        return 1;
 }
 
+static int cmd_balance_full(int argc, char **argv)
+{
+       struct btrfs_ioctl_balance_args args;
+
+       memset(&args, 0, sizeof(args));
+       args.flags |= BTRFS_BALANCE_TYPE_MASK;
+
+       return do_balance(argv[1], &args, BALANCE_START_NOWARN);
+}
+
 static const char balance_cmd_group_info[] =
 "balance data accross devices, or change block groups using filters";
 
@@ -733,20 +775,21 @@ const struct cmd_group balance_cmd_group = {
                { "cancel", cmd_balance_cancel, cmd_balance_cancel_usage, NULL, 
0 },
                { "resume", cmd_balance_resume, cmd_balance_resume_usage, NULL, 
0 },
                { "status", cmd_balance_status, cmd_balance_status_usage, NULL, 
0 },
+               { "--full-balance", cmd_balance_full, NULL, NULL, 1 },
                NULL_CMD_STRUCT
        }
 };
 
 int cmd_balance(int argc, char **argv)
 {
-       if (argc == 2) {
+       if (argc == 2 && strcmp("start", argv[1]) != 0) {
                /* old 'btrfs filesystem balance <path>' syntax */
                struct btrfs_ioctl_balance_args args;
 
                memset(&args, 0, sizeof(args));
                args.flags |= BTRFS_BALANCE_TYPE_MASK;
 
-               return do_balance(argv[1], &args, 1);
+               return do_balance(argv[1], &args, 0);
        }
 
        return handle_command_group(&balance_cmd_group, argc, argv);

Reply via email to