Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3755008pxv; Mon, 19 Jul 2021 08:02:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw1LjCBcGPkju7pl5F8wowa+cATo0ddID4pvPGFom5VKfEUZYVmOEwMfjz1Jnj0LCR+RC/G X-Received: by 2002:a92:d141:: with SMTP id t1mr16970732ilg.171.1626706938927; Mon, 19 Jul 2021 08:02:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626706938; cv=none; d=google.com; s=arc-20160816; b=H4/+MImgoA7p/voddq3Fb3rWKJGDj8GLEQZPnS3+U/3cyhmyHyScBoakVA4Nxuguyb ueJrBgEtnRDbJ2LsOwKlY4yjiSDAi0Ih8cU85LF3BaExOoKzBxGo9nxMjQp5qNr6TV7J JbpvjZUY/LgTENC38Cl4/FtYYx9tmkXEwbXQR6udK2ODgixH7MjcQiA9T9ZFkz/jtotb dZ28voP1lsROQULsQkApJCVhktFfioyrF2C24k3KGfJYpp5tOrilWQk44sCKPmYaSMq7 F30AesPtUmS7Tu7IbHX5cKftUbf7pvJjM7ljtpyS4m8jnPi1lVFUsK8Mwrd8lpXt2bVy 6sqw== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=TUZsEdGIJ8mGyA6MLP2sf6inAImLxx44KUP/cdIyMyQ=; b=qkveLnIGzV3esrHnVPz+1Fl3RIj5Ki5ckTvL1ZTZUfJpfasWQ3Yt7ol6O5q5k/FyDy 4G9X/COiNu8QxxmbMUS9rCM/cNDr80vD5P6ijtRii3GFh5Q42FmQ7lJB3NYTvKkYbCAg L+McPMpCcTnJN1TbQpWKmwxO3YkRnhv5mJKlNQkCuQMMlFEynN98FfpJczB0Vo3x4OTz yunzDWlS9xWF5aKIAgENc5oRaj10C2nhfUo/E0pWsBmUcWEhfswS2NYVD6ZKsOu7UkEN pD9jJrtjBUSuF5UaD2zsyYaCgUPZXyxysQlZbQziQ2QSuYsLSwZcUk+0WvkQhJMU6kuK qiJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=oID1sm6V; 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=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id q3si9638444iob.0.2021.07.19.08.02.05; Mon, 19 Jul 2021 08:02:18 -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=@linuxfoundation.org header.s=korg header.b=oID1sm6V; 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=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S242783AbhGSOUs (ORCPT + 99 others); Mon, 19 Jul 2021 10:20:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:55086 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S242107AbhGSOT3 (ORCPT ); Mon, 19 Jul 2021 10:19:29 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id A97D361002; Mon, 19 Jul 2021 15:00:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626706809; bh=ETxWTFrPy6RHA/XYbcx8W2DT0j29TsA9wcVhITPA1/s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=oID1sm6VPLpkm5x/HzA1i7LFqFT20WzwHSjvUMoQUpATuChvWGzuKDjppCW3/uPpr A3w8ugRrcS9FgS0pIrXCnXErcgm4Q00hLMC5cGZqTb+dbuAnZL3C02GjaGshRG3M+e kmRDHA3SoptxkHJwXNGxkxWes9cgVh7zT+8f9NVs= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Joe Thornber , Mike Snitzer , Sasha Levin Subject: [PATCH 4.4 106/188] dm space maps: dont reset space map allocation cursor when committing Date: Mon, 19 Jul 2021 16:51:30 +0200 Message-Id: <20210719144937.830280769@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210719144913.076563739@linuxfoundation.org> References: <20210719144913.076563739@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 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 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