diff options
author | Coly Li <colyli@suse.de> | 2020-11-12 12:41:21 +0800 |
---|---|---|
committer | Coly Li <colyli@suse.de> | 2020-11-12 12:41:21 +0800 |
commit | 17ca25a1fcc1fb9d06263bec8e989ef97bb4b017 (patch) | |
tree | dff0df60ba8d6b24883bdc519302424fbdb8baee | |
parent | 158ccc42daa1b97cf472ded4677d2618cb63f542 (diff) | |
download | bcache-patches-17ca25a1fcc1fb9d06263bec8e989ef97bb4b017.tar.gz |
for-test: add 0001-bcache-fix-race-between-setting-bdev-state-to-none-a.patch
9 files changed, 83 insertions, 383 deletions
diff --git a/for-next/0002-bcache-check-c-root-with-IS_ERR_OR_NULL-in-mca_reser.patch b/for-next/0002-bcache-check-c-root-with-IS_ERR_OR_NULL-in-mca_reser.patch index 951a69a..e5939b7 100644 --- a/for-next/0002-bcache-check-c-root-with-IS_ERR_OR_NULL-in-mca_reser.patch +++ b/for-next/0002-bcache-check-c-root-with-IS_ERR_OR_NULL-in-mca_reser.patch @@ -6,11 +6,12 @@ Subject: [PATCH 02/15] bcache: check c->root with IS_ERR_OR_NULL() in In mca_reserve(c) macro, we are checking root whether is NULL or not. But that's not enough, when we read the root node in run_cache_set(), -if we got an error in bch_btree_node_read_done(), we will return ERR_PTR(-EIO) -to c->root. +if we got an error in bch_btree_node_read_done(), we will return +ERR_PTR(-EIO) to c->root. -And then we will go continue to unregister, but before unregister_shrinker(&c->shrink); -there is a possibility to call bch_mca_count(), and we would get a crash with call trace like that: +And then we will go continue to unregister, but before calling +unregister_shrinker(&c->shrink), there is a possibility to call +bch_mca_count(), and we would get a crash with call trace like that: [ 2149.876008] Unable to handle kernel NULL pointer dereference at virtual address 00000000000000b5 ... ... diff --git a/for-next/nvme-tcp/v7-0000-cover-letter.patch b/for-next/nvme-tcp/v7-0000-cover-letter.patch deleted file mode 100644 index c873351..0000000 --- a/for-next/nvme-tcp/v7-0000-cover-letter.patch +++ /dev/null @@ -1,81 +0,0 @@ -From 91b0da8cb890ef1a07b104dc8c2a621fe267cf1d Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Tue, 18 Aug 2020 21:09:29 +0800 -Subject: [PATCH v7 0/6] Introduce sendpage_ok() to detect misused sendpage in network related drivers - -This series was original by a bug fix in nvme-over-tcp driver which only -checked whether a page was allocated from slab allcoator, but forgot to -check its page_count: The page handled by sendpage should be neither a -Slab page nor 0 page_count page. - -As Sagi Grimberg suggested, the original fix is refind to a more common -inline routine: - static inline bool sendpage_ok(struct page *page) - { - return (!PageSlab(page) && page_count(page) >= 1); - } -If sendpage_ok() returns true, the checking page can be handled by the -zero copy sendpage method in network layer. - -The first patch in this series introduces sendpage_ok() in header file -include/linux/net.h, the second patch fixes the page checking issue in -nvme-over-tcp driver, the third patch adds page_count check by using -sendpage_ok() in do_tcp_sendpages() as Eric Dumazet suggested, and all -rested patches just replace existing open coded checks with the inline -sendpage_ok() routine. - -Coly Li - -Cc: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> -Cc: Chris Leech <cleech@redhat.com> -Cc: Christoph Hellwig <hch@lst.de> -Cc: Cong Wang <amwang@redhat.com> -Cc: David S. Miller <davem@davemloft.net> -Cc: Eric Dumazet <eric.dumazet@gmail.com> -Cc: Hannes Reinecke <hare@suse.de> -Cc: Ilya Dryomov <idryomov@gmail.com> -Cc: Jan Kara <jack@suse.com> -Cc: Jeff Layton <jlayton@kernel.org> -Cc: Jens Axboe <axboe@kernel.dk> -Cc: Lee Duncan <lduncan@suse.com> -Cc: Mike Christie <michaelc@cs.wisc.edu> -Cc: Mikhail Skorzhinskii <mskorzhinskiy@solarflare.com> -Cc: Philipp Reisner <philipp.reisner@linbit.com> -Cc: Sagi Grimberg <sagi@grimberg.me> -Cc: Vasily Averin <vvs@virtuozzo.com> -Cc: Vlastimil Babka <vbabka@suse.com> ---- -Changelog: -v7: remove outer brackets from the return line of sendpage_ok() as - Eric Dumazet suggested. -v6: fix page check in do_tcp_sendpages(), as Eric Dumazet suggested. - replace other open coded checks with sendpage_ok() in libceph, - iscsi drivers. -v5, include linux/mm.h in include/linux/net.h -v4, change sendpage_ok() as an inline helper, and post it as - separate patch, as Christoph Hellwig suggested. -v3, introduce a more common sendpage_ok() as Sagi Grimberg suggested. -v2, fix typo in patch subject -v1, the initial version. - - -Coly Li (6): - net: introduce helper sendpage_ok() in include/linux/net.h - nvme-tcp: check page by sendpage_ok() before calling kernel_sendpage() - tcp: use sendpage_ok() to detect misused .sendpage - drbd: code cleanup by using sendpage_ok() to check page for - kernel_sendpage() - scsi: libiscsi: use sendpage_ok() in iscsi_tcp_segment_map() - libceph: use sendpage_ok() in ceph_tcp_sendpage() - - drivers/block/drbd/drbd_main.c | 2 +- - drivers/nvme/host/tcp.c | 7 +++---- - drivers/scsi/libiscsi_tcp.c | 2 +- - include/linux/net.h | 16 ++++++++++++++++ - net/ceph/messenger.c | 2 +- - net/ipv4/tcp.c | 3 ++- - 6 files changed, 24 insertions(+), 8 deletions(-) - --- -2.26.2 - diff --git a/for-next/nvme-tcp/v7-0001-net-introduce-helper-sendpage_ok-in-include-linux.patch b/for-next/nvme-tcp/v7-0001-net-introduce-helper-sendpage_ok-in-include-linux.patch deleted file mode 100644 index 1fa95ee..0000000 --- a/for-next/nvme-tcp/v7-0001-net-introduce-helper-sendpage_ok-in-include-linux.patch +++ /dev/null @@ -1,75 +0,0 @@ -From 797f86656814805cca92af43652ed0732963f565 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Sat, 15 Aug 2020 13:40:48 +0800 -Subject: [PATCH v7 1/6] net: introduce helper sendpage_ok() in - include/linux/net.h - -The original problem was from nvme-over-tcp code, who mistakenly uses -kernel_sendpage() to send pages allocated by __get_free_pages() without -__GFP_COMP flag. Such pages don't have refcount (page_count is 0) on -tail pages, sending them by kernel_sendpage() may trigger a kernel panic -from a corrupted kernel heap, because these pages are incorrectly freed -in network stack as page_count 0 pages. - -This patch introduces a helper sendpage_ok(), it returns true if the -checking page, -- is not slab page: PageSlab(page) is false. -- has page refcount: page_count(page) is not zero - -All drivers who want to send page to remote end by kernel_sendpage() -may use this helper to check whether the page is OK. If the helper does -not return true, the driver should try other non sendpage method (e.g. -sock_no_sendpage()) to handle the page. - -Signed-off-by: Coly Li <colyli@suse.de> -Cc: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> -Cc: Christoph Hellwig <hch@lst.de> -Cc: Hannes Reinecke <hare@suse.de> -Cc: Jan Kara <jack@suse.com> -Cc: Jens Axboe <axboe@kernel.dk> -Cc: Mikhail Skorzhinskii <mskorzhinskiy@solarflare.com> -Cc: Philipp Reisner <philipp.reisner@linbit.com> -Cc: Sagi Grimberg <sagi@grimberg.me> -Cc: Vlastimil Babka <vbabka@suse.com> -Cc: stable@vger.kernel.org ---- - include/linux/net.h | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/include/linux/net.h b/include/linux/net.h -index d48ff1180879..05db8690f67e 100644 ---- a/include/linux/net.h -+++ b/include/linux/net.h -@@ -21,6 +21,7 @@ - #include <linux/rcupdate.h> - #include <linux/once.h> - #include <linux/fs.h> -+#include <linux/mm.h> - #include <linux/sockptr.h> - - #include <uapi/linux/net.h> -@@ -286,6 +287,21 @@ do { \ - #define net_get_random_once_wait(buf, nbytes) \ - get_random_once_wait((buf), (nbytes)) - -+/* -+ * E.g. XFS meta- & log-data is in slab pages, or bcache meta -+ * data pages, or other high order pages allocated by -+ * __get_free_pages() without __GFP_COMP, which have a page_count -+ * of 0 and/or have PageSlab() set. We cannot use send_page for -+ * those, as that does get_page(); put_page(); and would cause -+ * either a VM_BUG directly, or __page_cache_release a page that -+ * would actually still be referenced by someone, leading to some -+ * obscure delayed Oops somewhere else. -+ */ -+static inline bool sendpage_ok(struct page *page) -+{ -+ return !PageSlab(page) && page_count(page) >= 1; -+} -+ - int kernel_sendmsg(struct socket *sock, struct msghdr *msg, struct kvec *vec, - size_t num, size_t len); - int kernel_sendmsg_locked(struct sock *sk, struct msghdr *msg, --- -2.26.2 - diff --git a/for-next/nvme-tcp/v7-0002-nvme-tcp-check-page-by-sendpage_ok-before-calling.patch b/for-next/nvme-tcp/v7-0002-nvme-tcp-check-page-by-sendpage_ok-before-calling.patch deleted file mode 100644 index 2956afb..0000000 --- a/for-next/nvme-tcp/v7-0002-nvme-tcp-check-page-by-sendpage_ok-before-calling.patch +++ /dev/null @@ -1,57 +0,0 @@ -From fd1e16f6dce2cdb40f590d918e1eb7c4b7684a81 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Sat, 15 Aug 2020 15:32:59 +0800 -Subject: [PATCH v7 2/6] nvme-tcp: check page by sendpage_ok() before calling - kernel_sendpage() - -Currently nvme_tcp_try_send_data() doesn't use kernel_sendpage() to -send slab pages. But for pages allocated by __get_free_pages() without -__GFP_COMP, which also have refcount as 0, they are still sent by -kernel_sendpage() to remote end, this is problematic. - -The new introduced helper sendpage_ok() checks both PageSlab tag and -page_count counter, and returns true if the checking page is OK to be -sent by kernel_sendpage(). - -This patch fixes the page checking issue of nvme_tcp_try_send_data() -with sendpage_ok(). If sendpage_ok() returns true, send this page by -kernel_sendpage(), otherwise use sock_no_sendpage to handle this page. - -Signed-off-by: Coly Li <colyli@suse.de> -Cc: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> -Cc: Christoph Hellwig <hch@lst.de> -Cc: Hannes Reinecke <hare@suse.de> -Cc: Jan Kara <jack@suse.com> -Cc: Jens Axboe <axboe@kernel.dk> -Cc: Mikhail Skorzhinskii <mskorzhinskiy@solarflare.com> -Cc: Philipp Reisner <philipp.reisner@linbit.com> -Cc: Sagi Grimberg <sagi@grimberg.me> -Cc: Vlastimil Babka <vbabka@suse.com> -Cc: stable@vger.kernel.org ---- - drivers/nvme/host/tcp.c | 7 +++---- - 1 file changed, 3 insertions(+), 4 deletions(-) - -diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c -index 62fbaecdc960..902fe742762b 100644 ---- a/drivers/nvme/host/tcp.c -+++ b/drivers/nvme/host/tcp.c -@@ -912,12 +912,11 @@ static int nvme_tcp_try_send_data(struct nvme_tcp_request *req) - else - flags |= MSG_MORE | MSG_SENDPAGE_NOTLAST; - -- /* can't zcopy slab pages */ -- if (unlikely(PageSlab(page))) { -- ret = sock_no_sendpage(queue->sock, page, offset, len, -+ if (sendpage_ok(page)) { -+ ret = kernel_sendpage(queue->sock, page, offset, len, - flags); - } else { -- ret = kernel_sendpage(queue->sock, page, offset, len, -+ ret = sock_no_sendpage(queue->sock, page, offset, len, - flags); - } - if (ret <= 0) --- -2.26.2 - diff --git a/for-next/nvme-tcp/v7-0003-tcp-use-sendpage_ok-to-detect-misused-.sendpage.patch b/for-next/nvme-tcp/v7-0003-tcp-use-sendpage_ok-to-detect-misused-.sendpage.patch deleted file mode 100644 index aefa3c5..0000000 --- a/for-next/nvme-tcp/v7-0003-tcp-use-sendpage_ok-to-detect-misused-.sendpage.patch +++ /dev/null @@ -1,44 +0,0 @@ -From de6c6f9a3f1284083bbafe22a70f18a98fdeee4e Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Tue, 18 Aug 2020 20:05:35 +0800 -Subject: [PATCH v7 3/6] tcp: use sendpage_ok() to detect misused .sendpage - -commit a10674bf2406 ("tcp: detecting the misuse of .sendpage for Slab -objects") adds the checks for Slab pages, but the pages don't have -page_count are still missing from the check. - -Network layer's sendpage method is not designed to send page_count 0 -pages neither, therefore both PageSlab() and page_count() should be -both checked for the sending page. This is exactly what sendpage_ok() -does. - -This patch uses sendpage_ok() in do_tcp_sendpages() to detect misused -.sendpage, to make the code more robust. - -Fixes: a10674bf2406 ("tcp: detecting the misuse of .sendpage for Slab objects") -Suggested-by: Eric Dumazet <eric.dumazet@gmail.com> -Signed-off-by: Coly Li <colyli@suse.de> -Cc: Vasily Averin <vvs@virtuozzo.com> -Cc: David S. Miller <davem@davemloft.net> -Cc: stable@vger.kernel.org ---- - net/ipv4/tcp.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c -index 31f3b858db81..2135ee7c806d 100644 ---- a/net/ipv4/tcp.c -+++ b/net/ipv4/tcp.c -@@ -970,7 +970,8 @@ ssize_t do_tcp_sendpages(struct sock *sk, struct page *page, int offset, - long timeo = sock_sndtimeo(sk, flags & MSG_DONTWAIT); - - if (IS_ENABLED(CONFIG_DEBUG_VM) && -- WARN_ONCE(PageSlab(page), "page must not be a Slab one")) -+ WARN_ONCE(!sendpage_ok(page), -+ "page must not be a Slab one and have page_count > 0")) - return -EINVAL; - - /* Wait for a connection to finish. One exception is TCP Fast Open --- -2.26.2 - diff --git a/for-next/nvme-tcp/v7-0004-drbd-code-cleanup-by-using-sendpage_ok-to-check-p.patch b/for-next/nvme-tcp/v7-0004-drbd-code-cleanup-by-using-sendpage_ok-to-check-p.patch deleted file mode 100644 index 72fdf41..0000000 --- a/for-next/nvme-tcp/v7-0004-drbd-code-cleanup-by-using-sendpage_ok-to-check-p.patch +++ /dev/null @@ -1,42 +0,0 @@ -From ddf5d134516c6a151c13556d9d2536f0658eff92 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Sat, 15 Aug 2020 15:37:00 +0800 -Subject: [PATCH v7 4/6] drbd: code cleanup by using sendpage_ok() to check - page for kernel_sendpage() - -In _drbd_send_page() a page is checked by following code before sending -it by kernel_sendpage(), - (page_count(page) < 1) || PageSlab(page) -If the check is true, this page won't be send by kernel_sendpage() and -handled by sock_no_sendpage(). - -This kind of check is exactly what macro sendpage_ok() does, which is -introduced into include/linux/net.h to solve a similar send page issue -in nvme-tcp code. - -This patch uses macro sendpage_ok() to replace the open coded checks to -page type and refcount in _drbd_send_page(), as a code cleanup. - -Signed-off-by: Coly Li <colyli@suse.de> -Cc: Philipp Reisner <philipp.reisner@linbit.com> -Cc: Sagi Grimberg <sagi@grimberg.me> ---- - drivers/block/drbd/drbd_main.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c -index cb687ccdbd96..55dc0c91781e 100644 ---- a/drivers/block/drbd/drbd_main.c -+++ b/drivers/block/drbd/drbd_main.c -@@ -1553,7 +1553,7 @@ static int _drbd_send_page(struct drbd_peer_device *peer_device, struct page *pa - * put_page(); and would cause either a VM_BUG directly, or - * __page_cache_release a page that would actually still be referenced - * by someone, leading to some obscure delayed Oops somewhere else. */ -- if (drbd_disable_sendpage || (page_count(page) < 1) || PageSlab(page)) -+ if (drbd_disable_sendpage || !sendpage_ok(page)) - return _drbd_no_send_page(peer_device, page, offset, size, msg_flags); - - msg_flags |= MSG_NOSIGNAL; --- -2.26.2 - diff --git a/for-next/nvme-tcp/v7-0005-scsi-libiscsi-use-sendpage_ok-in-iscsi_tcp_segmen.patch b/for-next/nvme-tcp/v7-0005-scsi-libiscsi-use-sendpage_ok-in-iscsi_tcp_segmen.patch deleted file mode 100644 index 513d1b7..0000000 --- a/for-next/nvme-tcp/v7-0005-scsi-libiscsi-use-sendpage_ok-in-iscsi_tcp_segmen.patch +++ /dev/null @@ -1,45 +0,0 @@ -From c781516d440b75ac08b8fbf5e55f14a3c556dd44 Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Tue, 18 Aug 2020 19:30:04 +0800 -Subject: [PATCH v7 5/6] scsi: libiscsi: use sendpage_ok() in - iscsi_tcp_segment_map() - -In iscsci driver, iscsi_tcp_segment_map() uses the following code to -check whether the page should or not be handled by sendpage: - if (!recv && page_count(sg_page(sg)) >= 1 && !PageSlab(sg_page(sg))) - -The "page_count(sg_page(sg)) >= 1 && !PageSlab(sg_page(sg)" part is to -make sure the page can be sent to network layer's zero copy path. This -part is exactly what sendpage_ok() does. - -This patch uses use sendpage_ok() in iscsi_tcp_segment_map() to replace -the original open coded checks. - -Signed-off-by: Coly Li <colyli@suse.de> -Cc: Vasily Averin <vvs@virtuozzo.com> -Cc: Cong Wang <amwang@redhat.com> -Cc: Mike Christie <michaelc@cs.wisc.edu> -Cc: Lee Duncan <lduncan@suse.com> -Cc: Chris Leech <cleech@redhat.com> -Cc: Christoph Hellwig <hch@lst.de> -Cc: Hannes Reinecke <hare@suse.de> ---- - drivers/scsi/libiscsi_tcp.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/scsi/libiscsi_tcp.c b/drivers/scsi/libiscsi_tcp.c -index 6ef93c7af954..31cd8487c16e 100644 ---- a/drivers/scsi/libiscsi_tcp.c -+++ b/drivers/scsi/libiscsi_tcp.c -@@ -128,7 +128,7 @@ static void iscsi_tcp_segment_map(struct iscsi_segment *segment, int recv) - * coalescing neighboring slab objects into a single frag which - * triggers one of hardened usercopy checks. - */ -- if (!recv && page_count(sg_page(sg)) >= 1 && !PageSlab(sg_page(sg))) -+ if (!recv && sendpage_ok(sg_page(sg))) - return; - - if (recv) { --- -2.26.2 - diff --git a/for-next/nvme-tcp/v7-0006-libceph-use-sendpage_ok-in-ceph_tcp_sendpage.patch b/for-next/nvme-tcp/v7-0006-libceph-use-sendpage_ok-in-ceph_tcp_sendpage.patch deleted file mode 100644 index d9d2d8f..0000000 --- a/for-next/nvme-tcp/v7-0006-libceph-use-sendpage_ok-in-ceph_tcp_sendpage.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 91b0da8cb890ef1a07b104dc8c2a621fe267cf1d Mon Sep 17 00:00:00 2001 -From: Coly Li <colyli@suse.de> -Date: Tue, 18 Aug 2020 19:54:37 +0800 -Subject: [PATCH v7 6/6] libceph: use sendpage_ok() in ceph_tcp_sendpage() - -In libceph, ceph_tcp_sendpage() does the following checks before handle -the page by network layer's zero copy sendpage method, - if (page_count(page) >= 1 && !PageSlab(page)) - -This check is exactly what sendpage_ok() does. This patch replace the -open coded checks by sendpage_ok() as a code cleanup. - -Signed-off-by: Coly Li <colyli@suse.de> -Cc: Ilya Dryomov <idryomov@gmail.com> -Cc: Jeff Layton <jlayton@kernel.org> ---- - net/ceph/messenger.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c -index 27d6ab11f9ee..6a349da7f013 100644 ---- a/net/ceph/messenger.c -+++ b/net/ceph/messenger.c -@@ -575,7 +575,7 @@ static int ceph_tcp_sendpage(struct socket *sock, struct page *page, - * coalescing neighboring slab objects into a single frag which - * triggers one of hardened usercopy checks. - */ -- if (page_count(page) >= 1 && !PageSlab(page)) -+ if (sendpage_ok(page)) - sendpage = sock->ops->sendpage; - else - sendpage = sock_no_sendpage; --- -2.26.2 - diff --git a/for-test/0001-bcache-fix-race-between-setting-bdev-state-to-none-a.patch b/for-test/0001-bcache-fix-race-between-setting-bdev-state-to-none-a.patch new file mode 100644 index 0000000..ff2fbfd --- /dev/null +++ b/for-test/0001-bcache-fix-race-between-setting-bdev-state-to-none-a.patch @@ -0,0 +1,78 @@ +From 11cec1608f70962f62b8d5e034745c32597ea503 Mon Sep 17 00:00:00 2001 +From: Dongsheng Yang <dongsheng.yang@easystack.cn> +Date: Wed, 14 Oct 2020 07:46:54 +0000 +Subject: [PATCH] bcache: fix race between setting bdev state to none and new + write request direct to backing + +There is a race condition in detaching as below: +A. detaching B. Write request +(1) writing back +(2) write back done, set bdev state to clean. +(3) cached_dev_put() and schedule_work(&dc->detach); + (4) write data [0 - 4K] directly into backing and ack to user. +(5) power-failure... + +When we restart this bcache device, this bdev is clean but not detached, and read [0 - 4K], +we will get unexpected old data from cache device. + +To fix this problem, set the bdev state to none when we writeback done in detaching, +and then if power-failure happend as above, the data in cache will not be used in next +bcache device starting, it's detached, we will read the correct data from backing derectly. + +Signed-off-by: Dongsheng Yang <dongsheng.yang@easystack.cn> +Signed-off-by: Coly Li <colyli@suse.de> +--- + drivers/md/bcache/super.c | 9 --------- + drivers/md/bcache/writeback.c | 9 +++++++++ + 2 files changed, 9 insertions(+), 9 deletions(-) + +diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c +index 46a00134a36a..b1a6ba9a5adb 100644 +--- a/drivers/md/bcache/super.c ++++ b/drivers/md/bcache/super.c +@@ -1114,9 +1114,6 @@ static void cancel_writeback_rate_update_dwork(struct cached_dev *dc) + static void cached_dev_detach_finish(struct work_struct *w) + { + struct cached_dev *dc = container_of(w, struct cached_dev, detach); +- struct closure cl; +- +- closure_init_stack(&cl); + + BUG_ON(!test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags)); + BUG_ON(refcount_read(&dc->count)); +@@ -1130,12 +1127,6 @@ static void cached_dev_detach_finish(struct work_struct *w) + dc->writeback_thread = NULL; + } + +- memset(&dc->sb.set_uuid, 0, 16); +- SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE); +- +- bch_write_bdev_super(dc, &cl); +- closure_sync(&cl); +- + mutex_lock(&bch_register_lock); + + calc_cached_dev_sectors(dc->disk.c); +diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c +index 3c74996978da..a129e4d2707c 100644 +--- a/drivers/md/bcache/writeback.c ++++ b/drivers/md/bcache/writeback.c +@@ -705,6 +705,15 @@ static int bch_writeback_thread(void *arg) + * bch_cached_dev_detach(). + */ + if (test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags)) { ++ struct closure cl; ++ ++ closure_init_stack(&cl); ++ memset(&dc->sb.set_uuid, 0, 16); ++ SET_BDEV_STATE(&dc->sb, BDEV_STATE_NONE); ++ ++ bch_write_bdev_super(dc, &cl); ++ closure_sync(&cl); ++ + up_write(&dc->writeback_lock); + break; + } +-- +2.26.2 + |