summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorgraysky2019-09-14 07:06:57 -0400
committergraysky2019-09-14 07:06:57 -0400
commit778989a0a1aa3de7d8980f3c3e6847baa29e2027 (patch)
tree5ee4c689a7a1116bd08628ef17199f2aa003564d
parent625980c002d3f87ceca89bd9d19f2fafcd7f2385 (diff)
downloadaur-778989a0a1aa3de7d8980f3c3e6847baa29e2027.tar.gz
Update to 5.2.14-2
-rw-r--r--.SRCINFO4
-rw-r--r--0003-Btrfs-fix-unwritten-extent-buffers-and-hangs-on-futu.patch145
-rw-r--r--PKGBUILD6
3 files changed, 152 insertions, 3 deletions
diff --git a/.SRCINFO b/.SRCINFO
index b7740a8e398b..2fb546970338 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,6 +1,6 @@
pkgbase = linux-ck
pkgver = 5.2.14
- pkgrel = 1
+ pkgrel = 2
url = https://wiki.archlinux.org/index.php/Linux-ck
arch = x86_64
license = GPL2
@@ -19,6 +19,7 @@ pkgbase = linux-ck
source = http://ck.kolivas.org/patches/5.0/5.2/5.2-ck1/patch-5.2-ck1.xz
source = 0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch
source = 0002-ZEN-Add-CONFIG-for-unprivileged_userns_clone.patch
+ source = 0003-Btrfs-fix-unwritten-extent-buffers-and-hangs-on-futu.patch
validpgpkeys = ABAF11C65A2970B130ABE3C479BE3E4300411886
validpgpkeys = 647F28654894E3BD457199BE38DBBDC86092693E
sha256sums = c64d36477fee6a864a734ec417407768e60040a13f144c33208fa9622fd0ce8c
@@ -31,6 +32,7 @@ pkgbase = linux-ck
sha256sums = f1abc13a8d859fbf6350040e45d7f04ad551a6d39f113ba96fbbd820118c0e36
sha256sums = 91fafa76bf9cb32159ac7f22191b3589278b91e65bc4505cf2fc6013b8037bf3
sha256sums = 63e4378e69e2f23ed87af32a4951477a6d82d4ac0de2295db46502c8120da9d9
+ sha256sums = f45f8695a7fe308b7aaef874df0a51ce91ac47ef180adf0cc507b482aad2459f
pkgname = linux-ck
pkgdesc = The Linux-ck kernel and modules with the ck1 patchset featuring MuQSS CPU scheduler v0.192
diff --git a/0003-Btrfs-fix-unwritten-extent-buffers-and-hangs-on-futu.patch b/0003-Btrfs-fix-unwritten-extent-buffers-and-hangs-on-futu.patch
new file mode 100644
index 000000000000..ff526e3968de
--- /dev/null
+++ b/0003-Btrfs-fix-unwritten-extent-buffers-and-hangs-on-futu.patch
@@ -0,0 +1,145 @@
+From 45fc8773f47b7cbe56caab0e14abf26d1e044e63 Mon Sep 17 00:00:00 2001
+From: Filipe Manana <fdmanana@suse.com>
+Date: Wed, 11 Sep 2019 17:42:00 +0100
+Subject: [PATCH 3/4] Btrfs: fix unwritten extent buffers and hangs on future
+ writeback attempts
+
+The lock_extent_buffer_io() returns 1 to the caller to tell it everything
+went fine and the callers needs to start writeback for the extent buffer
+(submit a bio, etc), 0 to tell the caller everything went fine but it does
+not need to start writeback for the extent buffer, and a negative value if
+some error happened.
+
+When it's about to return 1 it tries to lock all pages, and if a try lock
+on a page fails, and we didn't flush any existing bio in our "epd", it
+calls flush_write_bio(epd) and overwrites the return value of 1 to 0 or
+an error. The page might have been locked elsewhere, not with the goal
+of starting writeback of the extent buffer, and even by some code other
+than btrfs, like page migration for example, so it does not mean the
+writeback of the extent buffer was already started by some other task,
+so returning a 0 tells the caller (btree_write_cache_pages()) to not
+start writeback for the extent buffer. Note that epd might currently have
+either no bio, so flush_write_bio() returns 0 (success) or it might have
+a bio for another extent buffer with a lower index (logical address).
+
+Since we return 0 with the EXTENT_BUFFER_WRITEBACK bit set on the
+extent buffer and writeback is never started for the extent buffer,
+future attempts to writeback the extent buffer will hang forever waiting
+on that bit to be cleared, since it can only be cleared after writeback
+completes. Such hang is reported with a trace like the following:
+
+ [49887.347053] INFO: task btrfs-transacti:1752 blocked for more than 122 seconds.
+ [49887.347059] Not tainted 5.2.13-gentoo #2
+ [49887.347060] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
+ [49887.347062] btrfs-transacti D 0 1752 2 0x80004000
+ [49887.347064] Call Trace:
+ [49887.347069] ? __schedule+0x265/0x830
+ [49887.347071] ? bit_wait+0x50/0x50
+ [49887.347072] ? bit_wait+0x50/0x50
+ [49887.347074] schedule+0x24/0x90
+ [49887.347075] io_schedule+0x3c/0x60
+ [49887.347077] bit_wait_io+0x8/0x50
+ [49887.347079] __wait_on_bit+0x6c/0x80
+ [49887.347081] ? __lock_release.isra.29+0x155/0x2d0
+ [49887.347083] out_of_line_wait_on_bit+0x7b/0x80
+ [49887.347084] ? var_wake_function+0x20/0x20
+ [49887.347087] lock_extent_buffer_for_io+0x28c/0x390
+ [49887.347089] btree_write_cache_pages+0x18e/0x340
+ [49887.347091] do_writepages+0x29/0xb0
+ [49887.347093] ? kmem_cache_free+0x132/0x160
+ [49887.347095] ? convert_extent_bit+0x544/0x680
+ [49887.347097] filemap_fdatawrite_range+0x70/0x90
+ [49887.347099] btrfs_write_marked_extents+0x53/0x120
+ [49887.347100] btrfs_write_and_wait_transaction.isra.4+0x38/0xa0
+ [49887.347102] btrfs_commit_transaction+0x6bb/0x990
+ [49887.347103] ? start_transaction+0x33e/0x500
+ [49887.347105] transaction_kthread+0x139/0x15c
+
+So fix this by not overwriting the return value (ret) with the result
+from flush_write_bio(). We also need to clear the EXTENT_BUFFER_WRITEBACK
+bit in case flush_write_bio() returns an error, otherwise it will hang
+any future attempts to writeback the extent buffer, and undo all work
+done before (set back EXTENT_BUFFER_DIRTY, etc).
+
+This is a regression introduced in the 5.2 kernel.
+
+Fixes: 2e3c25136adfb ("btrfs: extent_io: add proper error handling to lock_extent_buffer_for_io()")
+Fixes: f4340622e0226 ("btrfs: extent_io: Move the BUG_ON() in flush_write_bio() one level up")
+Reported-by: Zdenek Sojka <zsojka@seznam.cz>
+Link: https://lore.kernel.org/linux-btrfs/GpO.2yos.3WGDOLpx6t%7D.1TUDYM@seznam.cz/T/#u
+Reported-by: Stefan Priebe - Profihost AG <s.priebe@profihost.ag>
+Link: https://lore.kernel.org/linux-btrfs/5c4688ac-10a7-fb07-70e8-c5d31a3fbb38@profihost.ag/T/#t
+Reported-by: Drazen Kacar <drazen.kacar@oradian.com>
+Link: https://lore.kernel.org/linux-btrfs/DB8PR03MB562876ECE2319B3E579590F799C80@DB8PR03MB5628.eurprd03.prod.outlook.com/
+Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=204377
+Signed-off-by: Filipe Manana <fdmanana@suse.com>
+---
+ fs/btrfs/extent_io.c | 35 ++++++++++++++++++++++++++---------
+ 1 file changed, 26 insertions(+), 9 deletions(-)
+
+diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
+index db337e53aab3..93900ff87df7 100644
+--- a/fs/btrfs/extent_io.c
++++ b/fs/btrfs/extent_io.c
+@@ -3591,6 +3591,13 @@ void wait_on_extent_buffer_writeback(struct extent_buffer *eb)
+ TASK_UNINTERRUPTIBLE);
+ }
+
++static void end_extent_buffer_writeback(struct extent_buffer *eb)
++{
++ clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
++ smp_mb__after_atomic();
++ wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK);
++}
++
+ /*
+ * Lock eb pages and flush the bio if we can't the locks
+ *
+@@ -3662,8 +3669,11 @@ static noinline_for_stack int lock_extent_buffer_for_io(struct extent_buffer *eb
+
+ if (!trylock_page(p)) {
+ if (!flush) {
+- ret = flush_write_bio(epd);
+- if (ret < 0) {
++ int err;
++
++ err = flush_write_bio(epd);
++ if (err < 0) {
++ ret = err;
+ failed_page_nr = i;
+ goto err_unlock;
+ }
+@@ -3678,16 +3688,23 @@ static noinline_for_stack int lock_extent_buffer_for_io(struct extent_buffer *eb
+ /* Unlock already locked pages */
+ for (i = 0; i < failed_page_nr; i++)
+ unlock_page(eb->pages[i]);
++ /*
++ * Clear EXTENT_BUFFER_WRITEBACK and wake up anyone waiting on it.
++ * Also set back EXTENT_BUFFER_DIRTY so future attempts to this eb can
++ * be made and undo everything done before.
++ */
++ btrfs_tree_lock(eb);
++ spin_lock(&eb->refs_lock);
++ set_bit(EXTENT_BUFFER_DIRTY, &eb->bflags);
++ end_extent_buffer_writeback(eb);
++ spin_unlock(&eb->refs_lock);
++ percpu_counter_add_batch(&fs_info->dirty_metadata_bytes, eb->len,
++ fs_info->dirty_metadata_batch);
++ btrfs_clear_header_flag(eb, BTRFS_HEADER_FLAG_WRITTEN);
++ btrfs_tree_unlock(eb);
+ return ret;
+ }
+
+-static void end_extent_buffer_writeback(struct extent_buffer *eb)
+-{
+- clear_bit(EXTENT_BUFFER_WRITEBACK, &eb->bflags);
+- smp_mb__after_atomic();
+- wake_up_bit(&eb->bflags, EXTENT_BUFFER_WRITEBACK);
+-}
+-
+ static void set_btree_ioerr(struct page *page)
+ {
+ struct extent_buffer *eb = (struct extent_buffer *)page->private;
+--
+2.23.0
+
diff --git a/PKGBUILD b/PKGBUILD
index 7d241b297678..2aafd3d27e9a 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -65,7 +65,7 @@ _localmodcfg=
pkgbase=linux-ck
_srcver=5.2.14-arch1
pkgver=${_srcver%-*}
-pkgrel=1
+pkgrel=2
_ckpatchversion=1
arch=(x86_64)
url="https://wiki.archlinux.org/index.php/Linux-ck"
@@ -84,6 +84,7 @@ source=(
"http://ck.kolivas.org/patches/5.0/5.2/5.2-ck${_ckpatchversion}/$_ckpatch.xz"
0001-add-sysctl-to-disallow-unprivileged-CLONE_NEWUSER-by.patch
0002-ZEN-Add-CONFIG-for-unprivileged_userns_clone.patch
+ 0003-Btrfs-fix-unwritten-extent-buffers-and-hangs-on-futu.patch
)
validpgpkeys=(
'ABAF11C65A2970B130ABE3C479BE3E4300411886' # Linus Torvalds
@@ -98,7 +99,8 @@ sha256sums=('c64d36477fee6a864a734ec417407768e60040a13f144c33208fa9622fd0ce8c'
'8c11086809864b5cef7d079f930bd40da8d0869c091965fa62e95de9a0fe13b5'
'f1abc13a8d859fbf6350040e45d7f04ad551a6d39f113ba96fbbd820118c0e36'
'91fafa76bf9cb32159ac7f22191b3589278b91e65bc4505cf2fc6013b8037bf3'
- '63e4378e69e2f23ed87af32a4951477a6d82d4ac0de2295db46502c8120da9d9')
+ '63e4378e69e2f23ed87af32a4951477a6d82d4ac0de2295db46502c8120da9d9'
+ 'f45f8695a7fe308b7aaef874df0a51ce91ac47ef180adf0cc507b482aad2459f')
_kernelname=${pkgbase#linux}
: ${_kernelname:=-ARCH}