aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorColy Li <colyli@suse.de>2020-11-12 12:41:21 +0800
committerColy Li <colyli@suse.de>2020-11-12 12:41:21 +0800
commit17ca25a1fcc1fb9d06263bec8e989ef97bb4b017 (patch)
treedff0df60ba8d6b24883bdc519302424fbdb8baee
parent158ccc42daa1b97cf472ded4677d2618cb63f542 (diff)
downloadbcache-patches-17ca25a1fcc1fb9d06263bec8e989ef97bb4b017.tar.gz
for-test: add 0001-bcache-fix-race-between-setting-bdev-state-to-none-a.patch
-rw-r--r--for-next/0002-bcache-check-c-root-with-IS_ERR_OR_NULL-in-mca_reser.patch9
-rw-r--r--for-next/nvme-tcp/v7-0000-cover-letter.patch81
-rw-r--r--for-next/nvme-tcp/v7-0001-net-introduce-helper-sendpage_ok-in-include-linux.patch75
-rw-r--r--for-next/nvme-tcp/v7-0002-nvme-tcp-check-page-by-sendpage_ok-before-calling.patch57
-rw-r--r--for-next/nvme-tcp/v7-0003-tcp-use-sendpage_ok-to-detect-misused-.sendpage.patch44
-rw-r--r--for-next/nvme-tcp/v7-0004-drbd-code-cleanup-by-using-sendpage_ok-to-check-p.patch42
-rw-r--r--for-next/nvme-tcp/v7-0005-scsi-libiscsi-use-sendpage_ok-in-iscsi_tcp_segmen.patch45
-rw-r--r--for-next/nvme-tcp/v7-0006-libceph-use-sendpage_ok-in-ceph_tcp_sendpage.patch35
-rw-r--r--for-test/0001-bcache-fix-race-between-setting-bdev-state-to-none-a.patch78
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
+