Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp4573015pxv; Tue, 6 Jul 2021 04:23:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwt8lLOiYIekxIB53MUpGyvvD8SmXsWocoSub1d6sfXMO6F2ApouLIU/GfpmTgSTF8BbQ6t X-Received: by 2002:a17:907:9496:: with SMTP id dm22mr8796144ejc.9.1625570586707; Tue, 06 Jul 2021 04:23:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625570586; cv=none; d=google.com; s=arc-20160816; b=bFHQf5x865PxkXpeFIsnMX2DCO697Nel1ubvrCmUUmpF0FH+BZKCS0rmrZ+CxBHq0z aufYnhxSQ5hlOEyeN3ctRKHYqoILQ5e9jqFB2tLjqVuX9pMWHvsCw5kgHeMOyZavbrdn BATnQ1dmj+wMl6fvQWoxUEagAS8eUTfy3Uwg1JlBbkJCCsk06LDJBauvfsjcpi3VH6WZ v/KEv8o9WgANR7AMlnETgFRtypUAXVoiV5QJuhYJg41fBYzyH/Jf50AbehzFIhzMz06M 1gEK2bwK8ZMPmXBnNRV40oCZi5mi5U9AQtv5ynsIy/+56L+UJyY+ZwocP6fmTms8Q2qY y4eg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=hhX1eLRP7enoPIAlF6fv807ooHPa9VNcKX8/s22a8VQ=; b=vtdHp15g7XfY4csDj7y3q6mqh2KZKvBdRHB5HV3WSCcMz2DYr34mvanYotlBeQ3Roq hN7vDyEqe/6LIhy2S/p0qkuRmM3lYCT6e4uTVNGbplaBpOAtDndBUcxnujqct1G1xsp6 nxtvKq04AJrD7igJdr34knYVNybkDNsWLEb5C++aztEb7j4OeAQy57wF8VriLiQ3/5cm hXbyMeBookQ8eZ7tLls6OOw64Eio9T2ntbsLF57m5bq/goY6dRfg9aI0Kp/Y8w/ZLKHU /JHN18/lTDZnKRcOdeg9uNK8AfFRurO9a2GFbqdoL23P2aWVVZAAzEIfA7fFdKwDeuam SZXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=fYHbjeIf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dn8si2797288ejc.48.2021.07.06.04.22.43; Tue, 06 Jul 2021 04:23:06 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=fYHbjeIf; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234191AbhGFLX5 (ORCPT + 99 others); Tue, 6 Jul 2021 07:23:57 -0400 Received: from mail.kernel.org ([198.145.29.99]:54440 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232542AbhGFLS3 (ORCPT ); Tue, 6 Jul 2021 07:18:29 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id C93DE61C28; Tue, 6 Jul 2021 11:15:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1625570151; bh=shD/dtpzmLlRN3eevtwaao4gYZqp1iic4C5S5c6TrC0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=fYHbjeIfX1Vbpu7dzd73KQmVapjH2UYyvkXEbcvtPYFsPxe9um+GGHkAi3fg/uFwp YWrpHvDuF3WoDlM+Fh/bzVHz5hLDVN3KQlHJA/9MzbELxprvUggAb16zqJEhhg0tKk QGYO662v37FuhKHkpXFI7YT1JV5gCs8RYUD9kFUSqn9BjbEE+58fGOkeZIgi2zSGFm y4iqbwh1LVKN1dlPggg9DKVKOv2TAxdXBHcOj2CsQLEXrZYf8r9nsCRIJ6LNrjPVYo HGtTj1xfKLcOygD57YzROS8uHcBPLeZJzfp806e8vdmKg8PaZJdmBZTd96n90EF5Vl h1Dut0d4qTLOg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Joe Thornber , Mike Snitzer , Sasha Levin , dm-devel@redhat.com Subject: [PATCH AUTOSEL 5.13 074/189] dm space maps: don't reset space map allocation cursor when committing Date: Tue, 6 Jul 2021 07:12:14 -0400 Message-Id: <20210706111409.2058071-74-sashal@kernel.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210706111409.2058071-1-sashal@kernel.org> References: <20210706111409.2058071-1-sashal@kernel.org> MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Joe Thornber [ 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 Signed-off-by: Mike Snitzer Signed-off-by: Sasha Levin --- 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 61f56909e00b..4f8069bb0481 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; @@ -194,7 +202,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; return 0; diff --git a/drivers/md/persistent-data/dm-space-map-metadata.c b/drivers/md/persistent-data/dm-space-map-metadata.c index 9e3c64ec2026..da439ac85796 100644 --- a/drivers/md/persistent-data/dm-space-map-metadata.c +++ b/drivers/md/persistent-data/dm-space-map-metadata.c @@ -452,6 +452,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; @@ -503,7 +511,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