Hello community, here is the log from the commit of package btrfsprogs for openSUSE:Factory checked in at 2013-11-28 16:50:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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 2013-11-01 17:41:12.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.btrfsprogs.new/btrfsprogs.changes 2013-11-28 16:50:40.000000000 +0100 @@ -1,0 +2,8 @@ +Mon Nov 25 14:10:55 CET 2013 - dste...@suse.cz + +- bump version to 3.12 +- update tarball and remove upstreamed patches +- fsck, image, restore: various improvements and fixes +- btrfs: quota rescan (fate#312751) + +------------------------------------------------------------------- Old: ---- 0010-Btrfs-progs-make-btrfsck-a-hardlink-at-install-time.patch 0012-libbtrfs-Set-SONAME-to-libbtrfs.so.0-instead-of-libb.patch 0040-btrfs-progs-fix-loop-device-mount-checks.patch 0050-Btrfs-progs-commit-the-csum_root-if-we-do-init-csum-.patch 0051-btrfs-progs-Fix-getopt-on-arm-ppc-platforms.patch 0052-btrfs-progs-fix-duplicate-__-su-typedefs-on-ppc64.patch 0053-btrfs-progs-use-reentrant-localtime.patch 0054-btrfs-progs-don-t-have-to-report-ENOMEDIUM-error-dur.patch 0055-Btrfs-progs-added-btrfs-quota-rescan-w-switch-wait.patch 0056-btrfs-progs-fix-qgroup-realloc-inheritance.patch 0057-Btrfs-progs-fix-restore-command-leaving-corrupted-fi.patch 0058-btrfs-progs-avoid-write-to-the-disk-before-sure-to-c.patch 0059-btrfs-progs-error-if-device-for-mkfs-is-too-small.patch 0060-btrfs-progs-error-if-device-have-no-space-to-make-pr.patch 0061-btrfs-progs-calculate-available-blocks-on-device-pro.patch 0062-Btrfs-progs-keep-track-of-transid-failures-and-fix-t.patch btrfs-dev-clear-sb btrfs-progs-add-man-page-for-btrfs-convert.patch btrfs-progs-mkfs-default-extref.diff btrfs-progs-restore-passing-of-super_bytenr-to-device-scan btrfs-progs-use-IEEE1541-suffixes-for-sizes.patch btrfs-progs-v0.20-rc1-358-g194aa4a.tar.bz2 New: ---- 0162-btrfs-progs-fix-loop-device-mount-checks.patch 0163-btrfs-progs-fsck-fix-segfault.patch 0164-btrfs-progs-convert-set-label-or-copy-from-origin.patch 0165-Revert-btrfs-progs-update-options-in-find-root.c.patch 0166-Btrfs-progs-add-some-verbose-output-to-find-root.patch 0167-Btrfs-progs-make-find_and_setup_root-return-an-error.patch 0168-Btrfs-progs-don-t-bug-out-if-we-can-t-find-the-last-.patch 0169-btrfs-progs-Check-metadata-mirrors-in-find-root.patch 0170-btrfs-progs-In-find-root-dump-bytenr-for-every-slot.patch btrfs-progs-v3.12.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ btrfsprogs.spec ++++++ --- /var/tmp/diff_new_pack.npvxdI/_old 2013-11-28 16:50:41.000000000 +0100 +++ /var/tmp/diff_new_pack.npvxdI/_new 2013-11-28 16:50:41.000000000 +0100 @@ -18,9 +18,9 @@ Name: btrfsprogs Url: http://btrfs.wiki.kernel.org/index.php/Main_Page -Version: 0.20 +Version: 3.12 Release: 0 -%define tar_version v0.20-rc1-358-g194aa4a +%define tar_version v3.12 Summary: Utilities for the Btrfs filesystem License: GPL-2.0 Group: System/Filesystems @@ -30,28 +30,18 @@ Source: btrfs-progs-%{tar_version}.tar.bz2 Source1: boot-btrfs.sh Source4: setup-btrfs.sh -Source2: btrfs-dev-clear-sb -Patch10: 0010-Btrfs-progs-make-btrfsck-a-hardlink-at-install-time.patch -Patch12: 0012-libbtrfs-Set-SONAME-to-libbtrfs.so.0-instead-of-libb.patch -Patch40: 0040-btrfs-progs-fix-loop-device-mount-checks.patch -Patch1: btrfs-progs-mkfs-default-extref.diff -Patch50: 0050-Btrfs-progs-commit-the-csum_root-if-we-do-init-csum-.patch -Patch51: 0051-btrfs-progs-Fix-getopt-on-arm-ppc-platforms.patch -Patch52: 0052-btrfs-progs-fix-duplicate-__-su-typedefs-on-ppc64.patch -Patch53: 0053-btrfs-progs-use-reentrant-localtime.patch -Patch54: 0054-btrfs-progs-don-t-have-to-report-ENOMEDIUM-error-dur.patch -Patch55: 0055-Btrfs-progs-added-btrfs-quota-rescan-w-switch-wait.patch -Patch56: 0056-btrfs-progs-fix-qgroup-realloc-inheritance.patch -Patch57: 0057-Btrfs-progs-fix-restore-command-leaving-corrupted-fi.patch -Patch58: 0058-btrfs-progs-avoid-write-to-the-disk-before-sure-to-c.patch -Patch59: 0059-btrfs-progs-error-if-device-for-mkfs-is-too-small.patch -Patch60: 0060-btrfs-progs-error-if-device-have-no-space-to-make-pr.patch -Patch61: 0061-btrfs-progs-calculate-available-blocks-on-device-pro.patch -Patch62: 0062-Btrfs-progs-keep-track-of-transid-failures-and-fix-t.patch + +Patch162: 0162-btrfs-progs-fix-loop-device-mount-checks.patch +Patch163: 0163-btrfs-progs-fsck-fix-segfault.patch +Patch164: 0164-btrfs-progs-convert-set-label-or-copy-from-origin.patch +Patch165: 0165-Revert-btrfs-progs-update-options-in-find-root.c.patch +Patch166: 0166-Btrfs-progs-add-some-verbose-output-to-find-root.patch +Patch167: 0167-Btrfs-progs-make-find_and_setup_root-return-an-error.patch +Patch168: 0168-Btrfs-progs-don-t-bug-out-if-we-can-t-find-the-last-.patch +Patch169: 0169-btrfs-progs-Check-metadata-mirrors-in-find-root.patch +Patch170: 0170-btrfs-progs-In-find-root-dump-bytenr-for-every-slot.patch + Patch1000: local-version-override.patch -Patch1001: btrfs-progs-use-IEEE1541-suffixes-for-sizes.patch -Patch1002: btrfs-progs-add-man-page-for-btrfs-convert.patch -Patch1003: btrfs-progs-restore-passing-of-super_bytenr-to-device-scan BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: libacl-devel @@ -88,27 +78,16 @@ %prep %setup -q -n btrfs-progs-%{tar_version} -%patch10 -p1 -%patch12 -p1 -%patch40 -p1 -%patch1 -p1 +%patch162 -p1 +%patch163 -p1 +%patch164 -p1 +%patch165 -p1 +%patch166 -p1 +%patch167 -p1 +%patch168 -p1 +%patch169 -p1 +%patch170 -p1 %patch1000 -p1 -%patch1001 -p1 -%patch1002 -p1 -%patch1003 -p1 -%patch50 -p1 -%patch51 -p1 -%patch52 -p1 -%patch53 -p1 -%patch54 -p1 -%patch55 -p1 -%patch56 -p1 -%patch57 -p1 -%patch58 -p1 -%patch59 -p1 -%patch60 -p1 -%patch61 -p1 -%patch62 -p1 %build make %{?_smp_mflags} CFLAGS="%{optflags}" all btrfs-convert \ @@ -150,7 +129,6 @@ install -d -m0755 ${RPM_BUILD_ROOT}/lib/mkinitrd/scripts/ install -m 0755 %{S:1} ${RPM_BUILD_ROOT}/lib/mkinitrd/scripts/ install -m 0755 %{S:4} ${RPM_BUILD_ROOT}/lib/mkinitrd/scripts/ -install -m 0755 %{S:2} ${RPM_BUILD_ROOT}/usr/sbin/ rm -f ${RPM_BUILD_ROOT}/%{_libdir}/*.la # don't install .a for now rm -f ${RPM_BUILD_ROOT}/%{_libdir}/*.a @@ -188,17 +166,21 @@ %{_sbindir}/mkfs.btrfs %{_sbindir}/btrfs-debug-tree %{_sbindir}/btrfs-show-super -/usr/sbin/btrfs-dev-clear-sb /lib/mkinitrd/scripts/boot-btrfs.sh /lib/mkinitrd/scripts/setup-btrfs.sh # other /usr/bin/btrfs-map-logical -/usr/sbin/btrfs-dev-clear-sb %_mandir/man8/btrfs-image.8.gz %_mandir/man8/btrfsck.8.gz %_mandir/man8/mkfs.btrfs.8.gz %_mandir/man8/btrfs.8.gz %_mandir/man8/btrfs-convert.8.gz +%_mandir/man8/btrfs-debug-tree.8.gz +%_mandir/man8/btrfs-find-root.8.gz +%_mandir/man8/btrfs-map-logical.8.gz +%_mandir/man8/btrfs-show-super.8.gz +%_mandir/man8/btrfs-zero-log.8.gz +%_mandir/man8/btrfstune.8.gz %files -n libbtrfs0 %defattr(-, root, root) ++++++ 0040-btrfs-progs-fix-loop-device-mount-checks.patch -> 0162-btrfs-progs-fix-loop-device-mount-checks.patch ++++++ --- /work/SRC/openSUSE:Factory/btrfsprogs/0040-btrfs-progs-fix-loop-device-mount-checks.patch 2013-08-27 20:32:47.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.btrfsprogs.new/0162-btrfs-progs-fix-loop-device-mount-checks.patch 2013-11-28 16:50:38.000000000 +0100 @@ -1,7 +1,7 @@ -From be65fb331902152d9b571b2d4ee1bf26bedc795f Mon Sep 17 00:00:00 2001 +From fa69bc83f210e7940adf1051709178e493f58002 Mon Sep 17 00:00:00 2001 From: David Sterba <dste...@suse.cz> Date: Thu, 27 Oct 2011 16:23:14 -0400 -Subject: [PATCH 40/46] btrfs-progs: fix loop device mount checks +Subject: [PATCH 162/170] btrfs-progs: fix loop device mount checks When creating a fs on a loop device, mkfs checks whether the same file is not already mounted, but the backing file of another loop dev may not @@ -12,11 +12,11 @@ utils.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) -diff --git a/utils.c b/utils.c -index 41bfdb0..47b31fc 100644 ---- a/utils.c -+++ b/utils.c -@@ -773,11 +773,11 @@ int is_same_blk_file(const char* a, const char* b) +Index: btrfs-progs-v0.20-rc1-598-g8116550e1662/utils.c +=================================================================== +--- btrfs-progs-v0.20-rc1-598-g8116550e1662.orig/utils.c ++++ btrfs-progs-v0.20-rc1-598-g8116550e1662/utils.c +@@ -831,11 +831,11 @@ static int is_same_blk_file(const char* char real_a[PATH_MAX]; char real_b[PATH_MAX]; @@ -33,7 +33,7 @@ /* Identical path? */ if(strcmp(real_a, real_b) == 0) -@@ -818,8 +818,8 @@ int is_same_loop_file(const char* a, const char* b) +@@ -876,8 +876,8 @@ static int is_same_loop_file(const char* { char res_a[PATH_MAX]; char res_b[PATH_MAX]; @@ -44,7 +44,7 @@ int ret; /* Resolve a if it is a loop device */ -@@ -828,10 +828,12 @@ int is_same_loop_file(const char* a, const char* b) +@@ -886,10 +886,12 @@ static int is_same_loop_file(const char* return 0; return ret; } else if (ret) { @@ -61,7 +61,7 @@ } else { final_a = a; } -@@ -842,10 +844,12 @@ int is_same_loop_file(const char* a, const char* b) +@@ -900,10 +902,12 @@ static int is_same_loop_file(const char* return 0; return ret; } else if (ret) { @@ -78,6 +78,3 @@ } else { final_b = b; } --- -1.8.0.2 - ++++++ 0163-btrfs-progs-fsck-fix-segfault.patch ++++++ >From f0294c7f1135acd58320c8282ed68a337138a7c7 Mon Sep 17 00:00:00 2001 From: David Sterba <dste...@suse.cz> Date: Mon, 30 Apr 2012 17:46:53 +0200 Subject: [PATCH 163/170] btrfs-progs: fsck: fix segfault fix from Chris Mason via pastebin Signed-off-by: David Sterba <dste...@suse.cz> --- cmds-check.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) Index: btrfs-progs-v0.20-rc1-598-g8116550e1662/cmds-check.c =================================================================== --- btrfs-progs-v0.20-rc1-598-g8116550e1662.orig/cmds-check.c +++ btrfs-progs-v0.20-rc1-598-g8116550e1662/cmds-check.c @@ -2209,7 +2209,8 @@ static int check_owner_ref(struct btrfs_ if (btrfs_header_owner(buf) == back->root) return 0; } - BUG_ON(rec->is_root); + if (rec->is_root) + return 1; /* try to find the block by search corresponding fs tree */ key.objectid = btrfs_header_owner(buf); ++++++ 0164-btrfs-progs-convert-set-label-or-copy-from-origin.patch ++++++ >From f160d979c4f8d46a9d0a52394240d51b78237d89 Mon Sep 17 00:00:00 2001 From: David Sterba <dste...@suse.cz> Date: Tue, 31 Jan 2012 14:40:22 +0100 Subject: [PATCH 164/170] btrfs-progs: convert: set label or copy from origin Signed-off-by: David Sterba <dste...@suse.cz> --- btrfs-convert.c | 47 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) Index: btrfs-progs-v0.20-rc1-598-g8116550e1662/btrfs-convert.c =================================================================== --- btrfs-progs-v0.20-rc1-598-g8116550e1662.orig/btrfs-convert.c +++ btrfs-progs-v0.20-rc1-598-g8116550e1662/btrfs-convert.c @@ -2199,8 +2199,8 @@ err: return ret; } -static int do_convert(const char *devname, int datacsum, int packing, - int noxattr) +static int do_convert(const char *devname, int datacsum, int packing, int noxattr, + int copylabel, const char *fslabel) { int i, ret; int fd = -1; @@ -2294,6 +2294,17 @@ static int do_convert(const char *devnam fprintf(stderr, "error during create_ext2_image %d\n", ret); goto fail; } + memset(root->fs_info->super_copy->label, 0, BTRFS_LABEL_SIZE); + if (copylabel == 1) { + strncpy(root->fs_info->super_copy->label, + ext2_fs->super->s_volume_name, 16); + fprintf(stderr, "copy label '%s'\n", + root->fs_info->super_copy->label); + } else if (copylabel == -1) { + strncpy(root->fs_info->super_copy->label, fslabel, BTRFS_LABEL_SIZE); + fprintf(stderr, "set label to '%s'\n", fslabel); + } + printf("cleaning up system chunk.\n"); ret = cleanup_sys_chunk(root, ext2_root); if (ret) { @@ -2688,11 +2699,13 @@ fail: static void print_usage(void) { - printf("usage: btrfs-convert [-d] [-i] [-n] [-r] 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("usage: btrfs-convert [-d] [-i] [-n] [-r] [-l label] [-L] 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"); } int main(int argc, char *argv[]) @@ -2702,9 +2715,12 @@ int main(int argc, char *argv[]) int noxattr = 0; int datacsum = 1; int rollback = 0; + int copylabel = 0; char *file; + char *fslabel = NULL; + while(1) { - int c = getopt(argc, argv, "dinr"); + int c = getopt(argc, argv, "dinrl:L"); if (c < 0) break; switch(c) { @@ -2720,6 +2736,19 @@ int main(int argc, char *argv[]) case 'r': rollback = 1; break; + case 'l': + copylabel = -1; + fslabel = strdup(optarg); + if (strlen(fslabel) > BTRFS_LABEL_SIZE) { + fprintf(stderr, + "warning: label too long, trimmed to %d bytes\n", + BTRFS_LABEL_SIZE); + fslabel[BTRFS_LABEL_SIZE]=0; + } + break; + case 'L': + copylabel = 1; + break; default: print_usage(); return 1; @@ -2740,7 +2769,7 @@ int main(int argc, char *argv[]) if (rollback) { ret = do_rollback(file, 0); } else { - ret = do_convert(file, datacsum, packing, noxattr); + ret = do_convert(file, datacsum, packing, noxattr, copylabel, fslabel); } if (ret) return 1; ++++++ 0165-Revert-btrfs-progs-update-options-in-find-root.c.patch ++++++ >From 0c26634f696f3ced9636de0ca2fa5b7b9d732bc3 Mon Sep 17 00:00:00 2001 From: David Sterba <dste...@suse.cz> Date: Thu, 7 Feb 2013 18:00:23 +0100 Subject: [PATCH 165/170] Revert "btrfs-progs: update options in find-root.c" This reverts commit 7f04a61b6da5a1231454b07e3e37cc24601a76e4. Reintroduce the 'verbose' option. Signed-off-by: David Sterba <dste...@suse.cz> --- btrfs-find-root.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) Index: btrfs-progs-v0.20-rc1-598-g8116550e1662/btrfs-find-root.c =================================================================== --- btrfs-progs-v0.20-rc1-598-g8116550e1662.orig/btrfs-find-root.c +++ btrfs-progs-v0.20-rc1-598-g8116550e1662/btrfs-find-root.c @@ -35,6 +35,7 @@ #include "utils.h" #include "crc32c.h" +static int verbose = 0; static u16 csum_size = 0; static u64 search_objectid = BTRFS_ROOT_TREE_OBJECTID; static u64 search_generation = 0; @@ -42,7 +43,7 @@ static unsigned long search_level = 0; static void usage(void) { - fprintf(stderr, "Usage: find-roots [-o search_objectid] " + fprintf(stderr, "Usage: find-roots [-v] " "[ -g search_generation ] [ -l search_level ] <device>\n"); } @@ -286,9 +287,12 @@ int main(int argc, char **argv) int opt; int ret; - while ((opt = getopt(argc, argv, "l:o:g:")) != -1) { + while ((opt = getopt(argc, argv, "l:o:g:v")) != -1) { switch(opt) { errno = 0; + case 'v': + verbose++; + break; case 'o': search_objectid = (u64)strtoll(optarg, NULL, 10); ++++++ 0166-Btrfs-progs-add-some-verbose-output-to-find-root.patch ++++++ >From 3d75a27a857ae81f7cd64de886a293208be15af6 Mon Sep 17 00:00:00 2001 From: Josef Bacik <jo...@redhat.com> Date: Wed, 4 Jan 2012 10:03:33 -0500 Subject: [PATCH 166/170] Btrfs-progs: add some verbose output to find-root Trying to track down why we can't find roots, add some verbose output so we know what chunks we're scanning and when we move to new chunks. Thanks, Signed-off-by: Josef Bacik <jo...@redhat.com> --- btrfs-find-root.c | 9 +++++++++ 1 file changed, 9 insertions(+) Index: btrfs-progs-v0.20-rc1-598-g8116550e1662/btrfs-find-root.c =================================================================== --- btrfs-progs-v0.20-rc1-598-g8116550e1662.orig/btrfs-find-root.c +++ btrfs-progs-v0.20-rc1-598-g8116550e1662/btrfs-find-root.c @@ -229,6 +229,10 @@ static int find_root(struct btrfs_root * return ret; offset = metadata_offset; + if (verbose) + printf("Checking metadata chunk %Lu, size %Lu\n", + metadata_offset, metadata_size); + while (1) { u64 map_length = 4096; u64 type; @@ -239,6 +243,8 @@ static int find_root(struct btrfs_root * break; } if (offset >= (metadata_offset + metadata_size)) { + if (verbose) + printf("Moving to the next metadata chunk\n"); err = btrfs_next_metadata(&root->fs_info->mapping_tree, &metadata_offset, &metadata_size); @@ -247,6 +253,9 @@ static int find_root(struct btrfs_root * break; } offset = metadata_offset; + if (verbose) + printf("Checking metadata chunk %Lu, size %Lu" + "\n", metadata_offset, metadata_size); } err = __btrfs_map_block(&root->fs_info->mapping_tree, READ, offset, &map_length, &type, ++++++ 0167-Btrfs-progs-make-find_and_setup_root-return-an-error.patch ++++++ >From cc4992b4c3610de4b30ea6a168573841e6cd43e5 Mon Sep 17 00:00:00 2001 From: Josef Bacik <jo...@redhat.com> Date: Wed, 7 Dec 2011 16:11:23 -0500 Subject: [PATCH 167/170] Btrfs-progs: make find_and_setup_root return an error Don't BUG(), return an error so the recovery program can work its mojo. Signed-off-by: Josef Bacik <jo...@redhat.com> --- disk-io.c | 2 ++ 1 file changed, 2 insertions(+) Index: btrfs-progs-v0.20-rc1-598-g8116550e1662/disk-io.c =================================================================== --- btrfs-progs-v0.20-rc1-598-g8116550e1662.orig/disk-io.c +++ btrfs-progs-v0.20-rc1-598-g8116550e1662/disk-io.c @@ -524,6 +524,8 @@ static int find_and_setup_root(struct bt generation = btrfs_root_generation(&root->root_item); root->node = read_tree_block(root, btrfs_root_bytenr(&root->root_item), blocksize, generation); + if (!root->node) + return -ENOENT; if (!extent_buffer_uptodate(root->node)) return -EIO; ++++++ 0168-Btrfs-progs-don-t-bug-out-if-we-can-t-find-the-last-.patch ++++++ >From 6c90b5f56a389b37fcdd85e6dd904288d601b27a Mon Sep 17 00:00:00 2001 From: Josef Bacik <jo...@redhat.com> Date: Wed, 7 Dec 2011 15:54:13 -0500 Subject: [PATCH 168/170] Btrfs-progs: don't bug out if we can't find the last root Return an error instead of BUG()'ing out. Signed-off-by: Josef Bacik <jo...@redhat.com> --- root-tree.c | 5 +++++ 1 file changed, 5 insertions(+) Index: btrfs-progs-v0.20-rc1-598-g8116550e1662/root-tree.c =================================================================== --- btrfs-progs-v0.20-rc1-598-g8116550e1662.orig/root-tree.c +++ btrfs-progs-v0.20-rc1-598-g8116550e1662/root-tree.c @@ -45,6 +45,11 @@ int btrfs_find_last_root(struct btrfs_ro BUG_ON(ret == 0); l = path->nodes[0]; + if (path->slots[0] == 0) { + ret = -ENOENT; + goto out; + } + slot = path->slots[0] - 1; btrfs_item_key_to_cpu(l, &found_key, slot); if (found_key.objectid != objectid) { ++++++ 0169-btrfs-progs-Check-metadata-mirrors-in-find-root.patch ++++++ >From 4469ed43b26b6e7d5ad5cfea45e99708e39de4a6 Mon Sep 17 00:00:00 2001 From: David Marcin <djmar...@google.com> Date: Wed, 16 Nov 2011 12:18:08 -0800 Subject: [PATCH 169/170] btrfs-progs: Check metadata mirrors in find-root. Signed-off-by: David Marcin <djmar...@google.com> --- btrfs-find-root.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/btrfs-find-root.c b/btrfs-find-root.c index 7f7b64f..ffbdde1 100644 --- a/btrfs-find-root.c +++ b/btrfs-find-root.c @@ -236,6 +236,8 @@ static int find_root(struct btrfs_root *root) while (1) { u64 map_length = 4096; u64 type; + int mirror_num; + int num_copies; if (offset > btrfs_super_total_bytes(root->fs_info->super_copy)) { @@ -257,9 +259,11 @@ static int find_root(struct btrfs_root *root) printf("Checking metadata chunk %Lu, size %Lu" "\n", metadata_offset, metadata_size); } + mirror_num = 1; + again: err = __btrfs_map_block(&root->fs_info->mapping_tree, READ, offset, &map_length, &type, - &multi, 0, NULL); + &multi, mirror_num, NULL); if (err) { offset += map_length; continue; @@ -278,9 +282,16 @@ static int find_root(struct btrfs_root *root) err = read_physical(root, fd, offset, bytenr, map_length); if (!err) { + /* Found the root. */ ret = 0; break; } else if (err < 0) { + num_copies = btrfs_num_copies(&root->fs_info->mapping_tree, + offset, map_length); + mirror_num++; + if (mirror_num <= num_copies) + goto again; + /* Unrecoverable error in read. */ ret = err; break; } -- 1.8.3.1 ++++++ 0170-btrfs-progs-In-find-root-dump-bytenr-for-every-slot.patch ++++++ >From 1e9e1d5c876a4c281b3b9e72f4cbaaef1e3a2fa5 Mon Sep 17 00:00:00 2001 From: David Marcin <djmar...@google.com> Date: Mon, 21 Nov 2011 20:51:15 -0600 Subject: [PATCH 170/170] btrfs-progs: In find-root, dump bytenr for every slot. Signed-off-by: David Marcin <djmar...@google.com> --- btrfs-find-root.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/btrfs-find-root.c b/btrfs-find-root.c index ffbdde1..00b10e7 100644 --- a/btrfs-find-root.c +++ b/btrfs-find-root.c @@ -127,8 +127,63 @@ out: return NULL; } +static int dump_root_bytenr(struct btrfs_root *root, u64 bytenr, u64 gen) +{ + struct btrfs_root *tmp = malloc(sizeof(struct btrfs_root)); + struct btrfs_path *path; + struct btrfs_key key; + struct btrfs_root_item ri; + struct extent_buffer *leaf; + struct btrfs_disk_key disk_key; + struct btrfs_key found_key; + int slot; + int ret; + + if (!tmp) + return -ENOMEM; + + __setup_root(4096, 4096, 4096, 4096, tmp, + root->fs_info, BTRFS_ROOT_TREE_OBJECTID); + + tmp->node = read_tree_block(root, bytenr, 4096, gen); + + key.objectid = 0; + key.type = BTRFS_ROOT_ITEM_KEY; + key.offset = -1; + + path = btrfs_alloc_path(); + + /* Walk the slots of this root looking for BTRFS_ROOT_ITEM_KEYs. */ + ret = btrfs_search_slot(NULL, tmp, &key, path, 0, 0); + BUG_ON(ret < 0); + while (1) { + leaf = path->nodes[0]; + slot = path->slots[0]; + if (slot >= btrfs_header_nritems(leaf)) { + ret = btrfs_next_leaf(tmp, path); + if (ret != 0) + break; + leaf = path->nodes[0]; + slot = path->slots[0]; + } + btrfs_item_key(leaf, &disk_key, path->slots[0]); + btrfs_disk_key_to_cpu(&found_key, &disk_key); + if (btrfs_key_type(&found_key) == BTRFS_ROOT_ITEM_KEY) { + unsigned long offset; + + offset = btrfs_item_ptr_offset(leaf, slot); + read_extent_buffer(leaf, &ri, offset, sizeof(ri)); + printf("Generation: %Lu Root bytenr: %Lu\n", gen, btrfs_root_bytenr(&ri)); + } + path->slots[0]++; + } + btrfs_free_path(path); + free_extent_buffer(leaf); + return 0; +} + static int search_iobuf(struct btrfs_root *root, void *iobuf, - size_t iobuf_size, off_t offset) + size_t iobuf_size, off_t offset) { u64 gen = search_generation; u64 objectid = search_objectid; @@ -160,6 +215,9 @@ static int search_iobuf(struct btrfs_root *root, void *iobuf, h_byte); goto next; } + /* Found some kind of root and it's fairly valid. */ + if (dump_root_bytenr(root, h_byte, h_gen)) + break; if (h_gen != gen) { fprintf(stderr, "Well block %Lu seems great, " "but generation doesn't match, " -- 1.8.3.1 ++++++ btrfs-progs-v0.20-rc1-358-g194aa4a.tar.bz2 -> btrfs-progs-v3.12.tar.bz2 ++++++ ++++ 20510 lines of diff (skipped) ++++++ local-version-override.patch ++++++ --- /var/tmp/diff_new_pack.npvxdI/_old 2013-11-28 16:50:42.000000000 +0100 +++ /var/tmp/diff_new_pack.npvxdI/_new 2013-11-28 16:50:42.000000000 +0100 @@ -6,8 +6,8 @@ # Copyright 2008, Oracle # Released under the GNU GPLv2 --v="v0.20-rc1" -+v="v0.20-rc1+20131031" +-v="v3.12" ++v="v3.12+20131125" which git &> /dev/null if [ $? == 0 -a -d .git ]; then -- To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org For additional commands, e-mail: opensuse-commit+h...@opensuse.org