Hello community, here is the log from the commit of package btrfsprogs for openSUSE:Factory checked in at 2014-11-29 08:39:46 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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 2014-11-11 09:59:19.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.btrfsprogs.new/btrfsprogs.changes 2014-11-29 08:39:48.000000000 +0100 @@ -1,0 +2,37 @@ +Wed Nov 19 00:00:01 CET 2014 - dsterba@suse.cz + +- version 3.17.2 + - check improvements + - add ability to replace missing dir item/dir indexes + - fix missing inode items + - create missing root dirid + - corrupt block: enhancements for testing fsck + - zero-log: able to reset a fs with bogus log tree pointer (bko#72151) + +------------------------------------------------------------------- +Wed Nov 19 00:00:00 CET 2014 - dsterba@suse.cz + +- package mkinitrd scripts conditionally (bsc#893577) +- spec: minor updates + +------------------------------------------------------------------- +Fri Nov 7 00:00:00 CET 2014 - dsterba@suse.cz + +- version 3.17.1 + - fi df: argument handling + - fix linking with libbtrfs + - replace: better error reporting + - fi show: fixed stall if run concurrently with balance + - check: fixed argument parsing for --subvol-extents + - fi df: SI prefixes corrected +- Added patches: + * fix-doc-build-on-SLE11SP3.diff +- Removed patches: + * 0042-btrfs-progs-fix-linking-with-libbtrfs.patch + * 0043-btrfs-progs-libbtrfs-make-exported-headers-compatibl.patch +- Modified patches: + * 0011-btrfs-progs-Enhance-the-command-btrfs-filesystem-df.patch + * 0012-btrfs-progs-Add-helpers-functions-to-handle-the-prin.patch + * 0019-btrfs-progs-add-original-df-and-rename-disk_usage-to.patch + +------------------------------------------------------------------- Old: ---- 0042-btrfs-progs-fix-linking-with-libbtrfs.patch 0043-btrfs-progs-libbtrfs-make-exported-headers-compatibl.patch btrfs-progs-v3.17.tar.gz New: ---- btrfs-progs-v3.17.2.tar.gz fix-doc-build-on-SLE11SP3.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ btrfsprogs.spec ++++++ --- /var/tmp/diff_new_pack.NWl2TV/_old 2014-11-29 08:39:49.000000000 +0100 +++ /var/tmp/diff_new_pack.NWl2TV/_new 2014-11-29 08:39:49.000000000 +0100 @@ -16,9 +16,8 @@ # -%define tar_version v3.17 Name: btrfsprogs -Version: 3.17 +Version: 3.17.2 Release: 0 Summary: Utilities for the Btrfs filesystem License: GPL-2.0 @@ -26,7 +25,8 @@ Url: http://btrfs.wiki.kernel.org/index.php/Main_Page #Git-Web: http://git.kernel.org/cgit/linux/kernel/git/kdave/btrfs-progs.git #Git-Clone: git://git.kernel.org/pub/scm/linux/kernel/git/kdave/btrfs-progs -Source: https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-%{tar_version}.tar.gz +Source: https://www.kernel.org/pub/linux/kernel/people/kdave/btrfs-progs/btrfs-progs-v%{version}.tar.gz +# support for mkinitrd in < 13.1 Source1: boot-btrfs.sh Source4: setup-btrfs.sh @@ -50,8 +50,6 @@ Patch29: 0029-btrfs-progs-replace-df_pretty_sizes-with-pretty_size.patch Patch30: 0030-btrfs-progs-clean-up-return-codes-and-paths.patch Patch31: 0031-btrfs-progs-move-global-reserve-to-overall-summary.patch -Patch42: 0042-btrfs-progs-fix-linking-with-libbtrfs.patch -Patch43: 0043-btrfs-progs-libbtrfs-make-exported-headers-compatibl.patch Patch163: 0163-btrfs-progs-fsck-fix-segfault.patch Patch167: 0167-Btrfs-progs-make-find_and_setup_root-return-an-error.patch @@ -59,6 +57,7 @@ Patch169: 0169-btrfs-progs-Check-metadata-mirrors-in-find-root.patch Patch1000: local-version-override.patch +Patch1001: fix-doc-build-on-SLE11SP3.diff BuildRequires: asciidoc BuildRequires: libacl-devel @@ -67,6 +66,9 @@ BuildRequires: libext2fs-devel BuildRequires: libuuid-devel BuildRequires: lzo-devel +%if 0%{?suse_version} >= 1310 +BuildRequires: suse-module-tools +%endif BuildRequires: udev BuildRequires: xmlto BuildRequires: zlib-devel @@ -95,7 +97,7 @@ build applications to interface with btrfs. %prep -%setup -q -n btrfs-progs-%{tar_version} +%setup -q -n btrfs-progs-v%{version} %patch10 -p1 %patch11 -p1 %patch12 -p1 @@ -116,13 +118,12 @@ %patch30 -p1 %patch31 -p1 %patch28 -p1 -%patch42 -p1 -%patch43 -p1 %patch163 -p1 %patch167 -p1 %patch168 -p1 %patch169 -p1 %patch1000 -p1 +%patch1001 -p1 %build make %{?_smp_mflags} CFLAGS="%{optflags}" all btrfs-convert \ @@ -153,9 +154,11 @@ ln -s %{_sbindir}/btrfs-show-super %{buildroot}/sbin ln -s %{_sbindir}/mkfs.btrfs %{buildroot}/sbin ln -s %{_sbindir}/fsck.btrfs %{buildroot}/sbin +%if 0%{?suse_version} < 1310 install -d -m0755 %{buildroot}/lib/mkinitrd/scripts/ install -m 0755 %{SOURCE1} %{buildroot}/lib/mkinitrd/scripts/ install -m 0755 %{SOURCE4} %{buildroot}/lib/mkinitrd/scripts/ +%endif find %{buildroot} -type f -name "*.la" -delete -print # don't install .a for now rm -f %{buildroot}/%{_libdir}/*.a @@ -175,6 +178,11 @@ %postun -n libbtrfs0 -p /sbin/ldconfig +%if 0%{?suse_version} >= 1310 +%posttrans +%{?regenerate_initrd_posttrans} +%endif + %files %defattr(-, root, root) /sbin/fsck.btrfs @@ -198,10 +206,12 @@ %{_sbindir}/mkfs.btrfs %{_sbindir}/btrfs-debug-tree %{_sbindir}/btrfs-show-super +%if 0%{?suse_version} < 1310 %dir /lib/mkinitrd %dir /lib/mkinitrd/scripts /lib/mkinitrd/scripts/boot-btrfs.sh /lib/mkinitrd/scripts/setup-btrfs.sh +%endif %{_bindir}/btrfs-map-logical %{_mandir}/man8/btrfs-image.8.gz %{_mandir}/man8/btrfsck.8.gz ++++++ 0011-btrfs-progs-Enhance-the-command-btrfs-filesystem-df.patch ++++++ --- /var/tmp/diff_new_pack.NWl2TV/_old 2014-11-29 08:39:49.000000000 +0100 +++ /var/tmp/diff_new_pack.NWl2TV/_new 2014-11-29 08:39:49.000000000 +0100 @@ -22,24 +22,23 @@ create mode 100644 cmds-fi-disk_usage.c create mode 100644 cmds-fi-disk_usage.h -diff --git a/Makefile b/Makefile -index 9c69adae9050..a6c1ccede7c4 100644 ---- a/Makefile -+++ b/Makefile -@@ -15,7 +15,7 @@ cmds_objects = cmds-subvolume.o cmds-filesystem.o cmds-device.o cmds-scrub.o \ +Index: btrfs-progs-v3.17.1/Makefile +=================================================================== +--- btrfs-progs-v3.17.1.orig/Makefile ++++ btrfs-progs-v3.17.1/Makefile +@@ -15,7 +15,7 @@ cmds_objects = cmds-subvolume.o cmds-fil cmds-inspect.o cmds-balance.o cmds-send.o cmds-receive.o \ cmds-quota.o cmds-qgroup.o cmds-replace.o cmds-check.o \ cmds-restore.o cmds-rescue.o chunk-recover.o super-recover.o \ - cmds-property.o + cmds-property.o cmds-fi-disk_usage.o libbtrfs_objects = send-stream.o send-utils.o rbtree.o btrfs-list.o crc32c.o \ - uuid-tree.o utils-lib.o + uuid-tree.o utils-lib.o rbtree-utils.o libbtrfs_headers = send-stream.h send-utils.h send.h rbtree.h btrfs-list.h \ -diff --git a/cmds-fi-disk_usage.c b/cmds-fi-disk_usage.c -new file mode 100644 -index 000000000000..7f4415666bd8 +Index: btrfs-progs-v3.17.1/cmds-fi-disk_usage.c +=================================================================== --- /dev/null -+++ b/cmds-fi-disk_usage.c ++++ btrfs-progs-v3.17.1/cmds-fi-disk_usage.c @@ -0,0 +1,516 @@ +/* + * This program is free software; you can redistribute it and/or @@ -557,11 +556,10 @@ + return 0; +} + -diff --git a/cmds-fi-disk_usage.h b/cmds-fi-disk_usage.h -new file mode 100644 -index 000000000000..9f68bb342d52 +Index: btrfs-progs-v3.17.1/cmds-fi-disk_usage.h +=================================================================== --- /dev/null -+++ b/cmds-fi-disk_usage.h ++++ btrfs-progs-v3.17.1/cmds-fi-disk_usage.h @@ -0,0 +1,25 @@ +/* + * Copyright (C) 2007 Oracle. All rights reserved. @@ -588,10 +586,10 @@ +int cmd_filesystem_df(int argc, char **argv); + +#endif -diff --git a/cmds-filesystem.c b/cmds-filesystem.c -index ffa939c5b89a..91e4e2e5a881 100644 ---- a/cmds-filesystem.c -+++ b/cmds-filesystem.c +Index: btrfs-progs-v3.17.1/cmds-filesystem.c +=================================================================== +--- btrfs-progs-v3.17.1.orig/cmds-filesystem.c ++++ btrfs-progs-v3.17.1/cmds-filesystem.c @@ -36,6 +36,7 @@ #include "volumes.h" #include "version.h" @@ -600,7 +598,7 @@ #include "list_sort.h" #include "disk-io.h" -@@ -112,6 +113,7 @@ static const char * const filesystem_cmd_group_usage[] = { +@@ -121,6 +122,7 @@ static const char * const filesystem_cmd NULL }; @@ -608,15 +606,15 @@ static const char * const cmd_df_usage[] = { "btrfs filesystem df [options] <path>", "Show space usage information for a mount point", -@@ -126,6 +128,7 @@ static const char * const cmd_df_usage[] = { - "-t|--tbytes show sizes in TiB, or tB with --si", +@@ -135,6 +137,7 @@ static const char * const cmd_df_usage[] + "-t|--tbytes show sizes in TiB, or TB with --si", NULL }; +#endif static int get_df(int fd, struct btrfs_ioctl_space_args **sargs_ret) { -@@ -175,6 +178,7 @@ static int get_df(int fd, struct btrfs_ioctl_space_args **sargs_ret) +@@ -184,6 +187,7 @@ static int get_df(int fd, struct btrfs_i return 0; } @@ -624,7 +622,7 @@ static void print_df(struct btrfs_ioctl_space_args *sargs, unsigned unit_mode) { u64 i; -@@ -269,6 +273,7 @@ static int cmd_df(int argc, char **argv) +@@ -277,6 +281,7 @@ static int cmd_df(int argc, char **argv) close_file_or_dir(fd, dirstream); return !!ret; } @@ -632,7 +630,7 @@ static int match_search_item_kernel(__u8 *fsid, char *mnt, char *label, char *search) -@@ -1263,7 +1268,7 @@ static int cmd_label(int argc, char **argv) +@@ -1275,7 +1280,7 @@ static int cmd_label(int argc, char **ar const struct cmd_group filesystem_cmd_group = { filesystem_cmd_group_usage, NULL, { @@ -641,10 +639,10 @@ { "show", cmd_show, cmd_show_usage, NULL, 0 }, { "sync", cmd_sync, cmd_sync_usage, NULL, 0 }, { "defragment", cmd_defrag, cmd_defrag_usage, NULL, 0 }, -diff --git a/ctree.h b/ctree.h -index 89036defc396..5a60bd268871 100644 ---- a/ctree.h -+++ b/ctree.h +Index: btrfs-progs-v3.17.1/ctree.h +=================================================================== +--- btrfs-progs-v3.17.1.orig/ctree.h ++++ btrfs-progs-v3.17.1/ctree.h @@ -842,9 +842,10 @@ struct btrfs_csum_item { #define BTRFS_BLOCK_GROUP_RAID1 (1ULL << 4) #define BTRFS_BLOCK_GROUP_DUP (1ULL << 5) @@ -658,10 +656,10 @@ #define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \ BTRFS_BLOCK_GROUP_SYSTEM | \ -diff --git a/utils.c b/utils.c -index 43b693c94039..cf0559d9c9dd 100644 ---- a/utils.c -+++ b/utils.c +Index: btrfs-progs-v3.17.1/utils.c +=================================================================== +--- btrfs-progs-v3.17.1.orig/utils.c ++++ btrfs-progs-v3.17.1/utils.c @@ -38,6 +38,8 @@ #include <linux/kdev_t.h> #include <limits.h> @@ -671,7 +669,7 @@ #include "kerncompat.h" #include "radix-tree.h" #include "ctree.h" -@@ -2475,3 +2477,12 @@ char* btrfs_group_profile_str(u64 flag) +@@ -2493,3 +2495,12 @@ char* btrfs_group_profile_str(u64 flag) } } @@ -684,11 +682,11 @@ + else + return sfs.f_bsize * sfs.f_blocks; +} -diff --git a/utils.h b/utils.h -index 0d202f6344c4..2976e11d7a93 100644 ---- a/utils.h -+++ b/utils.h -@@ -133,6 +133,7 @@ int find_mount_root(const char *path, char **mount_root); +Index: btrfs-progs-v3.17.1/utils.h +=================================================================== +--- btrfs-progs-v3.17.1.orig/utils.h ++++ btrfs-progs-v3.17.1/utils.h +@@ -134,6 +134,7 @@ int find_mount_root(const char *path, ch int get_device_info(int fd, u64 devid, struct btrfs_ioctl_dev_info_args *di_args); int test_uuid_unique(char *fs_uuid); @@ -696,6 +694,3 @@ int test_minimum_size(const char *file, u32 leafsize); int test_issubvolname(const char *name); --- -2.1.1 - ++++++ 0012-btrfs-progs-Add-helpers-functions-to-handle-the-prin.patch ++++++ --- /var/tmp/diff_new_pack.NWl2TV/_old 2014-11-29 08:39:49.000000000 +0100 +++ /var/tmp/diff_new_pack.NWl2TV/_new 2014-11-29 08:39:49.000000000 +0100 @@ -39,24 +39,23 @@ create mode 100644 string-table.c create mode 100644 string-table.h -diff --git a/Makefile b/Makefile -index a6c1ccede7c4..7f76447e3c55 100644 ---- a/Makefile -+++ b/Makefile -@@ -10,7 +10,7 @@ objects = ctree.o disk-io.o radix-tree.o extent-tree.o print-tree.o \ +Index: btrfs-progs-v3.17.1/Makefile +=================================================================== +--- btrfs-progs-v3.17.1.orig/Makefile ++++ btrfs-progs-v3.17.1/Makefile +@@ -10,7 +10,7 @@ objects = ctree.o disk-io.o radix-tree.o root-tree.o dir-item.o file-item.o inode-item.o inode-map.o \ extent-cache.o extent_io.o volumes.o utils.o repair.o \ qgroup.o raid6.o free-space-cache.o list_sort.o props.o \ -- ulist.o qgroup-verify.o backref.o rbtree-utils.o -+ ulist.o qgroup-verify.o backref.o rbtree-utils.o string-table.o +- ulist.o qgroup-verify.o backref.o ++ ulist.o qgroup-verify.o backref.o string-table.o cmds_objects = cmds-subvolume.o cmds-filesystem.o cmds-device.o cmds-scrub.o \ cmds-inspect.o cmds-balance.o cmds-send.o cmds-receive.o \ cmds-quota.o cmds-qgroup.o cmds-replace.o cmds-check.o \ -diff --git a/string-table.c b/string-table.c -new file mode 100644 -index 000000000000..701f2147a3cc +Index: btrfs-progs-v3.17.1/string-table.c +=================================================================== --- /dev/null -+++ b/string-table.c ++++ btrfs-progs-v3.17.1/string-table.c @@ -0,0 +1,156 @@ +/* + * This program is free software; you can redistribute it and/or @@ -214,11 +213,10 @@ + free(tab); + +} -diff --git a/string-table.h b/string-table.h -new file mode 100644 -index 000000000000..83c4425d5f76 +Index: btrfs-progs-v3.17.1/string-table.h +=================================================================== --- /dev/null -+++ b/string-table.h ++++ btrfs-progs-v3.17.1/string-table.h @@ -0,0 +1,36 @@ +/* + * This program is free software; you can redistribute it and/or @@ -256,6 +254,3 @@ +void table_free(struct string_table *); + +#endif --- -2.1.1 - ++++++ 0019-btrfs-progs-add-original-df-and-rename-disk_usage-to.patch ++++++ --- /var/tmp/diff_new_pack.NWl2TV/_old 2014-11-29 08:39:49.000000000 +0100 +++ /var/tmp/diff_new_pack.NWl2TV/_new 2014-11-29 08:39:49.000000000 +0100 @@ -16,11 +16,11 @@ cmds-filesystem.c | 16 ++++------ 3 files changed, 24 insertions(+), 84 deletions(-) -diff --git a/cmds-fi-disk_usage.c b/cmds-fi-disk_usage.c -index 9fd59bc1b5ae..683d6fb36de4 100644 ---- a/cmds-fi-disk_usage.c -+++ b/cmds-fi-disk_usage.c -@@ -328,6 +328,8 @@ static struct btrfs_ioctl_space_args *load_space_info(int fd, char *path) +Index: btrfs-progs-v3.17.1/cmds-fi-disk_usage.c +=================================================================== +--- btrfs-progs-v3.17.1.orig/cmds-fi-disk_usage.c ++++ btrfs-progs-v3.17.1/cmds-fi-disk_usage.c +@@ -328,6 +328,8 @@ static struct btrfs_ioctl_space_args *lo return sargs; } @@ -93,7 +93,7 @@ /* * Helper to sort the disk_info structure -@@ -612,10 +559,10 @@ static u64 calc_chunk_size(struct chunk_info *ci) +@@ -612,10 +559,10 @@ static u64 calc_chunk_size(struct chunk_ } /* @@ -106,7 +106,7 @@ struct btrfs_ioctl_space_args *sargs, struct chunk_info *chunks_info_ptr, int chunks_info_count, -@@ -795,10 +742,10 @@ static void print_chunk_disks(u64 chunk_type, +@@ -795,10 +742,10 @@ static void print_chunk_disks(u64 chunk_ } /* @@ -119,7 +119,7 @@ struct btrfs_ioctl_space_args *sargs, struct chunk_info *info_ptr, int info_count, -@@ -839,7 +786,7 @@ static void _cmd_filesystem_disk_usage_linear(int mode, +@@ -839,7 +786,7 @@ static void _cmd_filesystem_disk_usage_l } @@ -128,7 +128,7 @@ { struct btrfs_ioctl_space_args *sargs = 0; int info_count = 0; -@@ -860,11 +807,11 @@ static int _cmd_filesystem_disk_usage(int fd, char *path, int mode, int tabular) +@@ -860,11 +807,11 @@ static int _cmd_filesystem_disk_usage(in } if (tabular) @@ -153,7 +153,7 @@ "Show in which disk the chunks are allocated.", "", "-b\tSet byte as unit", -@@ -889,7 +836,7 @@ const char * const cmd_filesystem_disk_usage_usage[] = { +@@ -889,7 +836,7 @@ const char * const cmd_filesystem_disk_u NULL }; @@ -162,7 +162,7 @@ { int flags = DF_HUMAN_UNIT; -@@ -909,12 +856,12 @@ int cmd_filesystem_disk_usage(int argc, char **argv) +@@ -909,12 +856,12 @@ int cmd_filesystem_disk_usage(int argc, tabular = 1; break; default: @@ -177,7 +177,7 @@ for (i = optind; i < argc ; i++) { int r, fd; -@@ -928,7 +875,7 @@ int cmd_filesystem_disk_usage(int argc, char **argv) +@@ -928,7 +875,7 @@ int cmd_filesystem_disk_usage(int argc, argv[1]); return 12; } @@ -186,10 +186,10 @@ close_file_or_dir(fd, dirstream); if (r) -diff --git a/cmds-fi-disk_usage.h b/cmds-fi-disk_usage.h -index c315004cd806..95cf4aabefb4 100644 ---- a/cmds-fi-disk_usage.h -+++ b/cmds-fi-disk_usage.h +Index: btrfs-progs-v3.17.1/cmds-fi-disk_usage.h +=================================================================== +--- btrfs-progs-v3.17.1.orig/cmds-fi-disk_usage.h ++++ btrfs-progs-v3.17.1/cmds-fi-disk_usage.h @@ -19,11 +19,8 @@ #ifndef __CMDS_FI_DISK_USAGE__ #define __CMDS_FI_DISK_USAGE__ @@ -204,11 +204,11 @@ extern const char * const cmd_device_disk_usage_usage[]; int cmd_device_disk_usage(int argc, char **argv); -diff --git a/cmds-filesystem.c b/cmds-filesystem.c -index 43d5c31dcbb0..6626c7c9eaa2 100644 ---- a/cmds-filesystem.c -+++ b/cmds-filesystem.c -@@ -113,8 +113,7 @@ static const char * const filesystem_cmd_group_usage[] = { +Index: btrfs-progs-v3.17.1/cmds-filesystem.c +=================================================================== +--- btrfs-progs-v3.17.1.orig/cmds-filesystem.c ++++ btrfs-progs-v3.17.1/cmds-filesystem.c +@@ -122,8 +122,7 @@ static const char * const filesystem_cmd NULL }; @@ -218,15 +218,15 @@ "btrfs filesystem df [options] <path>", "Show space usage information for a mount point", "-b|--raw raw numbers in bytes", -@@ -128,7 +127,6 @@ static const char * const cmd_df_usage[] = { - "-t|--tbytes show sizes in TiB, or tB with --si", +@@ -137,7 +136,6 @@ static const char * const cmd_df_usage[] + "-t|--tbytes show sizes in TiB, or TB with --si", NULL }; -#endif static int get_df(int fd, struct btrfs_ioctl_space_args **sargs_ret) { -@@ -178,7 +176,6 @@ static int get_df(int fd, struct btrfs_ioctl_space_args **sargs_ret) +@@ -187,7 +185,6 @@ static int get_df(int fd, struct btrfs_i return 0; } @@ -234,7 +234,7 @@ static void print_df(struct btrfs_ioctl_space_args *sargs, unsigned unit_mode) { u64 i; -@@ -193,7 +190,7 @@ static void print_df(struct btrfs_ioctl_space_args *sargs, unsigned unit_mode) +@@ -202,7 +199,7 @@ static void print_df(struct btrfs_ioctl_ } } @@ -243,7 +243,7 @@ { struct btrfs_ioctl_space_args *sargs = NULL; int ret; -@@ -247,12 +244,12 @@ static int cmd_df(int argc, char **argv) +@@ -255,12 +252,12 @@ static int cmd_df(int argc, char **argv) units_set_mode(&unit_mode, UNITS_BINARY); break; default: @@ -252,13 +252,13 @@ } } - if (check_argc_max(argc, optind + 1)) + if (check_argc_exact(argc, optind + 1)) - usage(cmd_df_usage); + usage(cmd_filesystem_df_usage); path = argv[optind]; -@@ -273,7 +270,6 @@ static int cmd_df(int argc, char **argv) +@@ -281,7 +278,6 @@ static int cmd_df(int argc, char **argv) close_file_or_dir(fd, dirstream); return !!ret; } @@ -266,7 +266,7 @@ static int match_search_item_kernel(__u8 *fsid, char *mnt, char *label, char *search) -@@ -1275,8 +1271,8 @@ const struct cmd_group filesystem_cmd_group = { +@@ -1287,8 +1283,8 @@ const struct cmd_group filesystem_cmd_gr { "balance", cmd_balance, NULL, &balance_cmd_group, 1 }, { "resize", cmd_resize, cmd_resize_usage, NULL, 0 }, { "label", cmd_label, cmd_label_usage, NULL, 0 }, @@ -277,6 +277,3 @@ NULL_CMD_STRUCT } --- -2.1.1 - ++++++ btrfs-progs-v3.17.tar.gz -> btrfs-progs-v3.17.2.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/.gitignore new/btrfs-progs-v3.17.2/.gitignore --- old/btrfs-progs-v3.17/.gitignore 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/.gitignore 2014-11-19 17:44:56.000000000 +0100 @@ -1,6 +1,7 @@ *.o *.static.o *.o.d +tags .cc-defines.h version.h version @@ -30,8 +31,11 @@ btrfs-zero-log btrfs-corrupt-block btrfs-select-super +btrfs-calc-size btrfstune libbtrfs.a libbtrfs.so libbtrfs.so.0 libbtrfs.so.0.1 +library-test +library-test-static diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/Documentation/btrfs-check.txt new/btrfs-progs-v3.17.2/Documentation/btrfs-check.txt --- old/btrfs-progs-v3.17/Documentation/btrfs-check.txt 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/Documentation/btrfs-check.txt 2014-11-19 17:44:56.000000000 +0100 @@ -32,6 +32,8 @@ create a new extent tree. --check-data-csum:: verify checkums of data blocks. +--subvol-extents <subvolid>:: +show extent state for a subvolume. EXIT STATUS ----------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/Documentation/btrfs-filesystem.txt new/btrfs-progs-v3.17.2/Documentation/btrfs-filesystem.txt --- old/btrfs-progs-v3.17/Documentation/btrfs-filesystem.txt 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/Documentation/btrfs-filesystem.txt 2014-11-19 17:44:56.000000000 +0100 @@ -35,11 +35,11 @@ -k|--kbytes:::: show sizes in KiB, or kB with --si -m|--mbytes:::: -show sizes in MiB, or mB with --si +show sizes in MiB, or MB with --si -g|--gbytes:::: -show sizes in GiB, or gB with --si +show sizes in GiB, or GB with --si -t|--tbytes:::: -show sizes in TiB, or tB with --si +show sizes in TiB, or TB with --si If conflicting options are passed, the last one takes precedence. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/Makefile new/btrfs-progs-v3.17.2/Makefile --- old/btrfs-progs-v3.17/Makefile 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/Makefile 2014-11-19 17:44:56.000000000 +0100 @@ -10,14 +10,14 @@ root-tree.o dir-item.o file-item.o inode-item.o inode-map.o \ extent-cache.o extent_io.o volumes.o utils.o repair.o \ qgroup.o raid6.o free-space-cache.o list_sort.o props.o \ - ulist.o qgroup-verify.o backref.o rbtree-utils.o + ulist.o qgroup-verify.o backref.o cmds_objects = cmds-subvolume.o cmds-filesystem.o cmds-device.o cmds-scrub.o \ cmds-inspect.o cmds-balance.o cmds-send.o cmds-receive.o \ cmds-quota.o cmds-qgroup.o cmds-replace.o cmds-check.o \ cmds-restore.o cmds-rescue.o chunk-recover.o super-recover.o \ cmds-property.o libbtrfs_objects = send-stream.o send-utils.o rbtree.o btrfs-list.o crc32c.o \ - uuid-tree.o utils-lib.o + uuid-tree.o utils-lib.o rbtree-utils.o libbtrfs_headers = send-stream.h send-utils.h send.h rbtree.h btrfs-list.h \ crc32c.h list.h kerncompat.h radix-tree.h extent-cache.h \ extent_io.h ioctl.h ctree.h btrfsck.h version.h @@ -50,6 +50,9 @@ btrfs btrfs-map-logical btrfs-image btrfs-zero-log btrfs-convert \ btrfs-find-root btrfstune btrfs-show-super +progs_extra = btrfs-corrupt-block btrfs-fragments btrfs-calc-size \ + btrfs-select-super + progs_static = $(foreach p,$(progs),$(p).static) # external libs required by various binaries; for btrfs-foo, @@ -240,6 +243,22 @@ @echo " [LD] $@" $(Q)$(CC) $(CFLAGS) -o send-test $(objects) send-test.o $(LDFLAGS) $(LIBS) -lpthread +library-test: $(libs_shared) library-test.o + @echo " [LD] $@" + $(Q)$(CC) $(CFLAGS) -o library-test library-test.o $(LDFLAGS) -lbtrfs + +library-test.static: $(libs_static) library-test.o + @echo " [LD] $@" + $(Q)$(CC) $(CFLAGS) -o library-test-static library-test.o $(LDFLAGS) $(libs_static) + +test-build: + $(MAKE) clean-all + $(MAKE) library-test + -$(MAKE) library-test.static + $(MAKE) -j 8 all + -$(MAKE) -j 8 static + $(MAKE) -j 8 $(progs_extra) + manpages: $(Q)$(MAKE) $(MAKEOPTS) -C Documentation @@ -247,11 +266,12 @@ clean: $(CLEANDIRS) @echo "Cleaning" - $(Q)rm -f $(progs) cscope.out *.o *.o.d btrfs-convert btrfs-image btrfs-select-super \ - btrfs-zero-log btrfstune dir-test ioctl-test quick-test send-test btrfsck \ - btrfs.static mkfs.btrfs.static btrfs-calc-size \ + $(Q)rm -f $(progs) cscope.out *.o *.o.d \ + dir-test ioctl-test quick-test send-test library-test library-test-static \ + btrfs.static mkfs.btrfs.static \ version.h $(check_defs) \ - $(libs) $(lib_links) + $(libs) $(lib_links) \ + $(progs_static) $(progs_extra) clean-doc: @echo "Cleaning Documentation" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/btrfs-corrupt-block.c new/btrfs-progs-v3.17.2/btrfs-corrupt-block.c --- old/btrfs-progs-v3.17/btrfs-corrupt-block.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/btrfs-corrupt-block.c 2014-11-19 17:44:56.000000000 +0100 @@ -111,6 +111,7 @@ fprintf(stderr, "\t-I An item to corrupt (must also specify the field " "to corrupt and a root+key for the item)\n"); fprintf(stderr, "\t-D Corrupt a dir item, must specify key and field\n"); + fprintf(stderr, "\t-d Delete this item (must specify -K)\n"); exit(1); } @@ -811,6 +812,39 @@ return ret; } +static int delete_item(struct btrfs_root *root, struct btrfs_key *key) +{ + struct btrfs_trans_handle *trans; + struct btrfs_path *path; + int ret; + + path = btrfs_alloc_path(); + if (!path) + return -ENOMEM; + + trans = btrfs_start_transaction(root, 1); + if (IS_ERR(trans)) { + btrfs_free_path(path); + fprintf(stderr, "Couldn't start transaction %ld\n", + PTR_ERR(trans)); + return PTR_ERR(trans); + } + + ret = btrfs_search_slot(trans, root, key, path, -1, 1); + if (ret) { + if (ret > 0) + ret = -ENOENT; + fprintf(stderr, "Error searching to node %d\n", ret); + goto out; + } + ret = btrfs_del_item(trans, root, path); + btrfs_mark_buffer_dirty(path->nodes[0]); +out: + btrfs_commit_transaction(trans, root); + btrfs_free_path(path); + return ret; +} + static struct option long_options[] = { /* { "byte-count", 1, NULL, 'b' }, */ { "logical", 1, NULL, 'l' }, @@ -828,6 +862,7 @@ { "key", 1, NULL, 'K'}, { "item", 0, NULL, 'I'}, { "dir-item", 0, NULL, 'D'}, + { "delete", 0, NULL, 'd'}, { 0, 0, 0, 0} }; @@ -993,6 +1028,7 @@ int chunk_tree = 0; int corrupt_item = 0; int corrupt_di = 0; + int delete = 0; u64 metadata_block = 0; u64 inode = 0; u64 file_extent = (u64)-1; @@ -1004,7 +1040,7 @@ while(1) { int c; - c = getopt_long(ac, av, "l:c:b:eEkuUi:f:x:m:K:ID", long_options, + c = getopt_long(ac, av, "l:c:b:eEkuUi:f:x:m:K:IDd", long_options, &option_index); if (c < 0) break; @@ -1060,6 +1096,8 @@ break; case 'I': corrupt_item = 1; + case 'd': + delete = 1; break; default: print_usage(); @@ -1167,6 +1205,11 @@ if (!key.objectid) print_usage(); ret = corrupt_btrfs_item(root, &key, field); + } + if (delete) { + if (!key.objectid) + print_usage(); + ret = delete_item(root, &key); goto out_close; } if (key.objectid || key.offset || key.type) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/btrfs-map-logical.c new/btrfs-progs-v3.17.2/btrfs-map-logical.c --- old/btrfs-progs-v3.17/btrfs-map-logical.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/btrfs-map-logical.c 2014-11-19 17:44:56.000000000 +0100 @@ -76,8 +76,18 @@ (unsigned long long)eb->dev_bytenr, device->name); kfree(multi); - if (!copy || mirror_num == copy) + if (!copy || mirror_num == copy) { ret = read_extent_from_disk(eb, 0, eb->len); + if (ret) { + fprintf(info_file, + "Error: failed to read extent: mirror %d logical %llu: %s\n", + mirror_num, (unsigned long long)eb->start, + strerror(-ret)); + free_extent_buffer(eb); + eb = NULL; + break; + } + } num_copies = btrfs_num_copies(&root->fs_info->mapping_tree, eb->start, eb->len); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/btrfs-zero-log.c new/btrfs-progs-v3.17.2/btrfs-zero-log.c --- old/btrfs-progs-v3.17/btrfs-zero-log.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/btrfs-zero-log.c 2014-11-19 17:44:56.000000000 +0100 @@ -61,7 +61,7 @@ goto out; } - root = open_ctree(av[1], 0, OPEN_CTREE_WRITES); + root = open_ctree(av[1], 0, OPEN_CTREE_WRITES | OPEN_CTREE_PARTIAL); if (root == NULL) return 1; @@ -71,6 +71,7 @@ btrfs_set_super_log_root_level(root->fs_info->super_copy, 0); btrfs_commit_transaction(trans, root); close_ctree(root); + printf("Log root zero'ed\n"); out: return !!ret; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/cmds-check.c new/btrfs-progs-v3.17.2/cmds-check.c --- old/btrfs-progs-v3.17/cmds-check.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/cmds-check.c 2014-11-19 17:44:56.000000000 +0100 @@ -1727,6 +1727,61 @@ return ret; } +static int create_inode_item(struct btrfs_root *root, + struct inode_record *rec, + struct inode_backref *backref, int root_dir) +{ + struct btrfs_trans_handle *trans; + struct btrfs_inode_item inode_item; + time_t now = time(NULL); + int ret; + + trans = btrfs_start_transaction(root, 1); + if (IS_ERR(trans)) { + ret = PTR_ERR(trans); + return ret; + } + + fprintf(stderr, "root %llu inode %llu recreating inode item, this may " + "be incomplete, please check permissions and content after " + "the fsck completes.\n", (unsigned long long)root->objectid, + (unsigned long long)rec->ino); + + memset(&inode_item, 0, sizeof(inode_item)); + btrfs_set_stack_inode_generation(&inode_item, trans->transid); + if (root_dir) + btrfs_set_stack_inode_nlink(&inode_item, 1); + else + btrfs_set_stack_inode_nlink(&inode_item, rec->found_link); + btrfs_set_stack_inode_nbytes(&inode_item, rec->found_size); + if (rec->found_dir_item) { + if (rec->found_file_extent) + fprintf(stderr, "root %llu inode %llu has both a dir " + "item and extents, unsure if it is a dir or a " + "regular file so setting it as a directory\n", + (unsigned long long)root->objectid, + (unsigned long long)rec->ino); + btrfs_set_stack_inode_mode(&inode_item, S_IFDIR | 0755); + btrfs_set_stack_inode_size(&inode_item, rec->found_size); + } else if (!rec->found_dir_item) { + btrfs_set_stack_inode_size(&inode_item, rec->extent_end); + btrfs_set_stack_inode_mode(&inode_item, S_IFREG | 0755); + } + btrfs_set_stack_timespec_sec(&inode_item.atime, now); + btrfs_set_stack_timespec_nsec(&inode_item.atime, 0); + btrfs_set_stack_timespec_sec(&inode_item.ctime, now); + btrfs_set_stack_timespec_nsec(&inode_item.ctime, 0); + btrfs_set_stack_timespec_sec(&inode_item.mtime, now); + btrfs_set_stack_timespec_nsec(&inode_item.mtime, 0); + btrfs_set_stack_timespec_sec(&inode_item.otime, 0); + btrfs_set_stack_timespec_nsec(&inode_item.otime, 0); + + ret = btrfs_insert_inode(trans, root, rec->ino, &inode_item); + BUG_ON(ret); + btrfs_commit_transaction(trans, root); + return 0; +} + static int repair_inode_backrefs(struct btrfs_root *root, struct inode_record *rec, struct cache_tree *inode_cache, @@ -1738,6 +1793,15 @@ int repaired = 0; list_for_each_entry_safe(backref, tmp, &rec->backrefs, list) { + if (!delete && rec->ino == root_dirid) { + if (!rec->found_inode_item) { + ret = create_inode_item(root, rec, backref, 1); + if (ret) + break; + repaired++; + } + } + /* Index 0 for root dir's are special, don't mess with it */ if (rec->ino == root_dirid && backref->index == 0) continue; @@ -1772,6 +1836,45 @@ } } + if (!delete && (!backref->found_dir_index && + !backref->found_dir_item && + backref->found_inode_ref)) { + struct btrfs_trans_handle *trans; + struct btrfs_key location; + + location.objectid = rec->ino; + location.type = BTRFS_INODE_ITEM_KEY; + location.offset = 0; + + trans = btrfs_start_transaction(root, 1); + if (IS_ERR(trans)) { + ret = PTR_ERR(trans); + break; + } + fprintf(stderr, "adding missing dir index/item pair " + "for inode %llu\n", + (unsigned long long)rec->ino); + ret = btrfs_insert_dir_item(trans, root, backref->name, + backref->namelen, + backref->dir, &location, + imode_to_type(rec->imode), + backref->index); + BUG_ON(ret); + btrfs_commit_transaction(trans, root); + repaired++; + } + + if (!delete && (backref->found_inode_ref && + backref->found_dir_index && + backref->found_dir_item && + !(backref->errors & REF_ERR_INDEX_UNMATCH) && + !rec->found_inode_item)) { + ret = create_inode_item(root, rec, backref, 0); + if (ret) + break; + repaired++; + } + } return ret ? ret : repaired; } @@ -1884,6 +1987,26 @@ error++; } } else { + if (repair) { + struct btrfs_trans_handle *trans; + + trans = btrfs_start_transaction(root, 1); + if (IS_ERR(trans)) { + err = PTR_ERR(trans); + return err; + } + + fprintf(stderr, + "root %llu missing its root dir, recreating\n", + (unsigned long long)root->objectid); + + ret = btrfs_make_root_dir(trans, root, root_dirid); + BUG_ON(ret); + + btrfs_commit_transaction(trans, root); + return -EAGAIN; + } + fprintf(stderr, "root %llu root dir %llu not found\n", (unsigned long long)root->root_key.objectid, (unsigned long long)root_dirid); @@ -7544,7 +7667,7 @@ { "init-extent-tree", 0, NULL, 0 }, { "check-data-csum", 0, NULL, 0 }, { "backup", 0, NULL, 0 }, - { "subvol-extents", no_argument, NULL, 'E' }, + { "subvol-extents", 1, NULL, 'E' }, { "qgroup-report", 0, NULL, 'Q' }, { NULL, 0, NULL, 0} }; @@ -7560,7 +7683,7 @@ "--init-extent-tree create a new extent tree", "--check-data-csum verify checkums of data blocks", "--qgroup-report print a report on qgroup consistency", - "--subvol-extents print subvolume extents and sharing state", + "--subvol-extents <subvolid> print subvolume extents and sharing state", NULL }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/cmds-device.c new/btrfs-progs-v3.17.2/cmds-device.c --- old/btrfs-progs-v3.17/cmds-device.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/cmds-device.c 2014-11-19 17:44:56.000000000 +0100 @@ -205,7 +205,7 @@ static int cmd_scan_dev(int argc, char **argv) { - int i, fd, e; + int i; int devstart = 1; int all = 0; int ret = 0; @@ -235,28 +235,23 @@ if (all || argc == 1) { printf("Scanning for Btrfs filesystems\n"); - ret = btrfs_scan_lblkid(BTRFS_UPDATE_KERNEL); + ret = btrfs_scan_lblkid(); if (ret) fprintf(stderr, "ERROR: error %d while scanning\n", ret); - goto out; - } - - fd = open("/dev/btrfs-control", O_RDWR); - if (fd < 0) { - perror("failed to open /dev/btrfs-control"); - ret = 1; + ret = btrfs_register_all_devices(); + if (ret) + fprintf(stderr, "ERROR: error %d while registering\n", ret); goto out; } for( i = devstart ; i < argc ; i++ ){ - struct btrfs_ioctl_vol_args args; char *path; if (!is_block_device(argv[i])) { fprintf(stderr, "ERROR: %s is not a block device\n", argv[i]); ret = 1; - goto close_out; + goto out; } path = canonicalize_path(argv[i]); if (!path) { @@ -264,30 +259,17 @@ "ERROR: Could not canonicalize path '%s': %s\n", argv[i], strerror(errno)); ret = 1; - goto close_out; + goto out; } printf("Scanning for Btrfs filesystems in '%s'\n", path); - - strncpy_null(args.name, path); - /* - * FIXME: which are the error code returned by this ioctl ? - * it seems that is impossible to understand if there no is - * a btrfs filesystem from an I/O error !!! - */ - ret = ioctl(fd, BTRFS_IOC_SCAN_DEV, &args); - e = errno; - - if( ret < 0 ){ - fprintf(stderr, "ERROR: unable to scan the device '%s' - %s\n", - path, strerror(e)); + if (btrfs_register_one_device(path) != 0) { + ret = 1; free(path); - goto close_out; + goto out; } free(path); } -close_out: - close(fd); out: return !!ret; } @@ -426,31 +408,37 @@ path, strerror(errno)); err = 1; } else { + char *canonical_path; + + canonical_path = canonicalize_path((char *)path); + if (args.nr_items >= BTRFS_DEV_STAT_WRITE_ERRS + 1) printf("[%s].write_io_errs %llu\n", - path, + canonical_path, (unsigned long long) args.values[ BTRFS_DEV_STAT_WRITE_ERRS]); if (args.nr_items >= BTRFS_DEV_STAT_READ_ERRS + 1) printf("[%s].read_io_errs %llu\n", - path, + canonical_path, (unsigned long long) args.values[ BTRFS_DEV_STAT_READ_ERRS]); if (args.nr_items >= BTRFS_DEV_STAT_FLUSH_ERRS + 1) printf("[%s].flush_io_errs %llu\n", - path, + canonical_path, (unsigned long long) args.values[ BTRFS_DEV_STAT_FLUSH_ERRS]); if (args.nr_items >= BTRFS_DEV_STAT_CORRUPTION_ERRS + 1) printf("[%s].corruption_errs %llu\n", - path, + canonical_path, (unsigned long long) args.values[ BTRFS_DEV_STAT_CORRUPTION_ERRS]); if (args.nr_items >= BTRFS_DEV_STAT_GENERATION_ERRS + 1) printf("[%s].generation_errs %llu\n", - path, + canonical_path, (unsigned long long) args.values[ BTRFS_DEV_STAT_GENERATION_ERRS]); + + free(canonical_path); } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/cmds-filesystem.c new/btrfs-progs-v3.17.2/cmds-filesystem.c --- old/btrfs-progs-v3.17/cmds-filesystem.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/cmds-filesystem.c 2014-11-19 17:44:56.000000000 +0100 @@ -53,6 +53,15 @@ static struct seen_fsid *seen_fsid_hash[SEEN_FSID_HASH_SIZE] = {NULL,}; +static int is_seen_fsid(u8 *fsid) +{ + u8 hash = fsid[0]; + int slot = hash % SEEN_FSID_HASH_SIZE; + struct seen_fsid *seen = seen_fsid_hash[slot]; + + return seen ? 1 : 0; +} + static int add_seen_fsid(u8 *fsid) { u8 hash = fsid[0]; @@ -119,11 +128,11 @@ "-h human friendly numbers, base 1024 (default)", "-H human friendly numbers, base 1000", "--iec use 1024 as a base (KiB, MiB, GiB, TiB)", - "--si use 1000 as a base (kB, mB, gB, tB)", + "--si use 1000 as a base (kB, MB, GB, TB)", "-k|--kbytes show sizes in KiB, or kB with --si", - "-m|--mbytes show sizes in MiB, or mB with --si", - "-g|--gbytes show sizes in GiB, or gB with --si", - "-t|--tbytes show sizes in TiB, or tB with --si", + "-m|--mbytes show sizes in MiB, or MB with --si", + "-g|--gbytes show sizes in GiB, or GB with --si", + "-t|--tbytes show sizes in TiB, or TB with --si", NULL }; @@ -241,7 +250,6 @@ DIR *dirstream = NULL; unsigned unit_mode = UNITS_DEFAULT; - optind = 1; while (1) { int long_index; static const struct option long_options[] = { @@ -290,7 +298,7 @@ } } - if (check_argc_max(argc, optind + 1)) + if (check_argc_exact(argc, optind + 1)) usage(cmd_df_usage); path = argv[optind]; @@ -502,7 +510,10 @@ pretty_size(calc_used_bytes(space_info))); for (i = 0; i < fs_info->num_devices; i++) { + char *canonical_path; + tmp_dev_info = (struct btrfs_ioctl_dev_info_args *)&dev_info[i]; + canonical_path = canonicalize_path((char *)tmp_dev_info->path); /* Add check for missing devices even mounted */ fd = open((char *)tmp_dev_info->path, O_RDONLY); @@ -515,7 +526,9 @@ tmp_dev_info->devid, pretty_size(tmp_dev_info->total_bytes), pretty_size(tmp_dev_info->bytes_used), - tmp_dev_info->path); + canonical_path); + + free(canonical_path); } if (missing) @@ -767,6 +780,10 @@ *found = 1; } + /* skip all fs already shown as mounted fs */ + if (is_seen_fsid(cur_fs->fsid)) + continue; + fs_copy = malloc(sizeof(*fs_copy)); if (!fs_copy) { ret = -ENOMEM; @@ -936,7 +953,7 @@ goto out; devs_only: - ret = btrfs_scan_lblkid(!BTRFS_UPDATE_KERNEL); + ret = btrfs_scan_lblkid(); if (ret) { fprintf(stderr, "ERROR: %d while scanning\n", ret); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/cmds-replace.c new/btrfs-progs-v3.17.2/cmds-replace.c --- old/btrfs-progs-v3.17/cmds-replace.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/cmds-replace.c 2014-11-19 17:44:56.000000000 +0100 @@ -184,12 +184,17 @@ /* check for possible errors before backgrounding */ status_args.cmd = BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS; + status_args.result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT; ret = ioctl(fdmnt, BTRFS_IOC_DEV_REPLACE, &status_args); if (ret) { fprintf(stderr, - "ERROR: ioctl(DEV_REPLACE_STATUS) failed on \"%s\": %s, %s\n", - path, strerror(errno), - replace_dev_result2string(status_args.result)); + "ERROR: ioctl(DEV_REPLACE_STATUS) failed on \"%s\": %s", + path, strerror(errno)); + if (status_args.result != BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT) + fprintf(stderr, ", %s\n", + replace_dev_result2string(status_args.result)); + else + fprintf(stderr, "\n"); goto leave_with_error; } @@ -302,13 +307,18 @@ } start_args.cmd = BTRFS_IOCTL_DEV_REPLACE_CMD_START; + start_args.result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT; ret = ioctl(fdmnt, BTRFS_IOC_DEV_REPLACE, &start_args); if (do_not_background) { if (ret) { fprintf(stderr, - "ERROR: ioctl(DEV_REPLACE_START) failed on \"%s\": %s, %s\n", - path, strerror(errno), - replace_dev_result2string(start_args.result)); + "ERROR: ioctl(DEV_REPLACE_START) failed on \"%s\": %s", + path, strerror(errno)); + if (start_args.result != BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT) + fprintf(stderr, ", %s\n", + replace_dev_result2string(start_args.result)); + else + fprintf(stderr, "\n"); if (errno == EOPNOTSUPP) fprintf(stderr, @@ -403,11 +413,16 @@ for (;;) { args.cmd = BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS; + args.result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT; ret = ioctl(fd, BTRFS_IOC_DEV_REPLACE, &args); if (ret) { - fprintf(stderr, "ERROR: ioctl(DEV_REPLACE_STATUS) failed on \"%s\": %s, %s\n", - path, strerror(errno), - replace_dev_result2string(args.result)); + fprintf(stderr, "ERROR: ioctl(DEV_REPLACE_STATUS) failed on \"%s\": %s", + path, strerror(errno)); + if (args.result != BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT) + fprintf(stderr, ", %s\n", + replace_dev_result2string(args.result)); + else + fprintf(stderr, "\n"); return ret; } @@ -551,13 +566,18 @@ } args.cmd = BTRFS_IOCTL_DEV_REPLACE_CMD_CANCEL; + args.result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT; ret = ioctl(fd, BTRFS_IOC_DEV_REPLACE, &args); e = errno; close_file_or_dir(fd, dirstream); if (ret) { - fprintf(stderr, "ERROR: ioctl(DEV_REPLACE_CANCEL) failed on \"%s\": %s, %s\n", - path, strerror(e), - replace_dev_result2string(args.result)); + fprintf(stderr, "ERROR: ioctl(DEV_REPLACE_CANCEL) failed on \"%s\": %s", + path, strerror(e)); + if (args.result != BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT) + fprintf(stderr, ", %s\n", + replace_dev_result2string(args.result)); + else + fprintf(stderr, "\n"); return 1; } if (args.result == BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/cmds-restore.c new/btrfs-progs-v3.17.2/cmds-restore.c --- old/btrfs-progs-v3.17/cmds-restore.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/cmds-restore.c 2014-11-19 17:44:56.000000000 +0100 @@ -176,7 +176,7 @@ break; } - if (level == BTRFS_MAX_LEVEL) + if (level >= BTRFS_MAX_LEVEL) return 1; slot = path->slots[level] + 1; @@ -840,6 +840,8 @@ ret = copy_file(root, fd, &location, path_name); close(fd); if (ret) { + fprintf(stderr, "Error copying data for %s\n", + path_name); if (ignore_errors) goto next; btrfs_free_path(path); @@ -917,6 +919,8 @@ output_rootdir, dir, mreg); free(dir); if (ret) { + fprintf(stderr, "Error searching %s\n", + path_name); if (ignore_errors) goto next; btrfs_free_path(path); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/cmds-send.c new/btrfs-progs-v3.17.2/cmds-send.c --- old/btrfs-progs-v3.17/cmds-send.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/cmds-send.c 2014-11-19 17:44:56.000000000 +0100 @@ -427,7 +427,7 @@ u32 i; char *mount_root = NULL; char *snapshot_parent = NULL; - u64 root_id; + u64 root_id = 0; u64 parent_root_id = 0; int full_send = 1; int new_end_cmd_semantic = 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/disk-io.c new/btrfs-progs-v3.17.2/disk-io.c --- old/btrfs-progs-v3.17/disk-io.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/disk-io.c 2014-11-19 17:44:56.000000000 +0100 @@ -834,6 +834,35 @@ return best_index; } +static int setup_root_or_create_block(struct btrfs_fs_info *fs_info, + enum btrfs_open_ctree_flags flags, + struct btrfs_root *info_root, + u64 objectid, char *str) +{ + struct btrfs_super_block *sb = fs_info->super_copy; + struct btrfs_root *root = fs_info->tree_root; + u32 leafsize = btrfs_super_leafsize(sb); + int ret; + + ret = find_and_setup_root(root, fs_info, objectid, info_root); + if (ret) { + printk("Couldn't setup %s tree\n", str); + if (!(flags & OPEN_CTREE_PARTIAL)) + return -EIO; + /* + * Need a blank node here just so we don't screw up in the + * million of places that assume a root has a valid ->node + */ + info_root->node = + btrfs_find_create_tree_block(info_root, 0, leafsize); + if (!info_root->node) + return -ENOMEM; + clear_extent_buffer_uptodate(NULL, info_root->node); + } + + return 0; +} + int btrfs_setup_all_roots(struct btrfs_fs_info *fs_info, u64 root_tree_bytenr, enum btrfs_open_ctree_flags flags) { @@ -880,22 +909,10 @@ return -EIO; } - ret = find_and_setup_root(root, fs_info, BTRFS_EXTENT_TREE_OBJECTID, - fs_info->extent_root); - if (ret) { - printk("Couldn't setup extent tree\n"); - if (!(flags & OPEN_CTREE_PARTIAL)) - return -EIO; - /* Need a blank node here just so we don't screw up in the - * million of places that assume a root has a valid ->node - */ - fs_info->extent_root->node = - btrfs_find_create_tree_block(fs_info->extent_root, 0, - leafsize); - if (!fs_info->extent_root->node) - return -ENOMEM; - clear_extent_buffer_uptodate(NULL, fs_info->extent_root->node); - } + ret = setup_root_or_create_block(fs_info, flags, fs_info->extent_root, + BTRFS_EXTENT_TREE_OBJECTID, "extent"); + if (ret) + return ret; fs_info->extent_root->track_dirty = 1; ret = find_and_setup_root(root, fs_info, BTRFS_DEV_TREE_OBJECTID, @@ -906,20 +923,10 @@ } fs_info->dev_root->track_dirty = 1; - ret = find_and_setup_root(root, fs_info, BTRFS_CSUM_TREE_OBJECTID, - fs_info->csum_root); - if (ret) { - printk("Couldn't setup csum tree\n"); - if (!(flags & OPEN_CTREE_PARTIAL)) - return -EIO; - /* do the same thing as extent tree rebuilding */ - fs_info->csum_root->node = - btrfs_find_create_tree_block(fs_info->extent_root, 0, - leafsize); - if (!fs_info->csum_root->node) - return -ENOMEM; - clear_extent_buffer_uptodate(NULL, fs_info->csum_root->node); - } + ret = setup_root_or_create_block(fs_info, flags, fs_info->csum_root, + BTRFS_CSUM_TREE_OBJECTID, "csum"); + if (ret) + return ret; fs_info->csum_root->track_dirty = 1; ret = find_and_setup_root(root, fs_info, BTRFS_QUOTA_TREE_OBJECTID, @@ -930,7 +937,8 @@ ret = find_and_setup_log_root(root, fs_info, sb); if (ret) { printk("Couldn't setup log root tree\n"); - return -EIO; + if (!(flags & OPEN_CTREE_PARTIAL)) + return -EIO; } fs_info->generation = generation; @@ -1000,10 +1008,20 @@ u64 sb_bytenr, int super_recover) { u64 total_devs; + u64 dev_size; int ret; if (!sb_bytenr) sb_bytenr = BTRFS_SUPER_INFO_OFFSET; + dev_size = lseek(fd, 0, SEEK_END); + if (dev_size < 0) + return (int)(dev_size); + lseek(fd, 0, SEEK_SET); + if (sb_bytenr > dev_size) { + fprintf(stderr, "Superblock bytenr is larger than device size\n"); + return -EINVAL; + } + ret = btrfs_scan_one_device(fd, path, fs_devices, &total_devs, sb_bytenr, super_recover); if (ret) { @@ -1012,7 +1030,7 @@ } if (total_devs != 1) { - ret = btrfs_scan_lblkid(!BTRFS_UPDATE_KERNEL); + ret = btrfs_scan_lblkid(); if (ret) return ret; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/extent_io.c new/btrfs-progs-v3.17.2/extent_io.c --- old/btrfs-progs-v3.17/extent_io.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/extent_io.c 2014-11-19 17:44:56.000000000 +0100 @@ -666,8 +666,10 @@ { int ret; ret = pread(eb->fd, eb->data + offset, len, eb->dev_bytenr); - if (ret < 0) + if (ret < 0) { + ret = -errno; goto out; + } if (ret != len) { ret = -EIO; goto out; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/ioctl.h new/btrfs-progs-v3.17.2/ioctl.h --- old/btrfs-progs-v3.17/ioctl.h 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/ioctl.h 2014-11-19 17:44:56.000000000 +0100 @@ -141,6 +141,7 @@ #define BTRFS_IOCTL_DEV_REPLACE_CMD_START 0 #define BTRFS_IOCTL_DEV_REPLACE_CMD_STATUS 1 #define BTRFS_IOCTL_DEV_REPLACE_CMD_CANCEL 2 +#define BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_RESULT -1 #define BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR 0 #define BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED 1 #define BTRFS_IOCTL_DEV_REPLACE_RESULT_ALREADY_STARTED 2 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/library-test.c new/btrfs-progs-v3.17.2/library-test.c --- old/btrfs-progs-v3.17/library-test.c 1970-01-01 01:00:00.000000000 +0100 +++ new/btrfs-progs-v3.17.2/library-test.c 2014-11-19 17:44:56.000000000 +0100 @@ -0,0 +1,69 @@ +/* + * Copyright (C) 2014 SUSE. All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License v2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 021110-1307, USA. + */ + +#include "kerncompat.h" +#include "version.h" +#include "send-stream.h" + +/* + * Reduced code snippet from snapper.git/snapper/Btrfs.cc + */ +struct btrfs_send_ops send_ops = { + .subvol = NULL, + .snapshot = NULL, + .mkfile = NULL, + .mkdir = NULL, + .mknod = NULL, + .mkfifo = NULL, + .mksock = NULL, + .symlink = NULL, + .rename = NULL, + .link = NULL, + .unlink = NULL, + .rmdir = NULL, + .write = NULL, + .clone = NULL, + .set_xattr = NULL, + .remove_xattr = NULL, + .truncate = NULL, + .chmod = NULL, + .chown = NULL, + .utimes = NULL, + .update_extent = NULL, +}; + +/* + * Link test only, not intended to be executed. + */ +static int test_send_stream_api() { + int ret; + int fd = -1; + +#if BTRFS_LIB_VERSION < 101 + ret = btrfs_read_and_process_send_stream(fd, &send_ops, NULL, 0); +#else + ret = btrfs_read_and_process_send_stream(fd, &send_ops, NULL, 0, 1); +#endif + return ret; +} + +int main() { + test_send_stream_api(); + + return 0; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/props.c new/btrfs-progs-v3.17.2/props.c --- old/btrfs-progs-v3.17/props.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/props.c 2014-11-19 17:44:56.000000000 +0100 @@ -17,7 +17,7 @@ #include <sys/stat.h> #include <sys/ioctl.h> #include <sys/types.h> -#include <attr/xattr.h> +#include <sys/xattr.h> #include <fcntl.h> #include <unistd.h> @@ -29,6 +29,12 @@ #define XATTR_BTRFS_PREFIX "btrfs." #define XATTR_BTRFS_PREFIX_LEN (sizeof(XATTR_BTRFS_PREFIX) - 1) +/* + * Defined as synonyms in attr/xattr.h + */ +#ifndef ENOATTR +#define ENOATTR ENODATA +#endif static int prop_read_only(enum prop_object_type type, const char *object, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/rbtree-utils.h new/btrfs-progs-v3.17.2/rbtree-utils.h --- old/btrfs-progs-v3.17/rbtree-utils.h 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/rbtree-utils.h 2014-11-19 17:44:56.000000000 +0100 @@ -21,6 +21,10 @@ #include "rbtree.h" +#ifdef __cplusplus +extern "C" { +#endif + /* The common insert/search/free functions */ typedef int (*rb_compare_nodes)(struct rb_node *node1, struct rb_node *node2); typedef int (*rb_compare_keys)(struct rb_node *node, void *key); @@ -42,4 +46,8 @@ rb_free_nodes(root, free_func); \ } +#ifdef __cplusplus +} +#endif + #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/rbtree.h new/btrfs-progs-v3.17.2/rbtree.h --- old/btrfs-progs-v3.17/rbtree.h 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/rbtree.h 2014-11-19 17:44:56.000000000 +0100 @@ -34,6 +34,10 @@ #include <btrfs/kerncompat.h> #endif /* BTRFS_FLAT_INCLUDES */ +#ifdef __cplusplus +extern "C" { +#endif + struct rb_node { unsigned long __rb_parent_color; struct rb_node *rb_right; @@ -75,7 +79,7 @@ extern struct rb_node *rb_next_postorder(const struct rb_node *); /* Fast replacement of a single node without remove/rebalance/add/rebalance */ -extern void rb_replace_node(struct rb_node *victim, struct rb_node *new, +extern void rb_replace_node(struct rb_node *victim, struct rb_node *new_node, struct rb_root *root); static inline void rb_link_node(struct rb_node * node, struct rb_node * parent, @@ -107,4 +111,8 @@ typeof(*pos), field); 1; }); \ pos = n) +#ifdef __cplusplus +} +#endif + #endif /* _LINUX_RBTREE_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/rbtree_augmented.h new/btrfs-progs-v3.17.2/rbtree_augmented.h --- old/btrfs-progs-v3.17/rbtree_augmented.h 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/rbtree_augmented.h 2014-11-19 17:44:56.000000000 +0100 @@ -26,6 +26,10 @@ #include "rbtree.h" +#ifdef __cplusplus +extern "C" { +#endif + /* * Please note - only struct rb_augment_callbacks and the prototypes for * rb_insert_augmented() and rb_erase_augmented() are intended to be public. @@ -228,4 +232,8 @@ __rb_erase_color(rebalance, root, augment->rotate); } +#ifdef __cplusplus +} +#endif + #endif /* _LINUX_RBTREE_AUGMENTED_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/send-stream.c new/btrfs-progs-v3.17.2/send-stream.c --- old/btrfs-progs-v3.17/send-stream.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/send-stream.c 2014-11-19 17:44:56.000000000 +0100 @@ -216,7 +216,7 @@ { int ret; void *data; - int len; + int len = 0; TLV_GET(s, attr, &data, &len); Files old/btrfs-progs-v3.17/tests/fsck-tests/010-no-dir-item-or-index.img and new/btrfs-progs-v3.17.2/tests/fsck-tests/010-no-dir-item-or-index.img differ Files old/btrfs-progs-v3.17/tests/fsck-tests/011-no-rootdir-inode-item.img and new/btrfs-progs-v3.17.2/tests/fsck-tests/011-no-rootdir-inode-item.img differ Files old/btrfs-progs-v3.17/tests/fsck-tests/012-no-inode-item.img and new/btrfs-progs-v3.17.2/tests/fsck-tests/012-no-inode-item.img differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/utils.c new/btrfs-progs-v3.17.2/utils.c --- old/btrfs-progs-v3.17/utils.c 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/utils.c 2014-11-19 17:44:56.000000000 +0100 @@ -52,6 +52,8 @@ #define BLKDISCARD _IO(0x12,119) #endif +static int btrfs_scan_done = 0; + static char argv0_buf[ARGV0_BUF_SIZE] = "btrfs"; void fixup_argv0(char **argv, const char *token) @@ -64,7 +66,8 @@ void set_argv0(char **argv) { - sprintf(argv0_buf, "%s", argv[0]); + strncpy(argv0_buf, argv[0], sizeof(argv0_buf)); + argv0_buf[sizeof(argv0_buf) - 1] = 0; } int check_argc_exact(int nargs, int expected) @@ -1186,7 +1189,7 @@ /* scan other devices */ if (is_btrfs && total_devs > 1) { - ret = btrfs_scan_lblkid(!BTRFS_UPDATE_KERNEL); + ret = btrfs_scan_lblkid(); if (ret) return ret; } @@ -1239,7 +1242,7 @@ char name[PATH_MAX]; }; -void btrfs_register_one_device(char *fname) +int btrfs_register_one_device(const char *fname) { struct btrfs_ioctl_vol_args args; int fd; @@ -1251,17 +1254,46 @@ fprintf(stderr, "failed to open /dev/btrfs-control " "skipping device registration: %s\n", strerror(errno)); - return; + return -errno; } strncpy(args.name, fname, BTRFS_PATH_NAME_MAX); args.name[BTRFS_PATH_NAME_MAX-1] = 0; ret = ioctl(fd, BTRFS_IOC_SCAN_DEV, &args); e = errno; - if(ret<0){ + if (ret < 0) { fprintf(stderr, "ERROR: device scan failed '%s' - %s\n", fname, strerror(e)); + ret = -e; } close(fd); + return ret; +} + +/* + * Register all devices in the fs_uuid list created in the user + * space. Ensure btrfs_scan_lblkid() is called before this func. + */ +int btrfs_register_all_devices(void) +{ + int err; + struct btrfs_fs_devices *fs_devices; + struct btrfs_device *device; + struct list_head *all_uuids; + + all_uuids = btrfs_scanned_uuids(); + + list_for_each_entry(fs_devices, all_uuids, list) { + list_for_each_entry(device, &fs_devices->devices, dev_list) { + if (strlen(device->name) != 0) { + err = btrfs_register_one_device(device->name); + if (err < 0) + return err; + if (err > 0) + return -err; + } + } + } + return 0; } int btrfs_device_already_in_root(struct btrfs_root *root, int fd, @@ -1297,7 +1329,7 @@ static const char* unit_suffix_binary[] = { "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB"}; static const char* unit_suffix_decimal[] = - { "B", "kB", "mB", "gB", "tB", "pB", "eB"}; + { "B", "kB", "MB", "GB", "TB", "PB", "EB"}; int pretty_size_snprintf(u64 size, char *str, size_t str_size, unsigned unit_mode) { @@ -1865,29 +1897,12 @@ if (!fi_args->num_devices) goto out; - /* - * with kernel patch - * btrfs: ioctl BTRFS_IOC_FS_INFO and BTRFS_IOC_DEV_INFO miss-matched with slots - * the kernel now returns total_devices which does not include - * replacing device if running. - * As we need to get dev info of the replace device if it is running, - * so just add one to fi_args->num_devices. - */ - - di_args = *di_ret = malloc((fi_args->num_devices + 1) * sizeof(*di_args)); + di_args = *di_ret = malloc((fi_args->num_devices) * sizeof(*di_args)); if (!di_args) { ret = -errno; goto out; } - /* get the replace target device if it is there */ - ret = get_device_info(fd, i, &di_args[ndevs]); - if (!ret) { - ndevs++; - fi_args->num_devices++; - } - i++; - for (; i <= fi_args->max_id; ++i) { BUG_ON(ndevs >= fi_args->num_devices); ret = get_device_info(fd, i, &di_args[ndevs]); @@ -2167,7 +2182,7 @@ return 0; } -int btrfs_scan_lblkid(int update_kernel) +int btrfs_scan_lblkid() { int fd = -1; int ret; @@ -2178,6 +2193,9 @@ blkid_cache cache = NULL; char path[PATH_MAX]; + if (btrfs_scan_done) + return 0; + if (blkid_get_cache(&cache, 0) < 0) { printf("ERROR: lblkid cache get failed\n"); return 1; @@ -2206,11 +2224,12 @@ } close(fd); - if (update_kernel) - btrfs_register_one_device(path); } blkid_dev_iterate_end(iter); blkid_put_cache(cache); + + btrfs_scan_done = 1; + return 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/utils.h new/btrfs-progs-v3.17.2/utils.h --- old/btrfs-progs-v3.17/utils.h 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/utils.h 2014-11-19 17:44:56.000000000 +0100 @@ -38,7 +38,7 @@ #define BTRFS_UUID_UNPARSED_SIZE 37 -#define ARGV0_BUF_SIZE 64 +#define ARGV0_BUF_SIZE PATH_MAX int check_argc_exact(int nargs, int expected); int check_argc_min(int nargs, int expected); @@ -81,7 +81,8 @@ u64 block_count, u32 io_width, u32 io_align, u32 sectorsize); int btrfs_scan_for_fsid(int run_ioctls); -void btrfs_register_one_device(char *fname); +int btrfs_register_one_device(const char *fname); +int btrfs_register_all_devices(void); char *canonicalize_dm_name(const char *ptname); char *canonicalize_path(const char *path); int check_mounted(const char *devicename); @@ -127,7 +128,7 @@ int verify); int ask_user(char *question); int lookup_ino_rootid(int fd, u64 *rootid); -int btrfs_scan_lblkid(int update_kernel); +int btrfs_scan_lblkid(void); int get_btrfs_mount(const char *dev, char *mp, size_t mp_size); int find_mount_root(const char *path, char **mount_root); int get_device_info(int fd, u64 devid, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/btrfs-progs-v3.17/version.sh new/btrfs-progs-v3.17.2/version.sh --- old/btrfs-progs-v3.17/version.sh 2014-10-17 18:43:33.000000000 +0200 +++ new/btrfs-progs-v3.17.2/version.sh 2014-11-19 17:44:56.000000000 +0100 @@ -6,7 +6,7 @@ # Copyright 2008, Oracle # Released under the GNU GPLv2 -v="v3.17" +v="v3.17.2" lib_major=0 lib_minor=1 ++++++ fix-doc-build-on-SLE11SP3.diff ++++++ Build on SLE11SP3 complains: ERROR: btrfs-mount.xml.tmp1: line 9: second section must be named SYNOPSIS Index: btrfs-progs-v3.17.1/Documentation/btrfs-mount.txt =================================================================== --- btrfs-progs-v3.17.1.orig/Documentation/btrfs-mount.txt +++ btrfs-progs-v3.17.1/Documentation/btrfs-mount.txt @@ -5,6 +5,10 @@ NAME ---- btrfs-mount - mount options and supported file attributes for the btrfs filesystem +SYNOPSIS +-------- +*man btrfs* + DESCRIPTION ----------- This document describes mount options specific to the btrfs filesystem. ++++++ local-version-override.patch ++++++ --- /var/tmp/diff_new_pack.NWl2TV/_old 2014-11-29 08:39:49.000000000 +0100 +++ /var/tmp/diff_new_pack.NWl2TV/_new 2014-11-29 08:39:49.000000000 +0100 @@ -6,8 +6,8 @@ # Copyright 2008, Oracle # Released under the GNU GPLv2 --v="v3.17" -+v="v3.17+20141103" +-v="v3.17.2" ++v="v3.17.2+20141119" lib_major=0 lib_minor=1 -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org