Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3768442pxv; Mon, 19 Jul 2021 08:18:23 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyh/nHeK2c+mlrQZG+UHqZAhXsjcVMFCev+bWxqi3jSw2eq7w9kM2K3qfVNl5jLyWS602Xy X-Received: by 2002:a17:906:4551:: with SMTP id s17mr26935297ejq.26.1626707903133; Mon, 19 Jul 2021 08:18:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626707903; cv=none; d=google.com; s=arc-20160816; b=NOFchPhlT3XwF+8qQOwgooL2qEiYIhqlQammaMHxkOpknolj5V/8IZ644erBsG6Vre UGjJxsbJt9w470m949r0T16hZABqNe97RjEAQ7ES29VeD3pb2Bvh36cWndv8jgMTHqE3 Hq6FnT2nSZSKpmH3ywgCbc3yCSuS/gv2ZJjoSJtVkAF1qbNmyyq3IXsdGW6FBJLzESRr QBYpy1gMm0H7W4JJe6qFNvZqoduJ8sW3W05TU0yd4a42KpgTy1FzkCSB27XPo/0yZ1sT 8lwhvjvus0VPyw7z+FpVhSTjHz5GnWBxEFXAOx6ytFEVEaaNZLzqWC7YxEEr7ACGHVKk X2Ag== 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=RoOa4w3WYtiX5EDxk+A+d/3EXRBLTdQA4TDt8jJJCVQjyxSqYTxZjIYa8s28XJB0WR C0coiPG14dsVybgz6xtJ2SSbUc4YoNh15nrx0XnRG3T2+Z+IQHIIRd2R1VqnTgA0f6oQ oVvxVomzHX2ZBDNuW7q4q9qRqQXyEpUPzDpqn7emRNxIw4zbA3mnO9xobHD3iIkl3w5x /nC/S/zVYlOkNhDusUd7b0nzRtmMXW/Q801K9Txs/pQRgwajuDVN7Dpv9svreC6xbrU3 6DwpQP7pximRGuO3po4nvzdDBYrGdBh5TE0AWPf3Eea6imL2TYxFxhfeJ6Rg0KiSe3Tg RpjA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=zDa6BrJC; 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 c7si21182933edw.273.2021.07.19.08.18.00; Mon, 19 Jul 2021 08:18:23 -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=zDa6BrJC; 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 S244654AbhGSOgW (ORCPT + 99 others); Mon, 19 Jul 2021 10:36:22 -0400 Received: from mail.kernel.org ([198.145.29.99]:40420 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S244628AbhGSO3y (ORCPT ); Mon, 19 Jul 2021 10:29:54 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 52B486024A; Mon, 19 Jul 2021 15:10:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626707413; bh=ETxWTFrPy6RHA/XYbcx8W2DT0j29TsA9wcVhITPA1/s=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=zDa6BrJCm16BOEY4Op5gSHCxFOryl0n8keL/ahJiFnAnkJsdTXe25lb5UOvEnv6BA 3JuV6blndayfboXcSImCVF0aoHiDw+Ky5clZQvB3qnYcQ2e4iOG6b0KlDZe+y6q/mm Tp8DExDkoZL5m3n26qdaCtxZek/4dbw8F8zDUDHM= 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.9 137/245] dm space maps: dont reset space map allocation cursor when committing Date: Mon, 19 Jul 2021 16:51:19 +0200 Message-Id: <20210719144944.832076089@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210719144940.288257948@linuxfoundation.org> References: <20210719144940.288257948@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