From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Joe Thornber <ejt@redhat.com>, Mike Snitzer <snitzer@redhat.com>,
Sasha Levin <sashal@kernel.org>,
dm-devel@redhat.com
Subject: [PATCH AUTOSEL 4.9 15/35] dm space maps: don't reset space map allocation cursor when committing
Date: Tue, 6 Jul 2021 07:28:27 -0400 [thread overview]
Message-ID: <20210706112848.2066036-15-sashal@kernel.org> (raw)
In-Reply-To: <20210706112848.2066036-1-sashal@kernel.org>
From: Joe Thornber <ejt@redhat.com>
[ Upstream commit 5faafc77f7de69147d1e818026b9a0cbf036a7b2 ]
Current commit code resets the place where the search for free blocks
will begin back to the start of the metadata device. There are a couple
of repercussions to this:
- The first allocation after the commit is likely to take longer than
normal as it searches for a free block in an area that is likely to
have very few free blocks (if any).
- Any free blocks it finds will have been recently freed. Reusing them
means we have fewer old copies of the metadata to aid recovery from
hardware error.
Fix these issues by leaving the cursor alone, only resetting when the
search hits the end of the metadata device.
Signed-off-by: Joe Thornber <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/md/persistent-data/dm-space-map-disk.c | 9 ++++++++-
drivers/md/persistent-data/dm-space-map-metadata.c | 9 ++++++++-
2 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/drivers/md/persistent-data/dm-space-map-disk.c b/drivers/md/persistent-data/dm-space-map-disk.c
index bf4c5e2ccb6f..e0acae7a3815 100644
--- a/drivers/md/persistent-data/dm-space-map-disk.c
+++ b/drivers/md/persistent-data/dm-space-map-disk.c
@@ -171,6 +171,14 @@ static int sm_disk_new_block(struct dm_space_map *sm, dm_block_t *b)
* Any block we allocate has to be free in both the old and current ll.
*/
r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, smd->begin, smd->ll.nr_blocks, b);
+ if (r == -ENOSPC) {
+ /*
+ * There's no free block between smd->begin and the end of the metadata device.
+ * We search before smd->begin in case something has been freed.
+ */
+ r = sm_ll_find_common_free_block(&smd->old_ll, &smd->ll, 0, smd->begin, b);
+ }
+
if (r)
return r;
@@ -199,7 +207,6 @@ static int sm_disk_commit(struct dm_space_map *sm)
return r;
memcpy(&smd->old_ll, &smd->ll, sizeof(smd->old_ll));
- smd->begin = 0;
smd->nr_allocated_this_transaction = 0;
r = sm_disk_get_nr_free(sm, &nr_free);
diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c
index 967d8f2a731f..62a4d7da9bd9 100644
--- a/drivers/md/persistent-data/dm-space-map-metadata.c
+++ b/drivers/md/persistent-data/dm-space-map-metadata.c
@@ -451,6 +451,14 @@ static int sm_metadata_new_block_(struct dm_space_map *sm, dm_block_t *b)
* Any block we allocate has to be free in both the old and current ll.
*/
r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, smm->begin, smm->ll.nr_blocks, b);
+ if (r == -ENOSPC) {
+ /*
+ * There's no free block between smm->begin and the end of the metadata device.
+ * We search before smm->begin in case something has been freed.
+ */
+ r = sm_ll_find_common_free_block(&smm->old_ll, &smm->ll, 0, smm->begin, b);
+ }
+
if (r)
return r;
@@ -502,7 +510,6 @@ static int sm_metadata_commit(struct dm_space_map *sm)
return r;
memcpy(&smm->old_ll, &smm->ll, sizeof(smm->old_ll));
- smm->begin = 0;
smm->allocated_this_transaction = 0;
return 0;
--
2.30.2
next prev parent reply other threads:[~2021-07-06 12:02 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-06 11:28 [PATCH AUTOSEL 4.9 01/35] net: pch_gbe: Use proper accessors to BE data in pch_ptp_match() Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 02/35] hugetlb: clear huge pte during flush function on mips platform Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 03/35] atm: iphase: fix possible use-after-free in ia_module_exit() Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 04/35] mISDN: fix possible use-after-free in HFC_cleanup() Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 05/35] atm: nicstar: Fix possible use-after-free in nicstar_cleanup() Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 06/35] net: Treat __napi_schedule_irqoff() as __napi_schedule() on PREEMPT_RT Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 07/35] reiserfs: add check for invalid 1st journal block Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 08/35] drm/virtio: Fixes a potential NULL pointer dereference on probe failure Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 09/35] drm/virtio: Fix double free " Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 10/35] udf: Fix NULL pointer dereference in udf_symlink function Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 11/35] e100: handle eeprom as little endian Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 12/35] clk: tegra: Ensure that PLLU configuration is applied properly Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 13/35] ipv6: use prandom_u32() for ID generation Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 14/35] RDMA/cxgb4: Fix missing error code in create_qp() Sasha Levin
2021-07-06 11:28 ` Sasha Levin [this message]
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 16/35] net: micrel: check return value after calling platform_get_resource() Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 17/35] net: moxa: Use devm_platform_get_and_ioremap_resource() Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 18/35] fjes: check return value after calling platform_get_resource() Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 19/35] selinux: use __GFP_NOWARN with GFP_NOWAIT in the AVC Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 20/35] xfrm: Fix error reporting in xfrm_state_construct Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 21/35] wlcore/wl12xx: Fix wl12xx get_mac error if device is in ELP Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 22/35] wl1251: Fix possible buffer overflow in wl1251_cmd_scan Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 23/35] cw1200: add missing MODULE_DEVICE_TABLE Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 24/35] MIPS: add PMD table accounting into MIPS'pmd_alloc_one Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 25/35] atm: nicstar: use 'dma_free_coherent' instead of 'kfree' Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 26/35] atm: nicstar: register the interrupt handler in the right place Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 27/35] RDMA/rxe: Don't overwrite errno from ib_umem_get() Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 28/35] sfc: avoid double pci_remove of VFs Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 29/35] sfc: error code if SRIOV cannot be disabled Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 30/35] wireless: wext-spy: Fix out-of-bounds warning Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 31/35] RDMA/cma: Fix rdma_resolve_route() memory leak Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 32/35] Bluetooth: Fix the HCI to MGMT status conversion table Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 33/35] Bluetooth: Shutdown controller after workqueues are flushed or cancelled Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 34/35] Bluetooth: btusb: fix bt fiwmare downloading failure issue for qca btsoc Sasha Levin
2021-07-06 11:28 ` [PATCH AUTOSEL 4.9 35/35] sctp: add size validation when walking chunks Sasha Levin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210706112848.2066036-15-sashal@kernel.org \
--to=sashal@kernel.org \
--cc=dm-devel@redhat.com \
--cc=ejt@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=snitzer@redhat.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox