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