Hello community,

here is the log from the commit of package btrfsprogs for openSUSE:Factory 
checked in at 2015-03-29 20:15:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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-03-16 
09:37:25.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.btrfsprogs.new/btrfsprogs.changes       
2015-03-29 20:15:55.000000000 +0200
@@ -1,0 +2,17 @@
+Wed Mar 25 00:00:00 CET 2015 - dste...@suse.cz
+
+- version 3.19.1
+  - convert:
+    - new option to specify metadata block size
+    - --no-progress actually works
+  - restore: properly handle the page boundary corner case
+  - build fixes:
+    - missing macro from public header, BTRFS_BUILD_VERSION
+    - wrong handling of --enable-convert
+  - fi usage: reports correct space for degraded mounts
+  - other:
+    - mkfs: help string updates
+    - completion: added 'usage' subcommands
+    - cleanups in qgroup code, preparatory work
+
+-------------------------------------------------------------------

Old:
----
  btrfs-progs-v3.19.tar.gz

New:
----
  btrfs-progs-v3.19.1.tar.gz

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

Other differences:
------------------
++++++ btrfsprogs.spec ++++++
--- /var/tmp/diff_new_pack.44HxWY/_old  2015-03-29 20:15:56.000000000 +0200
+++ /var/tmp/diff_new_pack.44HxWY/_new  2015-03-29 20:15:56.000000000 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           btrfsprogs
-Version:        3.19
+Version:        3.19.1
 Release:        0
 Summary:        Utilities for the Btrfs filesystem
 License:        GPL-2.0

++++++ btrfs-progs-v3.19.tar.gz -> btrfs-progs-v3.19.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/Documentation/btrfs-convert.txt 
new/btrfs-progs-v3.19.1/Documentation/btrfs-convert.txt
--- old/btrfs-progs-v3.19/Documentation/btrfs-convert.txt       2015-03-11 
13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/Documentation/btrfs-convert.txt     2015-03-25 
18:43:42.000000000 +0100
@@ -17,19 +17,24 @@
 
 OPTIONS
 -------
--d::
-Disable data checksum.
--i::
+-d|--no-datasum::
+Disable data checksum calculations and set NODATASUM file flag. This can speed
+up the conversion.
+-i|--no-xattr::
 Ignore xattrs and ACLs.
--n::
-Disable packing of small files.
--r::
+-n|--no-inline::
+Disable inlining of small files to metadata blocks.
+-N|--nodesize <SIZE>::
+Set filesystem nodesize, the tree block size in which btrfs stores data.
+The default value is 16KB (16384) or the page size, whichever is bigger.
+Must be a multiple of the sectorsize, but not larger than 65536.
+-r|--rollback::
 Roll back to ext2fs.
--l <LABEL>::
+-l|--label <LABEL>::
 set filesystem label during conversion.
--L::
+-L|--copy-label::
 use label from the converted filesystem.
--p::
+-p|--progress::
 Show progress of conversion, on by default.
 --no-progress::
 Disable detailed progress and show only the main phases of conversion.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/btrfs-completion 
new/btrfs-progs-v3.19.1/btrfs-completion
--- old/btrfs-progs-v3.19/btrfs-completion      2015-03-11 13:40:48.000000000 
+0100
+++ new/btrfs-progs-v3.19.1/btrfs-completion    2015-03-25 18:43:42.000000000 
+0100
@@ -31,9 +31,9 @@
 
     commands='subvolume filesystem balance device scrub check rescue restore 
inspect-internal property send receive quota qgroup replace help version'
     commands_subvolume='create delete list snapshot find-new get-default 
set-default show sync'
-    commands_filesystem='defragment sync resize show df label'
+    commands_filesystem='defragment sync resize show df label usage'
     commands_balance='start pause cancel resume status'
-    commands_device='scan add delete ready stats'
+    commands_device='scan add delete ready stats usage'
     commands_scrub='start cancel resume status'
     commands_rescue='chunk-recover super-recover'
     commands_inspect_internal='inode-resolve logical-resolve subvolid-resolve 
rootid'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/btrfs-convert.c 
new/btrfs-progs-v3.19.1/btrfs-convert.c
--- old/btrfs-progs-v3.19/btrfs-convert.c       2015-03-11 13:40:48.000000000 
+0100
+++ new/btrfs-progs-v3.19.1/btrfs-convert.c     2015-03-25 18:43:42.000000000 
+0100
@@ -141,6 +141,25 @@
        return -ENOSPC;
 }
 
+static int ext2_alloc_block_range(ext2_filsys fs, u64 goal, int num,
+               u64 *block_ret)
+{
+       blk_t block;
+       ext2fs_block_bitmap bitmap = fs->block_map;
+       blk_t start = ext2fs_get_block_bitmap_start(bitmap);
+       blk_t end = ext2fs_get_block_bitmap_end(bitmap);
+
+       for (block = max_t(u64, goal, start); block + num < end; block++) {
+               if (ext2fs_fast_test_block_bitmap_range(bitmap, block, num)) {
+                       ext2fs_fast_mark_block_bitmap_range(bitmap, block,
+                                       num);
+                       *block_ret = block;
+                       return 0;
+               }
+       }
+       return -ENOSPC;
+}
+
 static int ext2_free_block(ext2_filsys fs, u64 block)
 {
        BUG_ON(block != (blk_t)block);
@@ -148,6 +167,13 @@
        return 0;
 }
 
+static int ext2_free_block_range(ext2_filsys fs, u64 block, int num)
+{
+       BUG_ON(block != (blk_t)block);
+       ext2fs_fast_unmark_block_bitmap_range(fs->block_map, block, num);
+       return 0;
+}
+
 static int cache_free_extents(struct btrfs_root *root, ext2_filsys ext2_fs)
 
 {
@@ -2233,9 +2259,9 @@
 }
 
 static int do_convert(const char *devname, int datacsum, int packing, int 
noxattr,
-              int copylabel, const char *fslabel, int progress)
+               u32 nodesize, int copylabel, const char *fslabel, int progress)
 {
-       int i, ret;
+       int i, ret, blocks_per_node;
        int fd = -1;
        u32 blocksize;
        u64 blocks[7];
@@ -2262,8 +2288,17 @@
                fprintf(stderr, "filetype feature is missing\n");
                goto fail;
        }
+       if (btrfs_check_node_or_leaf_size(nodesize, blocksize))
+               goto fail;
+       blocks_per_node = nodesize / blocksize;
+       ret = -blocks_per_node;
        for (i = 0; i < 7; i++) {
-               ret = ext2_alloc_block(ext2_fs, 0, blocks + i);
+               if (nodesize == blocksize)
+                       ret = ext2_alloc_block(ext2_fs, 0, blocks + i);
+               else
+                       ret = ext2_alloc_block_range(ext2_fs,
+                                       ret + blocks_per_node, blocks_per_node,
+                                       blocks + i);
                if (ret) {
                        fprintf(stderr, "not enough free space\n");
                        goto fail;
@@ -2277,7 +2312,7 @@
                goto fail;
        }
        ret = make_btrfs(fd, devname, ext2_fs->super->s_volume_name,
-                        NULL, blocks, total_bytes, blocksize, blocksize,
+                        NULL, blocks, total_bytes, nodesize, nodesize,
                         blocksize, blocksize, 0);
        if (ret) {
                fprintf(stderr, "unable to create initial ctree: %s\n",
@@ -2304,7 +2339,11 @@
        /* recover block allocation bitmap */
        for (i = 0; i < 7; i++) {
                blocks[i] /= blocksize;
-               ext2_free_block(ext2_fs, blocks[i]);
+               if (nodesize == blocksize)
+                       ext2_free_block(ext2_fs, blocks[i]);
+               else
+                       ext2_free_block_range(ext2_fs, blocks[i],
+                                       blocks_per_node);
        }
        ret = init_btrfs(root);
        if (ret) {
@@ -2761,14 +2800,16 @@
 static void print_usage(void)
 {
        printf("usage: btrfs-convert [options] device\n");
-       printf("\t-d             disable data checksum\n");
-       printf("\t-i             ignore xattrs and ACLs\n");
-       printf("\t-n             disable packing of small files\n");
-       printf("\t-r             roll back to ext2fs\n");
-       printf("\t-l LABEL       set filesystem label\n");
-       printf("\t-L             use label from converted fs\n");
-       printf("\t-p             show converting progress (default)\n");
-       printf("\t--no-progress  show only overview, not the detailed 
progress\n");
+       printf("options:\n");
+       printf("\t-d|--no-datasum        disable data checksum, sets 
NODATASUM\n");
+       printf("\t-i|--no-xattr          ignore xattrs and ACLs\n");
+       printf("\t-n|--no-inline         disable inlining of small files to 
metadata\n");
+       printf("\t-N|--nodesize SIZE     set filesystem metadata nodesize\n");
+       printf("\t-r|--rollback          roll back to ext2fs\n");
+       printf("\t-l|--label LABEL       set filesystem label\n");
+       printf("\t-L|--copy-label        use label from converted 
filesystem\n");
+       printf("\t-p|--progress          show converting progress (default)\n");
+       printf("\t--no-progress          show only overview, not the detailed 
progress\n");
 }
 
 int main(int argc, char *argv[])
@@ -2777,6 +2818,8 @@
        int packing = 1;
        int noxattr = 0;
        int datacsum = 1;
+       u32 nodesize = max_t(u32, sysconf(_SC_PAGESIZE),
+                       BTRFS_MKFS_DEFAULT_NODE_SIZE);
        int rollback = 0;
        int copylabel = 0;
        int usage_error = 0;
@@ -2788,10 +2831,19 @@
                int long_index;
                enum { GETOPT_VAL_NO_PROGRESS = 256 };
                static const struct option long_options[] = {
-                       { "no-progress", no_argument, NULL, GETOPT_VAL_IEC},
+                       { "no-progress", no_argument, NULL,
+                               GETOPT_VAL_NO_PROGRESS },
+                       { "no-datasum", no_argument, NULL, 'd' },
+                       { "no-inline", no_argument, NULL, 'n' },
+                       { "no-xattr", no_argument, NULL, 'i' },
+                       { "rollback", no_argument, NULL, 'r' },
+                       { "progress", no_argument, NULL, 'p' },
+                       { "label", required_argument, NULL, 'l' },
+                       { "copy-label", no_argument, NULL, 'L' },
+                       { "nodesize", required_argument, NULL, 'N' },
                        { NULL, 0, NULL, 0 }
                };
-               int c = getopt_long(argc, argv, "dinrl:Lp", long_options,
+               int c = getopt_long(argc, argv, "dinN:rl:Lp", long_options,
                                &long_index);
 
                if (c < 0)
@@ -2806,6 +2858,9 @@
                        case 'n':
                                packing = 0;
                                break;
+                       case 'N':
+                               nodesize = parse_size(optarg);
+                               break;
                        case 'r':
                                rollback = 1;
                                break;
@@ -2865,7 +2920,8 @@
        if (rollback) {
                ret = do_rollback(file);
        } else {
-               ret = do_convert(file, datacsum, packing, noxattr, copylabel, 
fslabel, progress);
+               ret = do_convert(file, datacsum, packing, noxattr, nodesize,
+                               copylabel, fslabel, progress);
        }
        if (ret)
                return 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/cmds-fi-disk_usage.c 
new/btrfs-progs-v3.19.1/cmds-fi-disk_usage.c
--- old/btrfs-progs-v3.19/cmds-fi-disk_usage.c  2015-03-11 13:40:48.000000000 
+0100
+++ new/btrfs-progs-v3.19.1/cmds-fi-disk_usage.c        2015-03-25 
18:43:42.000000000 +0100
@@ -324,6 +324,7 @@
        u64 r_total_chunks = 0; /* sum of chunks sizes on disk(s) */
        u64 r_total_used = 0;
        u64 r_total_unused = 0;
+       u64 r_total_missing = 0;        /* sum of missing devices size */
        u64 r_data_used = 0;
        u64 r_data_chunks = 0;
        u64 l_data_chunks = 0;
@@ -350,8 +351,11 @@
        }
 
        r_total_size = 0;
-       for (i = 0; i < devcount; i++)
-               r_total_size += devinfo[i].device_size;
+       for (i = 0; i < devcount; i++) {
+               r_total_size += devinfo[i].size;
+               if (!devinfo[i].device_size)
+                       r_total_missing += devinfo[i].size;
+       }
 
        if (r_total_size == 0) {
                fprintf(stderr,
@@ -461,6 +465,8 @@
                pretty_size_mode(r_total_chunks, unit_mode));
        printf("    Device unallocated:\t\t%*s\n", width,
                pretty_size_mode(r_total_unused, unit_mode));
+       printf("    Device missing:\t\t%*s\n", width,
+               pretty_size_mode(r_total_missing, unit_mode));
        printf("    Used:\t\t\t%*s\n", width,
                pretty_size_mode(r_total_used, unit_mode));
        printf("    Free (estimated):\t\t%*s\t(",
@@ -538,8 +544,13 @@
                }
 
                info[ndevs].devid = dev_info.devid;
-               strcpy(info[ndevs].path, (char *)dev_info.path);
-               info[ndevs].device_size = get_partition_size((char 
*)dev_info.path);
+               if (!dev_info.path[0]) {
+                       strcpy(info[ndevs].path, "missing");
+               } else {
+                       strcpy(info[ndevs].path, (char *)dev_info.path);
+                       info[ndevs].device_size =
+                               get_partition_size((char *)dev_info.path);
+               }
                info[ndevs].size = dev_info.total_bytes;
                ++ndevs;
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/cmds-qgroup.c 
new/btrfs-progs-v3.19.1/cmds-qgroup.c
--- old/btrfs-progs-v3.19/cmds-qgroup.c 2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/cmds-qgroup.c       2015-03-25 18:43:42.000000000 
+0100
@@ -52,7 +52,7 @@
        /*
         * FIXME src should accept subvol path
         */
-       if ((args.src >> 48) >= (args.dst >> 48)) {
+       if (btrfs_qgroup_level(args.src) >= btrfs_qgroup_level(args.dst)) {
                fprintf(stderr, "ERROR: bad relation requested '%s'\n", path);
                return 1;
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/cmds-restore.c 
new/btrfs-progs-v3.19.1/cmds-restore.c
--- old/btrfs-progs-v3.19/cmds-restore.c        2015-03-11 13:40:48.000000000 
+0100
+++ new/btrfs-progs-v3.19.1/cmds-restore.c      2015-03-25 18:43:42.000000000 
+0100
@@ -111,6 +111,8 @@
        tot_in = LZO_LEN;
 
        while (tot_in < tot_len) {
+               size_t mod_page;
+               size_t rem_page;
                in_len = read_compress_length(inbuf);
 
                if ((tot_in + LZO_LEN + in_len) > tot_len) {
@@ -134,6 +136,17 @@
                outbuf += new_len;
                inbuf += in_len;
                tot_in += in_len;
+
+               /*
+                * If the 4 byte header does not fit to the rest of the page we
+                * have to move to the next one, unless we read some garbage
+                */
+               mod_page = tot_in % PAGE_CACHE_SIZE;
+               rem_page = PAGE_CACHE_SIZE - mod_page;
+               if (rem_page < LZO_LEN) {
+                       inbuf += rem_page;
+                       tot_in += rem_page;
+               }
        }
 
        *decompress_len = out_len;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/configure 
new/btrfs-progs-v3.19.1/configure
--- old/btrfs-progs-v3.19/configure     2015-03-11 13:41:25.000000000 +0100
+++ new/btrfs-progs-v3.19.1/configure   2015-03-25 18:44:13.000000000 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for btrfs-progs v3.19.
+# Generated by GNU Autoconf 2.69 for btrfs-progs v3.19.1.
 #
 # Report bugs to <linux-bt...@vger.kernel.org>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='btrfs-progs'
 PACKAGE_TARNAME='btrfs-progs'
-PACKAGE_VERSION='v3.19'
-PACKAGE_STRING='btrfs-progs v3.19'
+PACKAGE_VERSION='v3.19.1'
+PACKAGE_STRING='btrfs-progs v3.19.1'
 PACKAGE_BUGREPORT='linux-bt...@vger.kernel.org'
 PACKAGE_URL='http://btrfs.wiki.kernel.org'
 
@@ -1287,7 +1287,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures btrfs-progs v3.19 to adapt to many kinds of systems.
+\`configure' configures btrfs-progs v3.19.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1352,7 +1352,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of btrfs-progs v3.19:";;
+     short | recursive ) echo "Configuration of btrfs-progs v3.19.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1461,7 +1461,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-btrfs-progs configure v3.19
+btrfs-progs configure v3.19.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1830,7 +1830,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by btrfs-progs $as_me v3.19, which was
+It was created by btrfs-progs $as_me v3.19.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -5295,19 +5295,19 @@
 if test "${enable_convert+set}" = set; then :
   enableval=$enable_convert;
 else
-  enable_btrfsconvert=yes
+  enable_convert=yes
 
 fi
 
 
-if test "x$enable_btrfsconvert" = xyes; then :
+if test "x$enable_convert" = xyes; then :
   DISABLE_BTRFSCONVERT=0
 else
   DISABLE_BTRFSCONVERT=1
 fi
 
 
-if test "x$enable_btrfsconvert" = xyes; then
+if test "x$enable_convert" = xyes; then
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXT2FS" >&5
@@ -6375,7 +6375,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by btrfs-progs $as_me v3.19, which was
+This file was extended by btrfs-progs $as_me v3.19.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -6438,7 +6438,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-btrfs-progs config.status v3.19
+btrfs-progs config.status v3.19.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -7167,7 +7167,7 @@
 
        documentaton:      ${enable_documentation}
        backtrace support: ${enable_backtrace}
-       btrfs-convert:     ${enable_btrfsconvert}
+       btrfs-convert:     ${enable_convert}
 
        Type 'make' to compile.
 " >&5
@@ -7187,7 +7187,7 @@
 
        documentaton:      ${enable_documentation}
        backtrace support: ${enable_backtrace}
-       btrfs-convert:     ${enable_btrfsconvert}
+       btrfs-convert:     ${enable_convert}
 
        Type 'make' to compile.
 " >&6; }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/configure.ac 
new/btrfs-progs-v3.19.1/configure.ac
--- old/btrfs-progs-v3.19/configure.ac  2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/configure.ac        2015-03-25 18:43:42.000000000 
+0100
@@ -98,13 +98,13 @@
 
 AC_ARG_ENABLE([convert],
              AS_HELP_STRING([--disable-convert], [do not build btrfs-convert]),
-  [], [enable_btrfsconvert=yes]
+  [], [enable_convert=yes]
 )
 
-AS_IF([test "x$enable_btrfsconvert" = xyes], [DISABLE_BTRFSCONVERT=0], 
[DISABLE_BTRFSCONVERT=1])
+AS_IF([test "x$enable_convert" = xyes], [DISABLE_BTRFSCONVERT=0], 
[DISABLE_BTRFSCONVERT=1])
 AC_SUBST([DISABLE_BTRFSCONVERT])
 
-if test "x$enable_btrfsconvert" = xyes; then
+if test "x$enable_convert" = xyes; then
        PKG_CHECK_MODULES(EXT2FS, [ext2fs])
        PKG_CHECK_MODULES(COM_ERR, [com_err])
 fi
@@ -167,7 +167,7 @@
 
        documentaton:      ${enable_documentation}
        backtrace support: ${enable_backtrace}
-       btrfs-convert:     ${enable_btrfsconvert}
+       btrfs-convert:     ${enable_convert}
 
        Type 'make' to compile.
 ])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/ctree.h 
new/btrfs-progs-v3.19.1/ctree.h
--- old/btrfs-progs-v3.19/ctree.h       2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/ctree.h     2015-03-25 18:43:42.000000000 +0100
@@ -868,11 +868,21 @@
  */
 #define BTRFS_SPACE_INFO_GLOBAL_RSV    (1ULL << 49)
 
-#define BTRFS_QGROUP_STATUS_OFF                        0
-#define BTRFS_QGROUP_STATUS_ON                 1
-#define BTRFS_QGROUP_STATUS_SCANNING           2
+#define BTRFS_QGROUP_LEVEL_SHIFT               48
 
-#define BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT  (1 << 0)
+static inline u64 btrfs_qgroup_level(u64 qgroupid)
+{
+       return qgroupid >> BTRFS_QGROUP_LEVEL_SHIFT;
+}
+
+static inline u64 btrfs_qgroup_subvid(u64 qgroupid)
+{
+       return qgroupid & ((1ULL << BTRFS_QGROUP_LEVEL_SHIFT) - 1);
+}
+
+#define BTRFS_QGROUP_STATUS_FLAG_ON            (1ULL << 0)
+#define BTRFS_QGROUP_STATUS_FLAG_RESCAN                (1ULL << 1)
+#define BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT  (1ULL << 2)
 
 struct btrfs_qgroup_status_item {
        __le64 version;
@@ -2070,6 +2080,15 @@
 BTRFS_SETGET_FUNCS(qgroup_status_scan, struct btrfs_qgroup_status_item,
                   scan, 64);
 
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_version,
+                        struct btrfs_qgroup_status_item, version, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_generation,
+                        struct btrfs_qgroup_status_item, generation, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_flags,
+                        struct btrfs_qgroup_status_item, flags, 64);
+BTRFS_SETGET_STACK_FUNCS(stack_qgroup_status_scan,
+                        struct btrfs_qgroup_status_item, scan, 64);
+
 /* btrfs_qgroup_info_item */
 BTRFS_SETGET_FUNCS(qgroup_info_generation, struct btrfs_qgroup_info_item,
                   generation, 64);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/mkfs.c 
new/btrfs-progs-v3.19.1/mkfs.c
--- old/btrfs-progs-v3.19/mkfs.c        2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/mkfs.c      2015-03-25 18:43:42.000000000 +0100
@@ -47,8 +47,6 @@
 #define DEFAULT_MKFS_FEATURES  (BTRFS_FEATURE_INCOMPAT_EXTENDED_IREF \
                | BTRFS_FEATURE_INCOMPAT_SKINNY_METADATA)
 
-#define DEFAULT_MKFS_LEAF_SIZE 16384
-
 struct directory_name_entry {
        char *dir_name;
        char *path;
@@ -274,21 +272,21 @@
 {
        fprintf(stderr, "usage: mkfs.btrfs [options] dev [ dev ... ]\n");
        fprintf(stderr, "options:\n");
-       fprintf(stderr, "\t -A --alloc-start the offset to start the FS\n");
-       fprintf(stderr, "\t -b --byte-count total number of bytes in the FS\n");
-       fprintf(stderr, "\t -d --data data profile, raid0, raid1, raid5, raid6, 
raid10, dup or single\n");
-       fprintf(stderr, "\t -f --force force overwrite of existing 
filesystem\n");
-       fprintf(stderr, "\t -l --leafsize size of btree leaves\n");
-       fprintf(stderr, "\t -L --label set a label\n");
-       fprintf(stderr, "\t -m --metadata metadata profile, values like data 
profile\n");
-       fprintf(stderr, "\t -M --mixed mix metadata and data together\n");
-       fprintf(stderr, "\t -n --nodesize size of btree nodes\n");
-       fprintf(stderr, "\t -s --sectorsize min block allocation (may not 
mountable by current kernel)\n");
-       fprintf(stderr, "\t -r --rootdir the source directory\n");
-       fprintf(stderr, "\t -K --nodiscard do not perform whole device TRIM\n");
-       fprintf(stderr, "\t -O --features comma separated list of filesystem 
features\n");
-       fprintf(stderr, "\t -U --uuid specify the filesystem UUID\n");
-       fprintf(stderr, "\t -V --version print the mkfs.btrfs version and 
exit\n");
+       fprintf(stderr, "\t-A|--alloc-start START  the offset to start the 
FS\n");
+       fprintf(stderr, "\t-b|--byte-count SIZE    total number of bytes in the 
FS\n");
+       fprintf(stderr, "\t-d|--data PROFILE       data profile, raid0, raid1, 
raid5, raid6, raid10, dup or single\n");
+       fprintf(stderr, "\t-f|--force              force overwrite of existing 
filesystem\n");
+       fprintf(stderr, "\t-l|--leafsize SIZE      deprecated, alias for 
nodesize\n");
+       fprintf(stderr, "\t-L|--label LABEL        set a label\n");
+       fprintf(stderr, "\t-m|--metadata PROFILE   metadata profile, values 
like data profile\n");
+       fprintf(stderr, "\t-M|--mixed              mix metadata and data 
together\n");
+       fprintf(stderr, "\t-n|--nodesize SIZE      size of btree nodes\n");
+       fprintf(stderr, "\t-s|--sectorsize SIZE    min block allocation (may 
not mountable by current kernel)\n");
+       fprintf(stderr, "\t-r|--rootdir DIR        the source directory\n");
+       fprintf(stderr, "\t-K|--nodiscard          do not perform whole device 
TRIM\n");
+       fprintf(stderr, "\t-O|--features LIST      comma separated list of 
filesystem features\n");
+       fprintf(stderr, "\t-U|--uuid UUID          specify the filesystem 
UUID\n");
+       fprintf(stderr, "\t-V|--version            print the mkfs.btrfs version 
and exit\n");
        fprintf(stderr, "%s\n", PACKAGE_STRING);
        exit(1);
 }
@@ -1057,27 +1055,6 @@
        return ret;
 }
 
-static int check_leaf_or_node_size(u32 size, u32 sectorsize)
-{
-       if (size < sectorsize) {
-               fprintf(stderr,
-                       "Illegal leafsize (or nodesize) %u (smaller than %u)\n",
-                       size, sectorsize);
-               return -1;
-       } else if (size > BTRFS_MAX_METADATA_BLOCKSIZE) {
-               fprintf(stderr,
-                       "Illegal leafsize (or nodesize) %u (larger than %u)\n",
-                       size, BTRFS_MAX_METADATA_BLOCKSIZE);
-               return -1;
-       } else if (size & (sectorsize - 1)) {
-               fprintf(stderr,
-                       "Illegal leafsize (or nodesize) %u (not align to %u)\n",
-                       size, sectorsize);
-               return -1;
-       }
-       return 0;
-}
-
 static int is_ssd(const char *file)
 {
        blkid_probe probe;
@@ -1230,7 +1207,8 @@
        u64 alloc_start = 0;
        u64 metadata_profile = 0;
        u64 data_profile = 0;
-       u32 leafsize = max_t(u32, sysconf(_SC_PAGESIZE), 
DEFAULT_MKFS_LEAF_SIZE);
+       u32 leafsize = max_t(u32, sysconf(_SC_PAGESIZE),
+                       BTRFS_MKFS_DEFAULT_NODE_SIZE);
        u32 sectorsize = 4096;
        u32 nodesize = leafsize;
        u32 stripesize = 4096;
@@ -1359,9 +1337,9 @@
                }
        }
        sectorsize = max(sectorsize, (u32)sysconf(_SC_PAGESIZE));
-       if (check_leaf_or_node_size(leafsize, sectorsize))
+       if (btrfs_check_node_or_leaf_size(leafsize, sectorsize))
                exit(1);
-       if (check_leaf_or_node_size(nodesize, sectorsize))
+       if (btrfs_check_node_or_leaf_size(nodesize, sectorsize))
                exit(1);
        saved_optind = optind;
        dev_cnt = ac - optind;
@@ -1440,7 +1418,7 @@
                if (!leaf_forced) {
                        leafsize = best_leafsize;
                        nodesize = best_leafsize;
-                       if (check_leaf_or_node_size(leafsize, sectorsize))
+                       if (btrfs_check_node_or_leaf_size(leafsize, sectorsize))
                                exit(1);
                }
                if (leafsize != sectorsize) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/print-tree.c 
new/btrfs-progs-v3.19.1/print-tree.c
--- old/btrfs-progs-v3.19/print-tree.c  2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/print-tree.c        2015-03-25 18:43:42.000000000 
+0100
@@ -203,6 +203,20 @@
        }
 }
 
+/* Caller should ensure sizeof(*ret)>= 26 "OFF|SCANNING|INCONSISTENT" */
+static void qgroup_flags_to_str(u64 flags, char *ret)
+{
+       if (flags & BTRFS_QGROUP_STATUS_FLAG_ON)
+               strcpy(ret, "ON");
+       else
+               strcpy(ret, "OFF");
+
+       if (flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN)
+               strcat(ret, "|SCANNING");
+       if (flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT)
+               strcat(ret, "|INCONSISTENT");
+}
+
 void print_chunk(struct extent_buffer *eb, struct btrfs_chunk *chunk)
 {
        int num_stripes = btrfs_chunk_num_stripes(eb, chunk);
@@ -645,8 +659,8 @@
                printf("%llu", (unsigned long long)objectid); /* device id */
                return;
        case BTRFS_QGROUP_RELATION_KEY:
-               printf("%llu/%llu", objectid >> 48,
-                       objectid & ((1ll << 48) - 1));
+               printf("%llu/%llu", btrfs_qgroup_level(objectid),
+                      btrfs_qgroup_subvid(objectid));
                return;
        case BTRFS_UUID_KEY_SUBVOL:
        case BTRFS_UUID_KEY_RECEIVED_SUBVOL:
@@ -743,8 +757,8 @@
        case BTRFS_QGROUP_RELATION_KEY:
        case BTRFS_QGROUP_INFO_KEY:
        case BTRFS_QGROUP_LIMIT_KEY:
-               printf(" %llu/%llu)", (unsigned long long)(offset >> 48),
-                       (unsigned long long)(offset & ((1ll << 48) - 1)));
+               printf(" %llu/%llu)", btrfs_qgroup_level(offset),
+                      btrfs_qgroup_subvid(offset));
                break;
        case BTRFS_UUID_KEY_SUBVOL:
        case BTRFS_UUID_KEY_RECEIVED_SUBVOL:
@@ -801,7 +815,7 @@
        u32 nr = btrfs_header_nritems(l);
        u64 objectid;
        u32 type;
-       char bg_flags_str[32];
+       char flags_str[32];
 
        printf("leaf %llu items %d free space %d generation %llu owner %llu\n",
                (unsigned long long)btrfs_header_bytenr(l), nr,
@@ -920,13 +934,13 @@
                                            struct btrfs_block_group_item);
                        read_extent_buffer(l, &bg_item, (unsigned long)bi,
                                           sizeof(bg_item));
-                       memset(bg_flags_str, 0, sizeof(bg_flags_str));
+                       memset(flags_str, 0, sizeof(flags_str));
                        bg_flags_to_str(btrfs_block_group_flags(&bg_item),
-                                       bg_flags_str);
+                                       flags_str);
                        printf("\t\tblock group used %llu chunk_objectid %llu 
flags %s\n",
                               (unsigned long 
long)btrfs_block_group_used(&bg_item),
                               (unsigned long 
long)btrfs_block_group_chunk_objectid(&bg_item),
-                              bg_flags_str);
+                              flags_str);
                        break;
                case BTRFS_CHUNK_ITEM_KEY:
                        print_chunk(l, btrfs_item_ptr(l, i, struct 
btrfs_chunk));
@@ -953,14 +967,16 @@
                case BTRFS_QGROUP_STATUS_KEY:
                        qg_status = btrfs_item_ptr(l, i,
                                        struct btrfs_qgroup_status_item);
-                       printf("\t\tversion %llu generation %llu flags %#llx "
+                       memset(flags_str, 0, sizeof(flags_str));
+                       qgroup_flags_to_str(btrfs_qgroup_status_flags(l, 
qg_status),
+                                       flags_str);
+                       printf("\t\tversion %llu generation %llu flags %s "
                                "scan %lld\n",
                                (unsigned long long)
                                btrfs_qgroup_status_version(l, qg_status),
                                (unsigned long long)
                                btrfs_qgroup_status_generation(l, qg_status),
-                               (unsigned long long)
-                               btrfs_qgroup_status_flags(l, qg_status),
+                               flags_str,
                                (unsigned long long)
                                btrfs_qgroup_status_scan(l, qg_status));
                        break;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/qgroup.c 
new/btrfs-progs-v3.19.1/qgroup.c
--- old/btrfs-progs-v3.19/qgroup.c      2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/qgroup.c    2015-03-25 18:43:42.000000000 +0100
@@ -172,8 +172,9 @@
        int len = 0;
 
        list_for_each_entry(list, &qgroup->qgroups, next_qgroup) {
-               len += printf("%llu/%llu", (list->qgroup)->qgroupid >> 48,
-                       ((1ll << 48) - 1) & (list->qgroup)->qgroupid);
+               len += printf("%llu/%llu",
+                             btrfs_qgroup_level(list->qgroup->qgroupid),
+                             btrfs_qgroup_subvid(list->qgroup->qgroupid));
                if (!list_is_last(&list->next_qgroup, &qgroup->qgroups))
                        len += printf(",");
        }
@@ -189,8 +190,9 @@
        int len = 0;
 
        list_for_each_entry(list, &qgroup->members, next_member) {
-               len += printf("%llu/%llu", (list->member)->qgroupid >> 48,
-                               ((1ll << 48) - 1) & (list->member)->qgroupid);
+               len += printf("%llu/%llu",
+                             btrfs_qgroup_level(list->member->qgroupid),
+                             btrfs_qgroup_subvid(list->member->qgroupid));
                if (!list_is_last(&list->next_member, &qgroup->members))
                        len += printf(",");
        }
@@ -219,8 +221,9 @@
        switch (column) {
 
        case BTRFS_QGROUP_QGROUPID:
-               len = printf("%llu/%llu", qgroup->qgroupid >> 48,
-                               ((1ll << 48) - 1) & qgroup->qgroupid);
+               len = printf("%llu/%llu",
+                            btrfs_qgroup_level(qgroup->qgroupid),
+                            btrfs_qgroup_subvid(qgroup->qgroupid));
                print_qgroup_column_add_blank(BTRFS_QGROUP_QGROUPID, len);
                break;
        case BTRFS_QGROUP_RFER:
@@ -921,8 +924,9 @@
        switch (column) {
 
        case BTRFS_QGROUP_QGROUPID:
-               sprintf(tmp, "%llu/%llu", (bq->qgroupid >> 48),
-                       bq->qgroupid & ((1ll << 48) - 1));
+               sprintf(tmp, "%llu/%llu",
+                       btrfs_qgroup_level(bq->qgroupid),
+                       btrfs_qgroup_subvid(bq->qgroupid));
                len = strlen(tmp);
                if (btrfs_qgroup_columns[column].max_len < len)
                        btrfs_qgroup_columns[column].max_len = len;
@@ -951,8 +955,8 @@
                len = 0;
                list_for_each_entry(list, &bq->qgroups, next_qgroup) {
                        len += sprintf(tmp, "%llu/%llu",
-                               (list->qgroup)->qgroupid >> 48,
-                               ((1ll << 48) - 1) & (list->qgroup)->qgroupid);
+                               btrfs_qgroup_level(list->qgroup->qgroupid),
+                               btrfs_qgroup_subvid(list->qgroup->qgroupid));
                        if (!list_is_last(&list->next_qgroup, &bq->qgroups))
                                len += 1;
                }
@@ -963,8 +967,8 @@
                len = 0;
                list_for_each_entry(list, &bq->members, next_member) {
                        len += sprintf(tmp, "%llu/%llu",
-                               (list->member)->qgroupid >> 48,
-                               ((1ll << 48) - 1) & (list->member)->qgroupid);
+                               btrfs_qgroup_level(list->member->qgroupid),
+                               btrfs_qgroup_subvid(list->member->qgroupid));
                        if (!list_is_last(&list->next_member, &bq->members))
                                len += 1;
                }
@@ -1013,6 +1017,20 @@
                n = rb_prev(n);
        }
 }
+
+static inline void print_status_flag_warning(u64 flags)
+{
+       if (!(flags & BTRFS_QGROUP_STATUS_FLAG_ON))
+               fprintf(stderr,
+               "WARNING: Quota disabled, qgroup data may be out of date\n");
+       else if (flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN)
+               fprintf(stderr,
+               "WARNING: Rescan is running, qgroup data may be incorrect\n");
+       else if (flags & BTRFS_QGROUP_STATUS_FLAG_INCONSISTENT)
+               fprintf(stderr,
+               "WARNING: Qgroup data inconsistent, rescan recommended\n");
+}
+
 static int __qgroups_search(int fd, struct qgroup_lookup *qgroup_lookup)
 {
        int ret;
@@ -1036,7 +1054,7 @@
 
        sk->tree_id = BTRFS_QUOTA_TREE_OBJECTID;
        sk->max_type = BTRFS_QGROUP_RELATION_KEY;
-       sk->min_type = BTRFS_QGROUP_INFO_KEY;
+       sk->min_type = BTRFS_QGROUP_STATUS_KEY;
        sk->max_objectid = (u64)-1;
        sk->max_offset = (u64)-1;
        sk->max_transid = (u64)-1;
@@ -1067,7 +1085,15 @@
                                                                  off);
                        off += sizeof(*sh);
 
-                       if (sh->type == BTRFS_QGROUP_INFO_KEY) {
+                       if (sh->type == BTRFS_QGROUP_STATUS_KEY) {
+                               struct btrfs_qgroup_status_item *si;
+                               u64 flags;
+
+                               si = (struct btrfs_qgroup_status_item *)
+                                    (args.buf + off);
+                               flags = btrfs_stack_qgroup_status_flags(si);
+                               print_status_flag_warning(flags);
+                       } else if (sh->type == BTRFS_QGROUP_INFO_KEY) {
                                info = (struct btrfs_qgroup_info_item *)
                                       (args.buf + off);
                                a1 = btrfs_stack_qgroup_info_generation(info);
@@ -1245,34 +1271,6 @@
        return 0;
 }
 
-u64 parse_qgroupid(char *p)
-{
-       char *s = strchr(p, '/');
-       char *ptr_src_end = p + strlen(p);
-       char *ptr_parse_end = NULL;
-       u64 level;
-       u64 id;
-
-       if (!s) {
-               id = strtoull(p, &ptr_parse_end, 10);
-               if (ptr_parse_end != ptr_src_end)
-                       goto err;
-               return id;
-       }
-       level = strtoull(p, &ptr_parse_end, 10);
-       if (ptr_parse_end != s)
-               goto err;
-
-       id = strtoull(s+1, &ptr_parse_end, 10);
-       if (ptr_parse_end != ptr_src_end)
-               goto  err;
-
-       return (level << 48) | id;
-err:
-       fprintf(stderr, "ERROR:invalid qgroupid\n");
-       exit(-1);
-}
-
 int qgroup_inherit_size(struct btrfs_qgroup_inherit *p)
 {
        return sizeof(*p) + sizeof(p->qgroups[0]) *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/qgroup.h 
new/btrfs-progs-v3.19.1/qgroup.h
--- old/btrfs-progs-v3.19/qgroup.h      2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/qgroup.h    2015-03-25 18:43:42.000000000 +0100
@@ -93,7 +93,6 @@
 int btrfs_qgroup_setup_comparer(struct btrfs_qgroup_comparer_set **comp_set,
                                enum btrfs_qgroup_comp_enum comparer,
                                int is_descending);
-u64 parse_qgroupid(char *p);
 int qgroup_inherit_size(struct btrfs_qgroup_inherit *p);
 int qgroup_inherit_add_group(struct btrfs_qgroup_inherit **inherit, char *arg);
 int qgroup_inherit_add_copy(struct btrfs_qgroup_inherit **inherit, char *arg,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/tests/convert-tests.sh 
new/btrfs-progs-v3.19.1/tests/convert-tests.sh
--- old/btrfs-progs-v3.19/tests/convert-tests.sh        2015-03-11 
13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/tests/convert-tests.sh      2015-03-25 
18:43:42.000000000 +0100
@@ -16,7 +16,8 @@
 
 test(){
        echo "    [TEST]   $1"
-       shift
+       nodesize=$2
+       shift 2
        echo "creating ext image with: $*" >> convert-tests-results.txt
        # 256MB is the smallest acceptable btrfs image.
        rm -f $here/test.img >> convert-tests-results.txt 2>&1 \
@@ -25,13 +26,26 @@
                || _fail "could not create test image file"
        $* -F $here/test.img >> convert-tests-results.txt 2>&1 \
                || _fail "filesystem create failed"
-       $here/btrfs-convert $here/test.img >> convert-tests-results.txt 2>&1 \
+       $here/btrfs-convert -N "$nodesize" $here/test.img \
+                       >> convert-tests-results.txt 2>&1 \
                || _fail "btrfs-convert failed"
        $here/btrfs check $here/test.img >> convert-tests-results.txt 2>&1 \
                || _fail "btrfs check detected errors"
 }
 
 # btrfs-convert requires 4k blocksize.
-test "ext2" mke2fs -b 4096
-test "ext3" mke2fs -j -b 4096
-test "ext4" mke2fs -t ext4 -b 4096
+test "ext2 4k nodesize" 4096 mke2fs -b 4096
+test "ext3 4k nodesize" 4096 mke2fs -j -b 4096
+test "ext4 4k nodesize" 4096 mke2fs -t ext4 -b 4096
+test "ext2 8k nodesize" 8192 mke2fs -b 4096
+test "ext3 8k nodesize" 8192 mke2fs -j -b 4096
+test "ext4 8k nodesize" 8192 mke2fs -t ext4 -b 4096
+test "ext2 16k nodesize" 16384 mke2fs -b 4096
+test "ext3 16k nodesize" 16384 mke2fs -j -b 4096
+test "ext4 16k nodesize" 16384 mke2fs -t ext4 -b 4096
+test "ext2 32k nodesize" 32768 mke2fs -b 4096
+test "ext3 32k nodesize" 32768 mke2fs -j -b 4096
+test "ext4 32k nodesize" 32768 mke2fs -t ext4 -b 4096
+test "ext2 64k nodesize" 65536 mke2fs -b 4096
+test "ext3 64k nodesize" 65536 mke2fs -j -b 4096
+test "ext4 64k nodesize" 65536 mke2fs -t ext4 -b 4096
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/utils.c 
new/btrfs-progs-v3.19.1/utils.c
--- old/btrfs-progs-v3.19/utils.c       2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/utils.c     2015-03-25 18:43:42.000000000 +0100
@@ -1708,6 +1708,25 @@
 }
 
 /*
+ * Unsafe subvolume check.
+ *
+ * This only checks ino == BTRFS_FIRST_FREE_OBJECTID, even it is not in a
+ * btrfs mount point.
+ * Must use together with other reliable method like btrfs ioctl.
+ */
+static int __is_subvol(const char *path)
+{
+       struct stat st;
+       int ret;
+
+       ret = lstat(path, &st);
+       if (ret < 0)
+               return ret;
+
+       return st.st_ino == BTRFS_FIRST_FREE_OBJECTID;
+}
+
+/*
  * A not-so-good version fls64. No fascinating optimization since
  * no one except parse_size use it
  */
@@ -1795,6 +1814,55 @@
        return ret;
 }
 
+u64 parse_qgroupid(const char *p)
+{
+       char *s = strchr(p, '/');
+       const char *ptr_src_end = p + strlen(p);
+       char *ptr_parse_end = NULL;
+       u64 level;
+       u64 id;
+       int fd;
+       int ret = 0;
+
+       if (p[0] == '/')
+               goto path;
+
+       /* Numeric format like '0/257' is the primary case */
+       if (!s) {
+               id = strtoull(p, &ptr_parse_end, 10);
+               if (ptr_parse_end != ptr_src_end)
+                       goto path;
+               return id;
+       }
+       level = strtoull(p, &ptr_parse_end, 10);
+       if (ptr_parse_end != s)
+               goto path;
+
+       id = strtoull(s + 1, &ptr_parse_end, 10);
+       if (ptr_parse_end != ptr_src_end)
+               goto  path;
+
+       return (level << BTRFS_QGROUP_LEVEL_SHIFT) | id;
+
+path:
+       /* Path format like subv at 'my_subvol' is the fallback case */
+       ret = __is_subvol(p);
+       if (ret < 0 || !ret)
+               goto err;
+       fd = open(p, O_RDONLY);
+       if (fd < 0)
+               goto err;
+       ret = lookup_ino_rootid(fd, &id);
+       close(fd);
+       if (ret < 0)
+               goto err;
+       return id;
+
+err:
+       fprintf(stderr, "ERROR: invalid qgroupid or subvolume path: %s\n", p);
+       exit(-1);
+}
+
 int open_file_or_dir3(const char *fname, DIR **dirstream, int open_flags)
 {
        int ret;
@@ -2720,3 +2788,24 @@
 
        return v2_supported;
 }
+
+int btrfs_check_node_or_leaf_size(u32 size, u32 sectorsize)
+{
+       if (size < sectorsize) {
+               fprintf(stderr,
+                       "ERROR: Illegal nodesize (or leafsize) %u (smaller than 
%u)\n",
+                       size, sectorsize);
+               return -1;
+       } else if (size > BTRFS_MAX_METADATA_BLOCKSIZE) {
+               fprintf(stderr,
+                       "ERROR: Illegal nodesize (or leafsize) %u (larger than 
%u)\n",
+                       size, BTRFS_MAX_METADATA_BLOCKSIZE);
+               return -1;
+       } else if (size & (sectorsize - 1)) {
+               fprintf(stderr,
+                       "ERROR: Illegal nodesize (or leafsize) %u (not aligned 
to %u)\n",
+                       size, sectorsize);
+               return -1;
+       }
+       return 0;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/utils.h 
new/btrfs-progs-v3.19.1/utils.h
--- old/btrfs-progs-v3.19/utils.h       2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/utils.h     2015-03-25 18:43:42.000000000 +0100
@@ -25,6 +25,7 @@
 
 #define BTRFS_MKFS_SYSTEM_GROUP_SIZE (4 * 1024 * 1024)
 #define BTRFS_MKFS_SMALL_VOLUME_SIZE (1024 * 1024 * 1024)
+#define BTRFS_MKFS_DEFAULT_NODE_SIZE 16384
 
 #define BTRFS_SCAN_MOUNTED     (1ULL << 0)
 #define BTRFS_SCAN_LBLKID      (1ULL << 1)
@@ -113,6 +114,7 @@
 int get_mountpt(char *dev, char *mntpt, size_t size);
 int btrfs_scan_block_devices(int run_ioctl);
 u64 parse_size(char *s);
+u64 parse_qgroupid(const char *p);
 u64 arg_strtou64(const char *str);
 int open_file_or_dir(const char *fname, DIR **dirstream);
 int open_file_or_dir3(const char *fname, DIR **dirstream, int open_flags);
@@ -208,5 +210,6 @@
 }
 
 int btrfs_tree_search2_ioctl_supported(int fd);
+int btrfs_check_node_or_leaf_size(u32 size, u32 sectorsize);
 
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/version.h.in 
new/btrfs-progs-v3.19.1/version.h.in
--- old/btrfs-progs-v3.19/version.h.in  2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/version.h.in        2015-03-25 18:43:42.000000000 
+0100
@@ -8,4 +8,7 @@
 #define BTRFS_LIB_VERSION ( BTRFS_LIB_MAJOR * 10000 + \
                             BTRFS_LIB_MINOR * 100 + \
                             BTRFS_LIB_PATCHLEVEL )
+
+#define BTRFS_BUILD_VERSION "Btrfs @PACKAGE_VERSION@"
+
 #endif
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/btrfs-progs-v3.19/version.sh 
new/btrfs-progs-v3.19.1/version.sh
--- old/btrfs-progs-v3.19/version.sh    2015-03-11 13:40:48.000000000 +0100
+++ new/btrfs-progs-v3.19.1/version.sh  2015-03-25 18:43:42.000000000 +0100
@@ -6,7 +6,7 @@
 # Copyright 2008, Oracle
 # Released under the GNU GPLv2
  
-v="v3.19"
+v="v3.19.1"
 
 opt=$1
 

++++++ local-version-override.patch ++++++
--- /var/tmp/diff_new_pack.44HxWY/_old  2015-03-29 20:15:56.000000000 +0200
+++ /var/tmp/diff_new_pack.44HxWY/_new  2015-03-29 20:15:56.000000000 +0200
@@ -6,8 +6,8 @@
  # Copyright 2008, Oracle
  # Released under the GNU GPLv2
   
--v="v3.19"
-+v="v3.19+20150311"
+-v="v3.19.1"
++v="v3.19.1+20150325"
  
  opt=$1
  

-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to