btrfs-progs: defrag: force using v2 defrag ioctl and make default 32M threshold actua...
authorDavid Sterba <dsterba@suse.com>
Thu, 12 Jan 2017 14:00:47 +0000 (15:00 +0100)
committerDavid Sterba <dsterba@suse.com>
Wed, 25 Jan 2017 08:47:43 +0000 (09:47 +0100)
A user reported on IRC that the new 32M default for target extent size
does not work. This happens because if there are no commandline options,
the v1 ioctl is used that does not do any fine grained defrag. As the v2
ioctl has been introduced 6 years ago (2010, kernel 2.6.33) we won't
keep backward compatibility anymore.

Signed-off-by: David Sterba <dsterba@suse.com>
Documentation/btrfs-filesystem.asciidoc
cmds-filesystem.c

index 9782af9..0f7ea49 100644 (file)
@@ -80,7 +80,7 @@ show sizes in TiB, or TB with --si
 If conflicting options are passed, the last one takes precedence.
 
 *defragment* [options] <file>|<dir> [<file>|<dir>...]::
-Defragment file data on a mounted filesystem.
+Defragment file data on a mounted filesystem. Requires kernel 2.6.33 and newer.
 +
 If '-r' is passed, files in dir will be defragmented recursively.
 The start position and the number of bytes to defragment can be specified by
index c66709b..56a19a9 100644 (file)
@@ -1042,14 +1042,15 @@ static int cmd_filesystem_defrag(int argc, char **argv)
        /*
         * Kernel has a different default (256K) that is supposed to be safe,
         * but it does not defragment very well. The 32M will likely lead to
-        * better results and is independent of the kernel default.
+        * better results and is independent of the kernel default. We have to
+        * use the v2 defrag ioctl.
         */
        thresh = 32 * 1024 * 1024;
+       defrag_global_fancy_ioctl = 1;
 
        defrag_global_errors = 0;
        defrag_global_verbose = 0;
        defrag_global_errors = 0;
-       defrag_global_fancy_ioctl = 0;
        while(1) {
                int c = getopt(argc, argv, "vrc::fs:l:t:");
                if (c < 0)