backport patches from epoch2
This commit is contained in:
parent
51f75e789f
commit
82b0d56640
107
0001-btrfs-progs-convert-prevent-32bit-overflow-for-cctx-.patch
Normal file
107
0001-btrfs-progs-convert-prevent-32bit-overflow-for-cctx-.patch
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
From c9c4eb1f3fd343512d50b075b40bba656cbd02cb Mon Sep 17 00:00:00 2001
|
||||||
|
From: Qu Wenruo <wqu@suse.com>
|
||||||
|
Date: Mon, 20 Jul 2020 20:51:08 +0800
|
||||||
|
Subject: [PATCH 10/74] btrfs-progs: convert: prevent 32bit overflow for
|
||||||
|
cctx->total_bytes
|
||||||
|
|
||||||
|
[BUG]
|
||||||
|
When convert is called on a 64GiB ext4 fs, it fails like this:
|
||||||
|
|
||||||
|
$ btrfs-convert /dev/loop0p1
|
||||||
|
create btrfs filesystem:
|
||||||
|
blocksize: 4096
|
||||||
|
nodesize: 16384
|
||||||
|
features: extref, skinny-metadata (default)
|
||||||
|
checksum: crc32c
|
||||||
|
creating ext2 image file
|
||||||
|
ERROR: missing data block for bytenr 1048576
|
||||||
|
ERROR: failed to create ext2_saved/image: -2
|
||||||
|
WARNING: an error occurred during conversion, filesystem is partially created but not finalized and not mountable
|
||||||
|
|
||||||
|
Btrfs-convert also corrupts the source fs:
|
||||||
|
|
||||||
|
$ LANG=C e2fsck /dev/loop0p1 -f
|
||||||
|
e2fsck 1.45.6 (20-Mar-2020)
|
||||||
|
Resize inode not valid. Recreate<y>? yes
|
||||||
|
Pass 1: Checking inodes, blocks, and sizes
|
||||||
|
Deleted inode 3681 has zero dtime. Fix<y>? yes
|
||||||
|
Inodes that were part of a corrupted orphan linked list found. Fix<y>? yes
|
||||||
|
Inode 3744 was part of the orphaned inode list. FIXED.
|
||||||
|
Deleted inode 3745 has zero dtime. Fix<y>? yes
|
||||||
|
Inode 3747 has INLINE_DATA_FL flag on filesystem without inline data support.
|
||||||
|
Clear<y>? yes
|
||||||
|
...
|
||||||
|
|
||||||
|
[CAUSE]
|
||||||
|
After some debugging, the first strange behavior is, the value of
|
||||||
|
cctx->total_bytes is 0 in ext2_open_fs().
|
||||||
|
|
||||||
|
It turns out that, the value assign for cctx->total_bytes could lead to
|
||||||
|
bit overflow for the unsigned int value.
|
||||||
|
|
||||||
|
And that 0 cctx->total_bytes leads to various problems for later free
|
||||||
|
space calculation.
|
||||||
|
For example, in calculate_available_space(), we use cctx->total_bytes to
|
||||||
|
ensure we won't create a data chunk beyond device end:
|
||||||
|
|
||||||
|
cue_len = min(cctx->total_bytes - cur_off, cur_len);
|
||||||
|
|
||||||
|
If that cur_offset is also 0, we will create a cache_extent with 0 size,
|
||||||
|
which could cause a lot of problems for cache tree search.
|
||||||
|
|
||||||
|
[FIX]
|
||||||
|
Do manual casting for the multiply operation, so we could got a real u64
|
||||||
|
result. The fix will be applied to all supported fses (ext* and
|
||||||
|
reiserfs).
|
||||||
|
|
||||||
|
Reported-by: Christian Zangl <coralllama@gmail.com>
|
||||||
|
Reviewed-by: Nikolay Borisov <nborisov@suse.com>
|
||||||
|
Signed-off-by: Qu Wenruo <wqu@suse.com>
|
||||||
|
Signed-off-by: David Sterba <dsterba@suse.com>
|
||||||
|
---
|
||||||
|
convert/main.c | 1 +
|
||||||
|
convert/source-ext2.c | 2 +-
|
||||||
|
convert/source-reiserfs.c | 2 +-
|
||||||
|
3 files changed, 3 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/convert/main.c b/convert/main.c
|
||||||
|
index 7709e9a..df6a2ae 100644
|
||||||
|
--- a/convert/main.c
|
||||||
|
+++ b/convert/main.c
|
||||||
|
@@ -1136,6 +1136,7 @@ static int do_convert(const char *devname, u32 convert_flags, u32 nodesize,
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
+ ASSERT(cctx.total_bytes);
|
||||||
|
blocksize = cctx.blocksize;
|
||||||
|
total_bytes = (u64)blocksize * (u64)cctx.block_count;
|
||||||
|
if (blocksize < 4096) {
|
||||||
|
diff --git a/convert/source-ext2.c b/convert/source-ext2.c
|
||||||
|
index f11ef65..d73684e 100644
|
||||||
|
--- a/convert/source-ext2.c
|
||||||
|
+++ b/convert/source-ext2.c
|
||||||
|
@@ -87,7 +87,7 @@ static int ext2_open_fs(struct btrfs_convert_context *cctx, const char *name)
|
||||||
|
cctx->fs_data = ext2_fs;
|
||||||
|
cctx->blocksize = ext2_fs->blocksize;
|
||||||
|
cctx->block_count = ext2_fs->super->s_blocks_count;
|
||||||
|
- cctx->total_bytes = ext2_fs->blocksize * ext2_fs->super->s_blocks_count;
|
||||||
|
+ cctx->total_bytes = (u64)ext2_fs->super->s_blocks_count * ext2_fs->blocksize;
|
||||||
|
cctx->volume_name = strndup((char *)ext2_fs->super->s_volume_name, 16);
|
||||||
|
cctx->first_data_block = ext2_fs->super->s_first_data_block;
|
||||||
|
cctx->inodes_count = ext2_fs->super->s_inodes_count;
|
||||||
|
diff --git a/convert/source-reiserfs.c b/convert/source-reiserfs.c
|
||||||
|
index 9fd6b9a..3b4cb5a 100644
|
||||||
|
--- a/convert/source-reiserfs.c
|
||||||
|
+++ b/convert/source-reiserfs.c
|
||||||
|
@@ -82,7 +82,7 @@ static int reiserfs_open_fs(struct btrfs_convert_context *cxt, const char *name)
|
||||||
|
cxt->fs_data = fs;
|
||||||
|
cxt->blocksize = fs->fs_blocksize;
|
||||||
|
cxt->block_count = get_sb_block_count(fs->fs_ondisk_sb);
|
||||||
|
- cxt->total_bytes = cxt->blocksize * cxt->block_count;
|
||||||
|
+ cxt->total_bytes = (u64)cxt->block_count * cxt->blocksize;
|
||||||
|
cxt->volume_name = strndup(fs->fs_ondisk_sb->s_label, 16);
|
||||||
|
cxt->first_data_block = 0;
|
||||||
|
cxt->inodes_count = reiserfs_count_objectids(fs);
|
||||||
|
--
|
||||||
|
1.8.3.1
|
||||||
|
|
||||||
@ -1,10 +1,11 @@
|
|||||||
Name: btrfs-progs
|
Name: btrfs-progs
|
||||||
Version: 5.7
|
Version: 5.7
|
||||||
Release: 1
|
Release: 2
|
||||||
Summary: btrfs userspace programs
|
Summary: btrfs userspace programs
|
||||||
License: GPLv2
|
License: GPLv2 and GPL+ and LGPL-2.1+ and GPL-3.0+ and LGPL-2.1 and Artistic-1.0-Perl and MIT
|
||||||
URL: http://www.btrfs.wiki.kernel.org/index.php/Main_Page
|
URL: http://www.btrfs.wiki.kernel.org/index.php/Main_Page
|
||||||
Source0: https://www.kernel.org/pub/linux/kernel/people/kdave/%{name}/%{name}-v%{version}.tar.xz
|
Source0: https://www.kernel.org/pub/linux/kernel/people/kdave/%{name}/%{name}-v%{version}.tar.xz
|
||||||
|
Patch1: 0001-btrfs-progs-convert-prevent-32bit-overflow-for-cctx-.patch
|
||||||
|
|
||||||
BuildRequires: python3-devel >= 3.4
|
BuildRequires: python3-devel >= 3.4
|
||||||
BuildRequires: libacl-devel, e2fsprogs-devel, libblkid-devel, libuuid-devel, zlib-devel, libzstd-devel, lzo-devel
|
BuildRequires: libacl-devel, e2fsprogs-devel, libblkid-devel, libuuid-devel, zlib-devel, libzstd-devel, lzo-devel
|
||||||
@ -68,6 +69,9 @@ make mandir=%{_mandir} bindir=%{_sbindir} libdir=%{_libdir} incdir=%{_includedir
|
|||||||
%{_mandir}/man8/*.gz
|
%{_mandir}/man8/*.gz
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Nov 26 2020 lixiaokeng<lixiaokeng@huawei.com> - 5.7-2
|
||||||
|
- backport patches from epoch2
|
||||||
|
|
||||||
* Wed Jul 15 2020 Zhiqiang Liu <lzhq28@mail.ustc.edu.cn> - 5.7-1
|
* Wed Jul 15 2020 Zhiqiang Liu <lzhq28@mail.ustc.edu.cn> - 5.7-1
|
||||||
- update to v5.7 version
|
- update to v5.7 version
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user