From ea8c910fc6ac48d8037e1425e5560f40c657fe56 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 21 May 2018 10:48:48 +0200 Subject: [PATCH] drop broken btrfs patches, again. --- ...a-blocks-after-degraded-raid1-mounts.patch | 95 ------------------- queue-4.4/series | 1 - ...a-blocks-after-degraded-raid1-mounts.patch | 95 ------------------- queue-4.9/series | 1 - 4 files changed, 192 deletions(-) delete mode 100644 queue-4.4/btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch delete mode 100644 queue-4.9/btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch diff --git a/queue-4.4/btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch b/queue-4.4/btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch deleted file mode 100644 index bc377fecd08..00000000000 --- a/queue-4.4/btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 02a3307aa9c20b4f6626255b028f07f6cfa16feb Mon Sep 17 00:00:00 2001 -From: Liu Bo -Date: Wed, 16 May 2018 01:37:36 +0800 -Subject: btrfs: fix reading stale metadata blocks after degraded raid1 mounts - -From: Liu Bo - -commit 02a3307aa9c20b4f6626255b028f07f6cfa16feb upstream. - -If a btree block, aka. extent buffer, is not available in the extent -buffer cache, it'll be read out from the disk instead, i.e. - -btrfs_search_slot() - read_block_for_search() # hold parent and its lock, go to read child - btrfs_release_path() - read_tree_block() # read child - -Unfortunately, the parent lock got released before reading child, so -commit 5bdd3536cbbe ("Btrfs: Fix block generation verification race") had -used 0 as parent transid to read the child block. It forces -read_tree_block() not to check if parent transid is different with the -generation id of the child that it reads out from disk. - -A simple PoC is included in btrfs/124, - -0. A two-disk raid1 btrfs, - -1. Right after mkfs.btrfs, block A is allocated to be device tree's root. - -2. Mount this filesystem and put it in use, after a while, device tree's - root got COW but block A hasn't been allocated/overwritten yet. - -3. Umount it and reload the btrfs module to remove both disks from the - global @fs_devices list. - -4. mount -odegraded dev1 and write some data, so now block A is allocated - to be a leaf in checksum tree. Note that only dev1 has the latest - metadata of this filesystem. - -5. Umount it and mount it again normally (with both disks), since raid1 - can pick up one disk by the writer task's pid, if btrfs_search_slot() - needs to read block A, dev2 which does NOT have the latest metadata - might be read for block A, then we got a stale block A. - -6. As parent transid is not checked, block A is marked as uptodate and - put into the extent buffer cache, so the future search won't bother - to read disk again, which means it'll make changes on this stale - one and make it dirty and flush it onto disk. - -To avoid the problem, parent transid needs to be passed to -read_tree_block(). - -In order to get a valid parent transid, we need to hold the parent's -lock until finishing reading child. - -This patch needs to be slightly adapted for stable kernels, the -&first_key parameter added to read_tree_block() is from 4.16+ -(581c1760415c4). The fix is to replace 0 by 'gen'. - -Fixes: 5bdd3536cbbe ("Btrfs: Fix block generation verification race") -CC: stable@vger.kernel.org # 4.4+ -Signed-off-by: Liu Bo -Reviewed-by: Filipe Manana -Reviewed-by: Qu Wenruo -[ update changelog ] -Signed-off-by: David Sterba -Signed-off-by: Nikolay Borisov -Signed-off-by: Greg Kroah-Hartman ---- - fs/btrfs/ctree.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/fs/btrfs/ctree.c -+++ b/fs/btrfs/ctree.c -@@ -2497,10 +2497,8 @@ read_block_for_search(struct btrfs_trans - if (p->reada) - reada_for_search(root, p, level, slot, key->objectid); - -- btrfs_release_path(p); -- - ret = -EAGAIN; -- tmp = read_tree_block(root, blocknr, 0); -+ tmp = read_tree_block(fs_info, blocknr, gen); - if (!IS_ERR(tmp)) { - /* - * If the read above didn't mark this buffer up to date, -@@ -2512,6 +2510,8 @@ read_block_for_search(struct btrfs_trans - ret = -EIO; - free_extent_buffer(tmp); - } -+ -+ btrfs_release_path(p); - return ret; - } - diff --git a/queue-4.4/series b/queue-4.4/series index c9f4fb46cf7..01196a32807 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -67,4 +67,3 @@ arm-8770-1-kprobes-prohibit-probing-on-optimized_callback.patch arm-8772-1-kprobes-prohibit-kprobes-on-get_user-functions.patch btrfs-fix-xattr-loss-after-power-failure.patch btrfs-fix-crash-when-trying-to-resume-balance-without-the-resume-flag.patch -btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch diff --git a/queue-4.9/btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch b/queue-4.9/btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch deleted file mode 100644 index 7b2523e9231..00000000000 --- a/queue-4.9/btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch +++ /dev/null @@ -1,95 +0,0 @@ -From 02a3307aa9c20b4f6626255b028f07f6cfa16feb Mon Sep 17 00:00:00 2001 -From: Liu Bo -Date: Wed, 16 May 2018 01:37:36 +0800 -Subject: btrfs: fix reading stale metadata blocks after degraded raid1 mounts - -From: Liu Bo - -commit 02a3307aa9c20b4f6626255b028f07f6cfa16feb upstream. - -If a btree block, aka. extent buffer, is not available in the extent -buffer cache, it'll be read out from the disk instead, i.e. - -btrfs_search_slot() - read_block_for_search() # hold parent and its lock, go to read child - btrfs_release_path() - read_tree_block() # read child - -Unfortunately, the parent lock got released before reading child, so -commit 5bdd3536cbbe ("Btrfs: Fix block generation verification race") had -used 0 as parent transid to read the child block. It forces -read_tree_block() not to check if parent transid is different with the -generation id of the child that it reads out from disk. - -A simple PoC is included in btrfs/124, - -0. A two-disk raid1 btrfs, - -1. Right after mkfs.btrfs, block A is allocated to be device tree's root. - -2. Mount this filesystem and put it in use, after a while, device tree's - root got COW but block A hasn't been allocated/overwritten yet. - -3. Umount it and reload the btrfs module to remove both disks from the - global @fs_devices list. - -4. mount -odegraded dev1 and write some data, so now block A is allocated - to be a leaf in checksum tree. Note that only dev1 has the latest - metadata of this filesystem. - -5. Umount it and mount it again normally (with both disks), since raid1 - can pick up one disk by the writer task's pid, if btrfs_search_slot() - needs to read block A, dev2 which does NOT have the latest metadata - might be read for block A, then we got a stale block A. - -6. As parent transid is not checked, block A is marked as uptodate and - put into the extent buffer cache, so the future search won't bother - to read disk again, which means it'll make changes on this stale - one and make it dirty and flush it onto disk. - -To avoid the problem, parent transid needs to be passed to -read_tree_block(). - -In order to get a valid parent transid, we need to hold the parent's -lock until finishing reading child. - -This patch needs to be slightly adapted for stable kernels, the -&first_key parameter added to read_tree_block() is from 4.16+ -(581c1760415c4). The fix is to replace 0 by 'gen'. - -Fixes: 5bdd3536cbbe ("Btrfs: Fix block generation verification race") -CC: stable@vger.kernel.org # 4.4+ -Signed-off-by: Liu Bo -Reviewed-by: Filipe Manana -Reviewed-by: Qu Wenruo -[ update changelog ] -Signed-off-by: David Sterba -Signed-off-by: Nikolay Borisov -Signed-off-by: Greg Kroah-Hartman ---- - fs/btrfs/ctree.c | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - ---- a/fs/btrfs/ctree.c -+++ b/fs/btrfs/ctree.c -@@ -2486,10 +2486,8 @@ read_block_for_search(struct btrfs_trans - if (p->reada != READA_NONE) - reada_for_search(root, p, level, slot, key->objectid); - -- btrfs_release_path(p); -- - ret = -EAGAIN; -- tmp = read_tree_block(root, blocknr, 0); -+ tmp = read_tree_block(fs_info, blocknr, gen); - if (!IS_ERR(tmp)) { - /* - * If the read above didn't mark this buffer up to date, -@@ -2503,6 +2501,8 @@ read_block_for_search(struct btrfs_trans - } else { - ret = PTR_ERR(tmp); - } -+ -+ btrfs_release_path(p); - return ret; - } - diff --git a/queue-4.9/series b/queue-4.9/series index e43f9674935..91611121493 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -32,4 +32,3 @@ arm-8772-1-kprobes-prohibit-kprobes-on-get_user-functions.patch btrfs-fix-xattr-loss-after-power-failure.patch btrfs-fix-crash-when-trying-to-resume-balance-without-the-resume-flag.patch x86-amd-don-t-set-x86_bug_sysret_ss_attrs-when-running.patch -btrfs-fix-reading-stale-metadata-blocks-after-degraded-raid1-mounts.patch -- 2.47.2