From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3F8AA1B983F; Mon, 7 Jul 2025 01:32:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851963; cv=none; b=JDDe6L24G7uW27KphYbdF7R0hwPlE4+jgxnM7E3Ll3gdIYIKWplsIE3zVLS8hKyeZJ4RHTD5+WESWG0YDAqSjGY5oHdebE6EMHlfWPebWMWndSHS589JJsqvlPOhdwgpWu5Pu01+f/WED9iI0zWzez5+V+GZoe0osArPzrCJ7CY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851963; c=relaxed/simple; bh=MidPMLWlgoLJE4H68Ndj32hIGOHlav/sP+7iUTFZVt0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TRlH/XmVKdvdEP7NFSFHGdEe0or9oLItDnE19vZ20HeULM6NRF5JfXBq5+Mn3DnUrKkydaxe/EnyQefHos1HuZwq1ASfxEzPV8Xo42NG+UbMA9m+C3d/o/3fLei8p8Q83JZbkGbe4Ypls5iSI34qFcrmsjNvnssz5NfHSZyPF7s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dl3g9dzYQtrm; Mon, 7 Jul 2025 09:32:39 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 57BC51A1239; Mon, 7 Jul 2025 09:32:38 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S5; Mon, 07 Jul 2025 09:32:38 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 01/15] md/raid1: change r1conf->r1bio_pool to a pointer type Date: Mon, 7 Jul 2025 09:26:57 +0800 Message-Id: <20250707012711.376844-2-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S5 X-Coremail-Antispam: 1UD129KBjvJXoWxtF1xCr17WrWkAw43trWfGrg_yoW7WFWxpa 13X3s3Gr4UZrZ3Cr4UJF4DuFyFv3ZagFWxtFWxJa1FvFnYqryrX3WUCry5GryqvFWkKrsr JF98trZxZF17trJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUm014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jr4l82xGYIkIc2 x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2kIc2 xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWU JVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67 kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY 6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0x vEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVj vjDU0xZFpf9x0JU4OJ5UUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai In raid1_reshape(), newpool is a stack variable. mempool_init() initializes newpool->wait with the stack address. After assigning newpool to conf->r1bio_pool, the wait queue need to be reinitialized, which is not ideal. Change raid1_conf->r1bio_pool to a pointer type and replace mempool_init() with mempool_create_kmalloc_pool() to avoid referencing a stack-based wait queue. Signed-off-by: Wang Jinchao Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/raid1.c | 39 ++++++++++++++++++--------------------- drivers/md/raid1.h | 2 +- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index fd4ce2a4136f..8249cbb89fec 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -255,7 +255,7 @@ static void free_r1bio(struct r1bio *r1_bio) struct r1conf *conf =3D r1_bio->mddev->private; =20 put_all_bios(conf, r1_bio); - mempool_free(r1_bio, &conf->r1bio_pool); + mempool_free(r1_bio, conf->r1bio_pool); } =20 static void put_buf(struct r1bio *r1_bio) @@ -1305,9 +1305,8 @@ alloc_r1bio(struct mddev *mddev, struct bio *bio) struct r1conf *conf =3D mddev->private; struct r1bio *r1_bio; =20 - r1_bio =3D mempool_alloc(&conf->r1bio_pool, GFP_NOIO); - /* Ensure no bio records IO_BLOCKED */ - memset(r1_bio->bios, 0, conf->raid_disks * sizeof(r1_bio->bios[0])); + r1_bio =3D mempool_alloc(conf->r1bio_pool, GFP_NOIO); + memset(r1_bio, 0, offsetof(struct r1bio, bios[conf->raid_disks * 2])); init_r1bio(r1_bio, mddev, bio); return r1_bio; } @@ -3084,6 +3083,7 @@ static struct r1conf *setup_conf(struct mddev *mddev) int i; struct raid1_info *disk; struct md_rdev *rdev; + size_t r1bio_size; int err =3D -ENOMEM; =20 conf =3D kzalloc(sizeof(struct r1conf), GFP_KERNEL); @@ -3124,9 +3124,10 @@ static struct r1conf *setup_conf(struct mddev *mddev) if (!conf->poolinfo) goto abort; conf->poolinfo->raid_disks =3D mddev->raid_disks * 2; - err =3D mempool_init(&conf->r1bio_pool, NR_RAID_BIOS, r1bio_pool_alloc, - rbio_pool_free, conf->poolinfo); - if (err) + + r1bio_size =3D offsetof(struct r1bio, bios[mddev->raid_disks * 2]); + conf->r1bio_pool =3D mempool_create_kmalloc_pool(NR_RAID_BIOS, r1bio_size= ); + if (!conf->r1bio_pool) goto abort; =20 err =3D bioset_init(&conf->bio_split, BIO_POOL_SIZE, 0, 0); @@ -3197,7 +3198,7 @@ static struct r1conf *setup_conf(struct mddev *mddev) =20 abort: if (conf) { - mempool_exit(&conf->r1bio_pool); + mempool_destroy(conf->r1bio_pool); kfree(conf->mirrors); safe_put_page(conf->tmppage); kfree(conf->poolinfo); @@ -3310,7 +3311,7 @@ static void raid1_free(struct mddev *mddev, void *pri= v) { struct r1conf *conf =3D priv; =20 - mempool_exit(&conf->r1bio_pool); + mempool_destroy(conf->r1bio_pool); kfree(conf->mirrors); safe_put_page(conf->tmppage); kfree(conf->poolinfo); @@ -3366,17 +3367,14 @@ static int raid1_reshape(struct mddev *mddev) * At the same time, we "pack" the devices so that all the missing * devices have the higher raid_disk numbers. */ - mempool_t newpool, oldpool; + mempool_t *newpool, *oldpool; struct pool_info *newpoolinfo; + size_t new_r1bio_size; struct raid1_info *newmirrors; struct r1conf *conf =3D mddev->private; int cnt, raid_disks; unsigned long flags; int d, d2; - int ret; - - memset(&newpool, 0, sizeof(newpool)); - memset(&oldpool, 0, sizeof(oldpool)); =20 /* Cannot change chunk_size, layout, or level */ if (mddev->chunk_sectors !=3D mddev->new_chunk_sectors || @@ -3408,18 +3406,18 @@ static int raid1_reshape(struct mddev *mddev) newpoolinfo->mddev =3D mddev; newpoolinfo->raid_disks =3D raid_disks * 2; =20 - ret =3D mempool_init(&newpool, NR_RAID_BIOS, r1bio_pool_alloc, - rbio_pool_free, newpoolinfo); - if (ret) { + new_r1bio_size =3D offsetof(struct r1bio, bios[raid_disks * 2]); + newpool =3D mempool_create_kmalloc_pool(NR_RAID_BIOS, new_r1bio_size); + if (!newpool) { kfree(newpoolinfo); - return ret; + return -ENOMEM; } newmirrors =3D kzalloc(array3_size(sizeof(struct raid1_info), raid_disks, 2), GFP_KERNEL); if (!newmirrors) { kfree(newpoolinfo); - mempool_exit(&newpool); + mempool_destroy(newpool); return -ENOMEM; } =20 @@ -3428,7 +3426,6 @@ static int raid1_reshape(struct mddev *mddev) /* ok, everything is stopped */ oldpool =3D conf->r1bio_pool; conf->r1bio_pool =3D newpool; - init_waitqueue_head(&conf->r1bio_pool.wait); =20 for (d =3D d2 =3D 0; d < conf->raid_disks; d++) { struct md_rdev *rdev =3D conf->mirrors[d].rdev; @@ -3460,7 +3457,7 @@ static int raid1_reshape(struct mddev *mddev) set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); md_wakeup_thread(mddev->thread); =20 - mempool_exit(&oldpool); + mempool_destroy(oldpool); return 0; } =20 diff --git a/drivers/md/raid1.h b/drivers/md/raid1.h index 33f318fcc268..652c347b1a70 100644 --- a/drivers/md/raid1.h +++ b/drivers/md/raid1.h @@ -118,7 +118,7 @@ struct r1conf { * mempools - it changes when the array grows or shrinks */ struct pool_info *poolinfo; - mempool_t r1bio_pool; + mempool_t *r1bio_pool; mempool_t r1buf_pool; =20 struct bio_set bio_split; --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F2A111EB9F2; Mon, 7 Jul 2025 01:32:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851964; cv=none; b=Z/lQdEEdlgZyNPgwYVQ6PB8KNLWvv6b1VUlYbU+R1p41IXuOX78FeP4PpCknBNhnmNi7SH2G364fEkjRBQECdGnfp5+CbcyT9hxtO8TaxGpJdSBcs/eE7OXIfUVLwKeyPxlMjmtksHwvi4ygGNamdOVJG3RdLsca04XhO1X5vME= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851964; c=relaxed/simple; bh=PxYJXAj9m/swhM5aTKx6c87k0wGPrha0EvV/hJPHspc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=hB02ewMPTY+P6N5ydlBRYZEDKGxZHLxXvMb7NoguEihqaz+Lwl7aCKw2/6y7V9pcfilmotnf2flpn8gHUKEX2ymp0AKBDUECHbcYlfLCnhMpO7uIvUZhl99OX7SWBE7/8jVKRPytmSzVPQEjInmm0xHIgbCz+BjMMlBYwJ/2UVQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dm0LB2zYQtrm; Mon, 7 Jul 2025 09:32:40 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id D60101A0FBA; Mon, 7 Jul 2025 09:32:38 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S6; Mon, 07 Jul 2025 09:32:38 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 02/15] md/raid1: remove struct pool_info and related code Date: Mon, 7 Jul 2025 09:26:58 +0800 Message-Id: <20250707012711.376844-3-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S6 X-Coremail-Antispam: 1UD129KBjvJXoW3JryDCw4xGrW3XFy8Zr1rtFb_yoW3Cr43pa 13Was3ZF4UXrZ3WrWkJF4DuFWY9w4xWay8GFs7Ga1FvF9aqr9aqa1jyFyFgry8ZrZ8Kw1D AFn8trW3AF1UKrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUm014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jryl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2kIc2 xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWU JVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67 kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY 6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0x vEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVj vjDU0xZFpf9x0JUQXo7UUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai The struct pool_info was originally introduced mainly to support reshape operations, serving as a parameter for mempool_init() when raid_disks changes. Now that mempool_create_kmalloc_pool() is sufficient for this purpose, struct pool_info and its related code are no longer needed. Remove struct pool_info and all associated code. Signed-off-by: Wang Jinchao Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/raid1.c | 49 +++++++++++++--------------------------------- drivers/md/raid1.h | 20 ------------------- 2 files changed, 14 insertions(+), 55 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 8249cbb89fec..3a31e230727c 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -127,10 +127,9 @@ static inline struct r1bio *get_resync_r1bio(struct bi= o *bio) return get_resync_pages(bio)->raid_bio; } =20 -static void * r1bio_pool_alloc(gfp_t gfp_flags, void *data) +static void *r1bio_pool_alloc(gfp_t gfp_flags, struct r1conf *conf) { - struct pool_info *pi =3D data; - int size =3D offsetof(struct r1bio, bios[pi->raid_disks]); + int size =3D offsetof(struct r1bio, bios[conf->raid_disks * 2]); =20 /* allocate a r1bio with room for raid_disks entries in the bios array */ return kzalloc(size, gfp_flags); @@ -145,18 +144,18 @@ static void * r1bio_pool_alloc(gfp_t gfp_flags, void = *data) =20 static void * r1buf_pool_alloc(gfp_t gfp_flags, void *data) { - struct pool_info *pi =3D data; + struct r1conf *conf =3D data; struct r1bio *r1_bio; struct bio *bio; int need_pages; int j; struct resync_pages *rps; =20 - r1_bio =3D r1bio_pool_alloc(gfp_flags, pi); + r1_bio =3D r1bio_pool_alloc(gfp_flags, conf); if (!r1_bio) return NULL; =20 - rps =3D kmalloc_array(pi->raid_disks, sizeof(struct resync_pages), + rps =3D kmalloc_array(conf->raid_disks * 2, sizeof(struct resync_pages), gfp_flags); if (!rps) goto out_free_r1bio; @@ -164,7 +163,7 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *d= ata) /* * Allocate bios : 1 for reading, n-1 for writing */ - for (j =3D pi->raid_disks ; j-- ; ) { + for (j =3D conf->raid_disks * 2; j-- ; ) { bio =3D bio_kmalloc(RESYNC_PAGES, gfp_flags); if (!bio) goto out_free_bio; @@ -177,11 +176,11 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void = *data) * If this is a user-requested check/repair, allocate * RESYNC_PAGES for each bio. */ - if (test_bit(MD_RECOVERY_REQUESTED, &pi->mddev->recovery)) - need_pages =3D pi->raid_disks; + if (test_bit(MD_RECOVERY_REQUESTED, &conf->mddev->recovery)) + need_pages =3D conf->raid_disks * 2; else need_pages =3D 1; - for (j =3D 0; j < pi->raid_disks; j++) { + for (j =3D 0; j < conf->raid_disks * 2; j++) { struct resync_pages *rp =3D &rps[j]; =20 bio =3D r1_bio->bios[j]; @@ -207,7 +206,7 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void *d= ata) resync_free_pages(&rps[j]); =20 out_free_bio: - while (++j < pi->raid_disks) { + while (++j < conf->raid_disks * 2) { bio_uninit(r1_bio->bios[j]); kfree(r1_bio->bios[j]); } @@ -220,12 +219,12 @@ static void * r1buf_pool_alloc(gfp_t gfp_flags, void = *data) =20 static void r1buf_pool_free(void *__r1_bio, void *data) { - struct pool_info *pi =3D data; + struct r1conf *conf =3D data; int i; struct r1bio *r1bio =3D __r1_bio; struct resync_pages *rp =3D NULL; =20 - for (i =3D pi->raid_disks; i--; ) { + for (i =3D conf->raid_disks * 2; i--; ) { rp =3D get_resync_pages(r1bio->bios[i]); resync_free_pages(rp); bio_uninit(r1bio->bios[i]); @@ -2745,7 +2744,7 @@ static int init_resync(struct r1conf *conf) BUG_ON(mempool_initialized(&conf->r1buf_pool)); =20 return mempool_init(&conf->r1buf_pool, buffs, r1buf_pool_alloc, - r1buf_pool_free, conf->poolinfo); + r1buf_pool_free, conf); } =20 static struct r1bio *raid1_alloc_init_r1buf(struct r1conf *conf) @@ -2755,7 +2754,7 @@ static struct r1bio *raid1_alloc_init_r1buf(struct r1= conf *conf) struct bio *bio; int i; =20 - for (i =3D conf->poolinfo->raid_disks; i--; ) { + for (i =3D conf->raid_disks * 2; i--; ) { bio =3D r1bio->bios[i]; rps =3D bio->bi_private; bio_reset(bio, NULL, 0); @@ -3120,11 +3119,6 @@ static struct r1conf *setup_conf(struct mddev *mddev) if (!conf->tmppage) goto abort; =20 - conf->poolinfo =3D kzalloc(sizeof(*conf->poolinfo), GFP_KERNEL); - if (!conf->poolinfo) - goto abort; - conf->poolinfo->raid_disks =3D mddev->raid_disks * 2; - r1bio_size =3D offsetof(struct r1bio, bios[mddev->raid_disks * 2]); conf->r1bio_pool =3D mempool_create_kmalloc_pool(NR_RAID_BIOS, r1bio_size= ); if (!conf->r1bio_pool) @@ -3134,8 +3128,6 @@ static struct r1conf *setup_conf(struct mddev *mddev) if (err) goto abort; =20 - conf->poolinfo->mddev =3D mddev; - err =3D -EINVAL; spin_lock_init(&conf->device_lock); conf->raid_disks =3D mddev->raid_disks; @@ -3201,7 +3193,6 @@ static struct r1conf *setup_conf(struct mddev *mddev) mempool_destroy(conf->r1bio_pool); kfree(conf->mirrors); safe_put_page(conf->tmppage); - kfree(conf->poolinfo); kfree(conf->nr_pending); kfree(conf->nr_waiting); kfree(conf->nr_queued); @@ -3314,7 +3305,6 @@ static void raid1_free(struct mddev *mddev, void *pri= v) mempool_destroy(conf->r1bio_pool); kfree(conf->mirrors); safe_put_page(conf->tmppage); - kfree(conf->poolinfo); kfree(conf->nr_pending); kfree(conf->nr_waiting); kfree(conf->nr_queued); @@ -3368,7 +3358,6 @@ static int raid1_reshape(struct mddev *mddev) * devices have the higher raid_disk numbers. */ mempool_t *newpool, *oldpool; - struct pool_info *newpoolinfo; size_t new_r1bio_size; struct raid1_info *newmirrors; struct r1conf *conf =3D mddev->private; @@ -3400,23 +3389,15 @@ static int raid1_reshape(struct mddev *mddev) return -EBUSY; } =20 - newpoolinfo =3D kmalloc(sizeof(*newpoolinfo), GFP_KERNEL); - if (!newpoolinfo) - return -ENOMEM; - newpoolinfo->mddev =3D mddev; - newpoolinfo->raid_disks =3D raid_disks * 2; - new_r1bio_size =3D offsetof(struct r1bio, bios[raid_disks * 2]); newpool =3D mempool_create_kmalloc_pool(NR_RAID_BIOS, new_r1bio_size); if (!newpool) { - kfree(newpoolinfo); return -ENOMEM; } newmirrors =3D kzalloc(array3_size(sizeof(struct raid1_info), raid_disks, 2), GFP_KERNEL); if (!newmirrors) { - kfree(newpoolinfo); mempool_destroy(newpool); return -ENOMEM; } @@ -3442,8 +3423,6 @@ static int raid1_reshape(struct mddev *mddev) } kfree(conf->mirrors); conf->mirrors =3D newmirrors; - kfree(conf->poolinfo); - conf->poolinfo =3D newpoolinfo; =20 spin_lock_irqsave(&conf->device_lock, flags); mddev->degraded +=3D (raid_disks - conf->raid_disks); diff --git a/drivers/md/raid1.h b/drivers/md/raid1.h index 652c347b1a70..d236ef179cfb 100644 --- a/drivers/md/raid1.h +++ b/drivers/md/raid1.h @@ -49,22 +49,6 @@ struct raid1_info { sector_t seq_start; }; =20 -/* - * memory pools need a pointer to the mddev, so they can force an unplug - * when memory is tight, and a count of the number of drives that the - * pool was allocated for, so they know how much to allocate and free. - * mddev->raid_disks cannot be used, as it can change while a pool is acti= ve - * These two datums are stored in a kmalloced struct. - * The 'raid_disks' here is twice the raid_disks in r1conf. - * This allows space for each 'real' device can have a replacement in the - * second half of the array. - */ - -struct pool_info { - struct mddev *mddev; - int raid_disks; -}; - struct r1conf { struct mddev *mddev; struct raid1_info *mirrors; /* twice 'raid_disks' to @@ -114,10 +98,6 @@ struct r1conf { */ int recovery_disabled; =20 - /* poolinfo contains information about the content of the - * mempools - it changes when the array grows or shrinks - */ - struct pool_info *poolinfo; mempool_t *r1bio_pool; mempool_t r1buf_pool; =20 --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A14481C6FE1; Mon, 7 Jul 2025 01:32:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851969; cv=none; b=av1KpSmM3xM6Uemhv9S+wA7GM01rlDTmel+wtTfB3T+Oe4IuTz42sF2wIiSH5zOsl6JOnqp56a0RV9zvfkl/iU/bsdVZlJWIqrL6JMcGNoj9HFZa8ISqK9jYonY0T+q/671Pqrh9nsIBVYV1wztGuYdMqLSP4blnIF+axWYmpUY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851969; c=relaxed/simple; bh=PRYHsDTcnji4/zbepXFSNWGuNgsD4A+t5PFV6UCG6TQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Gyoduq09+H67l/tP4Gd7xFMFR4y4NfuwG+O2W5VrFDowuEN6P+s417naldsvXi+qCGbOLCajuJ4SMoco/OdM1qAzAerU/Zs9g9HKQ9Jq+KQdnCT3Mw+YGFEWUuh3DvisGsuSs9R8kBC/tzqlYxv8GpbdlVL133v3BptRCDq9wTE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dm6SNczKHMjD; Mon, 7 Jul 2025 09:32:40 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 5A0AB1A0FAC; Mon, 7 Jul 2025 09:32:39 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S7; Mon, 07 Jul 2025 09:32:39 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 03/15] md/md-bitmap: remove the parameter 'init' for bitmap_ops->resize() Date: Mon, 7 Jul 2025 09:26:59 +0800 Message-Id: <20250707012711.376844-4-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S7 X-Coremail-Antispam: 1UD129KBjvJXoWxJFyxAr15tr1xWw13CFWxWFg_yoWrKw17pa 1xtFy3A345KrWrWa1UXFykuFyYq34Dtr9rKryxC34fWF9rXrZrZF4rWFWqqr1Uta45ZFsI qan8trWUCF1xXFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUm014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JrWl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2kIc2 xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWU JVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67 kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY 6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0x vEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVj vjDU0xZFpf9x0JUHWlkUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai It's set to 'false' for all callers, hence it's useless and can be removed. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/dm-raid.c | 2 +- drivers/md/md-bitmap.c | 5 ++--- drivers/md/md-bitmap.h | 3 +-- drivers/md/md-cluster.c | 2 +- drivers/md/raid1.c | 2 +- drivers/md/raid10.c | 8 ++++---- drivers/md/raid5.c | 2 +- 7 files changed, 11 insertions(+), 13 deletions(-) diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index d296770478b2..9757c32ea1f5 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -4068,7 +4068,7 @@ static int raid_preresume(struct dm_target *ti) int chunksize =3D to_bytes(rs->requested_bitmap_chunk_sectors) ?: mddev-= >bitmap_info.chunksize; =20 r =3D mddev->bitmap_ops->resize(mddev, mddev->dev_sectors, - chunksize, false); + chunksize); if (r) DMERR("Failed to resize bitmap"); } diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index bd694910b01b..fc7282304b00 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2594,15 +2594,14 @@ static int __bitmap_resize(struct bitmap *bitmap, s= ector_t blocks, return ret; } =20 -static int bitmap_resize(struct mddev *mddev, sector_t blocks, int chunksi= ze, - bool init) +static int bitmap_resize(struct mddev *mddev, sector_t blocks, int chunksi= ze) { struct bitmap *bitmap =3D mddev->bitmap; =20 if (!bitmap) return 0; =20 - return __bitmap_resize(bitmap, blocks, chunksize, init); + return __bitmap_resize(bitmap, blocks, chunksize, false); } =20 static ssize_t diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 59e9dd45cfde..28c1f1c1cc83 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -64,8 +64,7 @@ struct md_bitmap_stats { struct bitmap_operations { bool (*enabled)(struct mddev *mddev); int (*create)(struct mddev *mddev); - int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize, - bool init); + int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize); =20 int (*load)(struct mddev *mddev); void (*destroy)(struct mddev *mddev); diff --git a/drivers/md/md-cluster.c b/drivers/md/md-cluster.c index 94221d964d4f..db6bbc8eebbc 100644 --- a/drivers/md/md-cluster.c +++ b/drivers/md/md-cluster.c @@ -630,7 +630,7 @@ static int process_recvd_msg(struct mddev *mddev, struc= t cluster_msg *msg) if (le64_to_cpu(msg->high) !=3D mddev->pers->size(mddev, 0, 0)) ret =3D mddev->bitmap_ops->resize(mddev, le64_to_cpu(msg->high), - 0, false); + 0); break; default: ret =3D -1; diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 3a31e230727c..39ebe0fadacd 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -3329,7 +3329,7 @@ static int raid1_resize(struct mddev *mddev, sector_t= sectors) mddev->array_sectors > newsize) return -EINVAL; =20 - ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0, false); + ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0); if (ret) return ret; =20 diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index b74780af4c22..d2ef96be0150 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -4233,7 +4233,7 @@ static int raid10_resize(struct mddev *mddev, sector_= t sectors) mddev->array_sectors > size) return -EINVAL; =20 - ret =3D mddev->bitmap_ops->resize(mddev, size, 0, false); + ret =3D mddev->bitmap_ops->resize(mddev, size, 0); if (ret) return ret; =20 @@ -4502,7 +4502,7 @@ static int raid10_start_reshape(struct mddev *mddev) newsize =3D raid10_size(mddev, 0, conf->geo.raid_disks); =20 if (!mddev_is_clustered(mddev)) { - ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0, false); + ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0); if (ret) goto abort; else @@ -4524,13 +4524,13 @@ static int raid10_start_reshape(struct mddev *mddev) MD_FEATURE_RESHAPE_ACTIVE)) || (oldsize =3D=3D newsize)) goto out; =20 - ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0, false); + ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0); if (ret) goto abort; =20 ret =3D mddev->cluster_ops->resize_bitmaps(mddev, newsize, oldsize); if (ret) { - mddev->bitmap_ops->resize(mddev, oldsize, 0, false); + mddev->bitmap_ops->resize(mddev, oldsize, 0); goto abort; } } diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 7ec61ee7b218..999752ec636e 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -8322,7 +8322,7 @@ static int raid5_resize(struct mddev *mddev, sector_t= sectors) mddev->array_sectors > newsize) return -EINVAL; =20 - ret =3D mddev->bitmap_ops->resize(mddev, sectors, 0, false); + ret =3D mddev->bitmap_ops->resize(mddev, sectors, 0); if (ret) return ret; =20 --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B12401B4F09; Mon, 7 Jul 2025 01:32:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851963; cv=none; b=e/ipjz2X/ibLFK97QxqyTQHPz7GCGq6VE5ZOiQJQiTCZjKN0tI/KK2udkY1v5vh/CsOCAB2ogorgggBX3X08LhlqfIb0Tzdbcb8Db6HENoQSw4SzueSe0CGgOq0YuNgWAUgsIgOOh+xCGe25ofG3ZzdpeyP2iGpw4KL0AF2T/Jg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851963; c=relaxed/simple; bh=jEQrD3JWf7qasjiLNtGv8jzcAM2d7EwDg8Yr5eQIRow=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=JjQbnnh/y1vPpyhJEy0Jhgwocmi/1iNGqAqF0IeMKtm0OpxQnxsMKfvugAp16w4jInEfjuRPfL4FP02PHTjtiDY9p1mcuG2+ucP22ncZukX06+jtZFdPBFWBU24qDWQ/nRee5MmKvMXDANSB6Gm6kJgVEGkCdPMuPf71ImJRSZs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dn02tWzYQtf2; Mon, 7 Jul 2025 09:32:41 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id CEEA71A1B8A; Mon, 7 Jul 2025 09:32:39 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S8; Mon, 07 Jul 2025 09:32:39 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 04/15] md/md-bitmap: merge md_bitmap_group into bitmap_operations Date: Mon, 7 Jul 2025 09:27:00 +0800 Message-Id: <20250707012711.376844-5-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S8 X-Coremail-Antispam: 1UD129KBjvJXoWxXFy5CFWktFWrtF4UAry7Wrg_yoW5WryDpF ZrJ343uw1rJF45Xa17Z34q9a4rW3s7trZrKFWfCw1ruFy7XasxJr48Ca4jywn8WFy3CFsI qw1Yyw1Uur18WF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnI WIevJa73UjIFyTuYvjfUOyIUUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Now that all bitmap implementations are internal, it doesn't make sense to export md_bitmap_group anymore. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 5 ++++- drivers/md/md-bitmap.h | 2 ++ drivers/md/md.c | 6 +++++- drivers/md/md.h | 1 - 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index fc7282304b00..0ba1da35aa84 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2990,7 +2990,8 @@ static struct attribute *md_bitmap_attrs[] =3D { &max_backlog_used.attr, NULL }; -const struct attribute_group md_bitmap_group =3D { + +static struct attribute_group md_bitmap_group =3D { .name =3D "bitmap", .attrs =3D md_bitmap_attrs, }; @@ -3026,6 +3027,8 @@ static struct bitmap_operations bitmap_ops =3D { .copy_from_slot =3D bitmap_copy_from_slot, .set_pages =3D bitmap_set_pages, .free =3D md_bitmap_free, + + .group =3D &md_bitmap_group, }; =20 void mddev_set_bitmap_ops(struct mddev *mddev) diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 28c1f1c1cc83..0ceb9e97d21f 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -100,6 +100,8 @@ struct bitmap_operations { sector_t *hi, bool clear_bits); void (*set_pages)(void *data, unsigned long pages); void (*free)(void *data); + + struct attribute_group *group; }; =20 /* the bitmap API */ diff --git a/drivers/md/md.c b/drivers/md/md.c index bda3ef814d97..7ed95e5e43fc 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -5749,7 +5749,6 @@ static const struct attribute_group md_redundancy_gro= up =3D { =20 static const struct attribute_group *md_attr_groups[] =3D { &md_default_group, - &md_bitmap_group, NULL, }; =20 @@ -5996,6 +5995,11 @@ struct mddev *md_alloc(dev_t dev, char *name) return ERR_PTR(error); } =20 + if (mddev->bitmap_ops && mddev->bitmap_ops->group) + if (sysfs_create_group(&mddev->kobj, mddev->bitmap_ops->group)) + pr_warn("md: cannot register extra bitmap attributes for %s\n", + mdname(mddev)); + kobject_uevent(&mddev->kobj, KOBJ_ADD); mddev->sysfs_state =3D sysfs_get_dirent_safe(mddev->kobj.sd, "array_state= "); mddev->sysfs_level =3D sysfs_get_dirent_safe(mddev->kobj.sd, "level"); diff --git a/drivers/md/md.h b/drivers/md/md.h index 67b365621507..d6fba4240f97 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -796,7 +796,6 @@ struct md_sysfs_entry { ssize_t (*show)(struct mddev *, char *); ssize_t (*store)(struct mddev *, const char *, size_t); }; -extern const struct attribute_group md_bitmap_group; =20 static inline struct kernfs_node *sysfs_get_dirent_safe(struct kernfs_node= *sd, char *name) { --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8C04A218E8B; Mon, 7 Jul 2025 01:32:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851970; cv=none; b=HcRDdA+0b7B3s2sypgggHmmlbDdLIwr93aK6f7Aq3dTptdU+xcEh4AyiXIT+f7xmUQjTb3CFX1oCCOD6Hy5usKF58egb09z1bHdm3VL6x94nzQCtL+0K4YNzJE5PEIPh3y4GFcSWWTe4KOqMXRynpm/l3+JYImxGGW9xVej5BmI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851970; c=relaxed/simple; bh=QYCuzQj36mgdTHmyj2WgNXVXzSnqWjjKe4HZbeg0pVk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=n2JYcx39+yYxU/Gjpacm4oXYXyxaTdOsD0xJyCndLq35wGAdbxdNRobOQhteolEcfzy+6btv82eBv3PuXsTmh/OUdUnMqrUn5L3jjxH2eYnVVAeF97FedRfTfrDQQeTPXD3yfKqyv61JWrwdpbCniGtmwm55NSRjhFCtyDJQAHQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dn6rx9zKHMjr; Mon, 7 Jul 2025 09:32:41 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 677FF1A0FB9; Mon, 7 Jul 2025 09:32:40 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S9; Mon, 07 Jul 2025 09:32:40 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 05/15] md/md-bitmap: add a new parameter 'flush' to bitmap_ops->enabled Date: Mon, 7 Jul 2025 09:27:01 +0800 Message-Id: <20250707012711.376844-6-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S9 X-Coremail-Antispam: 1UD129KBjvJXoWxZw47XFyUJr43Kr17GrWrGrg_yoW5Wr17p3 9rta4Fkw15JFWag3W7AFWkua45tw1kt39rKFyfC34ruFy3ZFZ8WF4rGay8ta4vva43CFsx Za1rKFWUCF18WrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnI WIevJa73UjIFyTuYvjfUOyIUUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai The method is only used from raid1/raid10 IO path, to check if write bio should be pluged, the parameter is always set to true for now, following patch will use this helper in other context like updating superblock. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 19 +++++++++++++------ drivers/md/md-bitmap.h | 2 +- drivers/md/raid1-10.c | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 0ba1da35aa84..3f52716ea6f5 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -232,20 +232,27 @@ static inline char *bmname(struct bitmap *bitmap) return bitmap->mddev ? mdname(bitmap->mddev) : "mdX"; } =20 -static bool __bitmap_enabled(struct bitmap *bitmap) +static bool __bitmap_enabled(struct bitmap *bitmap, bool flush) { - return bitmap->storage.filemap && - !test_bit(BITMAP_STALE, &bitmap->flags); + if (!flush) + return true; + + /* + * If caller want to flush bitmap pages to underlying disks, check if + * there are cached pages in filemap. + */ + return !test_bit(BITMAP_STALE, &bitmap->flags) && + bitmap->storage.filemap !=3D NULL; } =20 -static bool bitmap_enabled(struct mddev *mddev) +static bool bitmap_enabled(struct mddev *mddev, bool flush) { struct bitmap *bitmap =3D mddev->bitmap; =20 if (!bitmap) return false; =20 - return __bitmap_enabled(bitmap); + return __bitmap_enabled(bitmap, flush); } =20 /* @@ -1244,7 +1251,7 @@ static void __bitmap_unplug(struct bitmap *bitmap) int dirty, need_write; int writing =3D 0; =20 - if (!__bitmap_enabled(bitmap)) + if (!__bitmap_enabled(bitmap, true)) return; =20 /* look at each page to see if there are any set bits that need to be diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 0ceb9e97d21f..63d91831655f 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -62,7 +62,7 @@ struct md_bitmap_stats { }; =20 struct bitmap_operations { - bool (*enabled)(struct mddev *mddev); + bool (*enabled)(struct mddev *mddev, bool flush); int (*create)(struct mddev *mddev); int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize); =20 diff --git a/drivers/md/raid1-10.c b/drivers/md/raid1-10.c index b8b3a9069701..4ad051d49cdc 100644 --- a/drivers/md/raid1-10.c +++ b/drivers/md/raid1-10.c @@ -140,7 +140,7 @@ static inline bool raid1_add_bio_to_plug(struct mddev *= mddev, struct bio *bio, * If bitmap is not enabled, it's safe to submit the io directly, and * this can get optimal performance. */ - if (!mddev->bitmap_ops->enabled(mddev)) { + if (!mddev->bitmap_ops->enabled(mddev, true)) { raid1_submit_write(bio); return true; } --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 93F961EF363; Mon, 7 Jul 2025 01:32:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851965; cv=none; b=Ii3PNYxoGo8fCBvU4gHZWh/uxX16rrzrkt1uBdUp9sHcMEUkYVkGKgFiIiQ+mHE/KssT6qnishDDoncOmaKv6JkimPLNGIuONgzi2p8UDCWhsz2E6jbv+5ky8K0aixvWAW30enUhPKrTvDpbQLZCyIhLczpOn0jWiBLR9wo8LsU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851965; c=relaxed/simple; bh=3aIcq7J0empgvfqFLuVssNirgPyNfNfrxb7fWSBP3gw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=nRojCHtaxjXa6NlbpM8NkJ49av/u8dqsejuXsqnM/EARtMl3yoTXigd7Q8/Co8KpYCXUrGGTLrG/NKulTa6sT5WFVL+EaIKf/8AlMPASrzyC6ds3fcuLMhmVh/7bgi02cFYb7nQT7kOrv3awTDWpUbUBD2V7pRXdvfYkgDJcPp0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dp0XPyzYQv1c; Mon, 7 Jul 2025 09:32:42 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id DD1A31A1B9C; Mon, 7 Jul 2025 09:32:40 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S10; Mon, 07 Jul 2025 09:32:40 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 06/15] md/md-bitmap: add md_bitmap_registered/enabled() helper Date: Mon, 7 Jul 2025 09:27:02 +0800 Message-Id: <20250707012711.376844-7-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S10 X-Coremail-Antispam: 1UD129KBjvJXoWxur1UJF48KF47uFW5ur1ftFb_yoW5Zr17p3 98Ja45Cr15JFWaga17AFyDua4Yqwn7tr9rtFyfC34ruFy3ZFs8GF4rGay0y3Z7X343AFsx Xr15Kr1UCrWUWr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnI WIevJa73UjIFyTuYvjfUOyIUUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai There are no functional changes, prepare to handle the case that mddev->bitmap_ops can be NULL, which is possible after introducing CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 16 ++++------------ drivers/md/md-bitmap.h | 19 ++++++++++++++++++- drivers/md/raid1-10.c | 2 +- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 3f52716ea6f5..da2dcb3d2122 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -232,8 +232,10 @@ static inline char *bmname(struct bitmap *bitmap) return bitmap->mddev ? mdname(bitmap->mddev) : "mdX"; } =20 -static bool __bitmap_enabled(struct bitmap *bitmap, bool flush) +static bool bitmap_enabled(void *data, bool flush) { + struct bitmap *bitmap =3D data; + if (!flush) return true; =20 @@ -245,16 +247,6 @@ static bool __bitmap_enabled(struct bitmap *bitmap, bo= ol flush) bitmap->storage.filemap !=3D NULL; } =20 -static bool bitmap_enabled(struct mddev *mddev, bool flush) -{ - struct bitmap *bitmap =3D mddev->bitmap; - - if (!bitmap) - return false; - - return __bitmap_enabled(bitmap, flush); -} - /* * check a page and, if necessary, allocate it (or hijack it if the alloc = fails) * @@ -1251,7 +1243,7 @@ static void __bitmap_unplug(struct bitmap *bitmap) int dirty, need_write; int writing =3D 0; =20 - if (!__bitmap_enabled(bitmap, true)) + if (!bitmap_enabled(bitmap, true)) return; =20 /* look at each page to see if there are any set bits that need to be diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 63d91831655f..a36ed32ec0d5 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -62,7 +62,7 @@ struct md_bitmap_stats { }; =20 struct bitmap_operations { - bool (*enabled)(struct mddev *mddev, bool flush); + bool (*enabled)(void *data, bool flush); int (*create)(struct mddev *mddev); int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize); =20 @@ -107,4 +107,21 @@ struct bitmap_operations { /* the bitmap API */ void mddev_set_bitmap_ops(struct mddev *mddev); =20 +static inline bool md_bitmap_registered(struct mddev *mddev) +{ + return mddev->bitmap_ops !=3D NULL; +} + +static inline bool md_bitmap_enabled(struct mddev *mddev, bool flush) +{ + /* bitmap_ops must be registered before creating bitmap. */ + if (!md_bitmap_registered(mddev)) + return false; + + if (!mddev->bitmap) + return false; + + return mddev->bitmap_ops->enabled(mddev->bitmap, flush); +} + #endif diff --git a/drivers/md/raid1-10.c b/drivers/md/raid1-10.c index 4ad051d49cdc..0ad8b28ab7c2 100644 --- a/drivers/md/raid1-10.c +++ b/drivers/md/raid1-10.c @@ -140,7 +140,7 @@ static inline bool raid1_add_bio_to_plug(struct mddev *= mddev, struct bio *bio, * If bitmap is not enabled, it's safe to submit the io directly, and * this can get optimal performance. */ - if (!mddev->bitmap_ops->enabled(mddev, true)) { + if (!md_bitmap_enabled(mddev, true)) { raid1_submit_write(bio); return true; } --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7C7721F0995; Mon, 7 Jul 2025 01:32:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851965; cv=none; b=eUrXJSpdWqExSN6EbOIZq1yrb5BhVaF5n906do2oH/YAHD6Lsjz11sXKfY9v/0sPtDaDEI2N/RjNo0zsi1hd5MoYCsogU2Wxr8S0x22vnGnkc+HW8Qy6xHv4FS+O5Vh1y6RY2Y0tP0zy3uXC4lonq0SfxLDCbxBE8RA/bgnjxv4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851965; c=relaxed/simple; bh=8CoZqNCRRTYz17njgyShz0XMTQ4HEpGLAhEoWfpWatk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=p61j9iRZBUvVbECqICBCG0i0EHkMXrFJdZBvJpv/RWcKWN9fCOJtZM647AyshSbM/fEssLan9eyRJpYJzcLTowUEjHaGJ2UiYMyQZK96DmexKD7e+EdkZYkvwiVa34YRl/0Us2gVK4VCU5qBru1Dtkm524/VEvDdLpwX/Dpgz9k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dp493gzYQtvs; Mon, 7 Jul 2025 09:32:42 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 668EA1A13E5; Mon, 7 Jul 2025 09:32:41 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S11; Mon, 07 Jul 2025 09:32:41 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 07/15] md/md-bitmap: handle the case bitmap is not enabled before start_sync() Date: Mon, 7 Jul 2025 09:27:03 +0800 Message-Id: <20250707012711.376844-8-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S11 X-Coremail-Antispam: 1UD129KBjvJXoW3Gr18JFyrAFW8tr4rGr4fAFb_yoW7AF4xpw s7JFy3Kw15WFW5X3W7CFyDuFyFywnrtFZrtr1fWw1fWFykGFykZF48WFyjqFyqgFyYyF98 Xwn8CF45CryaqFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Cr0_Gr1UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCw CI42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnI WIevJa73UjIFyTuYvjfUOyIUUUUUU X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai This case can be handled without knowing internal implementation. Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 8 +------- drivers/md/md-bitmap.h | 12 ++++++++++++ drivers/md/raid1.c | 6 +++--- drivers/md/raid10.c | 15 ++++++--------- drivers/md/raid5.c | 7 ++----- 5 files changed, 24 insertions(+), 24 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index da2dcb3d2122..ee676d4670ea 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -1787,15 +1787,9 @@ static bool __bitmap_start_sync(struct bitmap *bitma= p, sector_t offset, sector_t *blocks, bool degraded) { bitmap_counter_t *bmc; - bool rv; + bool rv =3D false; =20 - if (bitmap =3D=3D NULL) {/* FIXME or bitmap set as 'failed' */ - *blocks =3D 1024; - return true; /* always resync if no bitmap */ - } spin_lock_irq(&bitmap->counts.lock); - - rv =3D false; bmc =3D md_bitmap_get_counter(&bitmap->counts, offset, blocks, 0); if (bmc) { /* locked */ diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index a36ed32ec0d5..7a16de62ee35 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -124,4 +124,16 @@ static inline bool md_bitmap_enabled(struct mddev *mdd= ev, bool flush) return mddev->bitmap_ops->enabled(mddev->bitmap, flush); } =20 +static inline bool md_bitmap_start_sync(struct mddev *mddev, sector_t offs= et, + sector_t *blocks, bool degraded) +{ + /* always resync if no bitmap */ + if (!md_bitmap_enabled(mddev, false)) { + *blocks =3D 1024; + return true; + } + + return mddev->bitmap_ops->start_sync(mddev, offset, blocks, degraded); +} + #endif diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 39ebe0fadacd..1f3f2046afe0 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2828,7 +2828,7 @@ static sector_t raid1_sync_request(struct mddev *mdde= v, sector_t sector_nr, /* before building a request, check if we can skip these blocks.. * This call the bitmap_start_sync doesn't actually record anything */ - if (!mddev->bitmap_ops->start_sync(mddev, sector_nr, &sync_blocks, true) = && + if (!md_bitmap_start_sync(mddev, sector_nr, &sync_blocks, true) && !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)= ) { /* We can skip this block, and probably several more */ *skipped =3D 1; @@ -3003,8 +3003,8 @@ static sector_t raid1_sync_request(struct mddev *mdde= v, sector_t sector_nr, if (len =3D=3D 0) break; if (sync_blocks =3D=3D 0) { - if (!mddev->bitmap_ops->start_sync(mddev, sector_nr, - &sync_blocks, still_degraded) && + if (!md_bitmap_start_sync(mddev, sector_nr, + &sync_blocks, still_degraded) && !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) break; diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index d2ef96be0150..764a8d99c45e 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -3346,9 +3346,8 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, * we only need to recover the block if it is set in * the bitmap */ - must_sync =3D mddev->bitmap_ops->start_sync(mddev, sect, - &sync_blocks, - true); + must_sync =3D md_bitmap_start_sync(mddev, sect, + &sync_blocks, true); if (sync_blocks < max_sync) max_sync =3D sync_blocks; if (!must_sync && @@ -3391,9 +3390,8 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, } } =20 - must_sync =3D mddev->bitmap_ops->start_sync(mddev, sect, - &sync_blocks, still_degraded); - + md_bitmap_start_sync(mddev, sect, &sync_blocks, + still_degraded); any_working =3D 0; for (j=3D0; jcopies;j++) { int k; @@ -3569,9 +3567,8 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, mddev_is_clustered(mddev) && (sector_nr + 2 * RESYNC_SECTORS > conf->cluster_sync_high)); =20 - if (!mddev->bitmap_ops->start_sync(mddev, sector_nr, - &sync_blocks, - mddev->degraded) && + if (!md_bitmap_start_sync(mddev, sector_nr, &sync_blocks, + mddev->degraded) && !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) { /* We can skip this block */ diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 999752ec636e..8168acf7d3e7 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -6525,8 +6525,7 @@ static inline sector_t raid5_sync_request(struct mdde= v *mddev, sector_t sector_n } if (!test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery) && !conf->fullsync && - !mddev->bitmap_ops->start_sync(mddev, sector_nr, &sync_blocks, - true) && + !md_bitmap_start_sync(mddev, sector_nr, &sync_blocks, true) && sync_blocks >=3D RAID5_STRIPE_SECTORS(conf)) { /* we can skip this block, and probably more */ do_div(sync_blocks, RAID5_STRIPE_SECTORS(conf)); @@ -6557,9 +6556,7 @@ static inline sector_t raid5_sync_request(struct mdde= v *mddev, sector_t sector_n still_degraded =3D true; } =20 - mddev->bitmap_ops->start_sync(mddev, sector_nr, &sync_blocks, - still_degraded); - + md_bitmap_start_sync(mddev, sector_nr, &sync_blocks, still_degraded); set_bit(STRIPE_SYNC_REQUESTED, &sh->state); set_bit(STRIPE_HANDLE, &sh->state); =20 --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B779321CFF7; Mon, 7 Jul 2025 01:32:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851972; cv=none; b=kWQhgIZs/oZut4SVLxy+2jdBe4QJDQ9l1sFoxRxDkYSeiEEoiQjjdUbYvPoqY6OAQCig8v6L66Q0jXE8JRfwSLOc/1RWam7gALF5YS7Yw7yNTpnlEz+YoS/m28l5mpwXUEyYWYpvDzSC2UDPnepppQ8SBPIeSPfgLYLNAA0hQ9U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851972; c=relaxed/simple; bh=AAfTqENMwUfW8Sza0yAJ9bh9YlilEmpT1iIe7eKjvLM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=OiQ80kma6dZGFdrfqgUxf3Lk9YbvTY83AU619Clom09JR7JDI6ZeWBn23I4q1YhS3EADcxxovJBBx7BaqjlwSlE1KIWNv/rykPcTPm14hxjaMWd9+upueIxyoDC8qB8uah2k5n93b/1Vr/BdOJHzRarzeC6UnRWedi0bQcrtCMA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dq3YJXzKHMbt; Mon, 7 Jul 2025 09:32:43 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id E93E81A018C; Mon, 7 Jul 2025 09:32:41 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S12; Mon, 07 Jul 2025 09:32:41 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 08/15] md/md-bitmap: handle the case bitmap is not enabled before end_sync() Date: Mon, 7 Jul 2025 09:27:04 +0800 Message-Id: <20250707012711.376844-9-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S12 X-Coremail-Antispam: 1UD129KBjvJXoWxXryfuF1DXryxXryrCrW3ZFb_yoWrXr18p3 9rJFW3uw17WFW5Xa1UZrykuFyFvwnrtF9FyFyxW3s3uFykXF9rJF4rGFyjqr1qka4SyFZ8 Xa45CrW5CF1UWrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai This case can be handled without knowing internal implementation. Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 4 ---- drivers/md/md-bitmap.h | 11 +++++++++++ drivers/md/raid1.c | 6 +++--- drivers/md/raid10.c | 8 +++----- drivers/md/raid5.c | 4 ++-- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index ee676d4670ea..a079cbe2e6f1 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -1838,10 +1838,6 @@ static void __bitmap_end_sync(struct bitmap *bitmap,= sector_t offset, bitmap_counter_t *bmc; unsigned long flags; =20 - if (bitmap =3D=3D NULL) { - *blocks =3D 1024; - return; - } spin_lock_irqsave(&bitmap->counts.lock, flags); bmc =3D md_bitmap_get_counter(&bitmap->counts, offset, blocks, 0); if (bmc =3D=3D NULL) diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 7a16de62ee35..61cfc650c69c 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -136,4 +136,15 @@ static inline bool md_bitmap_start_sync(struct mddev *= mddev, sector_t offset, return mddev->bitmap_ops->start_sync(mddev, offset, blocks, degraded); } =20 +static inline void md_bitmap_end_sync(struct mddev *mddev, sector_t offset, + sector_t *blocks) +{ + if (!md_bitmap_enabled(mddev, false)) { + *blocks =3D 1024; + return; + } + + mddev->bitmap_ops->end_sync(mddev, offset, blocks); +} + #endif diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 1f3f2046afe0..a46ce996ea9c 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2056,7 +2056,7 @@ static void abort_sync_write(struct mddev *mddev, str= uct r1bio *r1_bio) =20 /* make sure these bits don't get cleared. */ do { - mddev->bitmap_ops->end_sync(mddev, s, &sync_blocks); + md_bitmap_end_sync(mddev, s, &sync_blocks); s +=3D sync_blocks; sectors_to_go -=3D sync_blocks; } while (sectors_to_go > 0); @@ -2803,8 +2803,8 @@ static sector_t raid1_sync_request(struct mddev *mdde= v, sector_t sector_nr, * We can find the current addess in mddev->curr_resync */ if (mddev->curr_resync < max_sector) /* aborted */ - mddev->bitmap_ops->end_sync(mddev, mddev->curr_resync, - &sync_blocks); + md_bitmap_end_sync(mddev, mddev->curr_resync, + &sync_blocks); else /* completed sync */ conf->fullsync =3D 0; =20 diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 764a8d99c45e..c0aa19935881 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -3216,15 +3216,13 @@ static sector_t raid10_sync_request(struct mddev *m= ddev, sector_t sector_nr, =20 if (mddev->curr_resync < max_sector) { /* aborted */ if (test_bit(MD_RECOVERY_SYNC, &mddev->recovery)) - mddev->bitmap_ops->end_sync(mddev, - mddev->curr_resync, - &sync_blocks); + md_bitmap_end_sync(mddev, mddev->curr_resync, + &sync_blocks); else for (i =3D 0; i < conf->geo.raid_disks; i++) { sector_t sect =3D raid10_find_virt(conf, mddev->curr_resync, i); =20 - mddev->bitmap_ops->end_sync(mddev, sect, - &sync_blocks); + md_bitmap_end_sync(mddev, sect, &sync_blocks); } } else { /* completed sync */ diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 8168acf7d3e7..156504ed0dd4 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -6492,8 +6492,8 @@ static inline sector_t raid5_sync_request(struct mdde= v *mddev, sector_t sector_n } =20 if (mddev->curr_resync < max_sector) /* aborted */ - mddev->bitmap_ops->end_sync(mddev, mddev->curr_resync, - &sync_blocks); + md_bitmap_end_sync(mddev, mddev->curr_resync, + &sync_blocks); else /* completed sync */ conf->fullsync =3D 0; mddev->bitmap_ops->close_sync(mddev); --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7B2B020E328; Mon, 7 Jul 2025 01:32:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851972; cv=none; b=edtc0IV/PUeR74jPUtB4C+pQr8iUwwqJMfhv6AojZ0kZ+DNPAMl3UfSmuxng67aWdrGYVbaAlcWHii4HXfl8HMT7Z8Vhzff0d5Z1iqBNO4UVnZzpJ4C0iuqNKjBgDKMQj1p2zsPOYa3ZW7HE3pmVWlh7TuadnxGDH+9tlQux55M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851972; c=relaxed/simple; bh=MBu1mejQ++tU50EgLNX9tCdC8Z1xzYjVDlz1gKR4WM0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jgTJKM4xzoFASCWtvXe1unBC35HN+Qsrf7a741244vmMSWdIxI4mqm6260c2LEzbhAzJbOYYHJZqh8KI7QF+rcTHkib2o33sQ4z/RjEe4tQGrFc6ZboHg1+yG6AOSaGmqS+vUtXRftT5/TXiR5iyeBjEpPpx4ZRPCrakwtcsBmQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dr05QgzKHMbt; Mon, 7 Jul 2025 09:32:44 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 74CCB1A0A83; Mon, 7 Jul 2025 09:32:42 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S13; Mon, 07 Jul 2025 09:32:42 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 09/15] md/raid1: check bitmap before behind write Date: Mon, 7 Jul 2025 09:27:05 +0800 Message-Id: <20250707012711.376844-10-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S13 X-Coremail-Antispam: 1UD129KBjvJXoWxAry8tr47Cr4xtF17Kw45Jrb_yoWrGryrpa 9FqFn0krW5trW3XrnrAFykuFyrXw4ktF9rtrWfW34FgF12yr90gF4FgFyrCrnxA3sxCF45 Zr4Yyr1UW3ySqFUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUCVW8JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai behind write rely on bitmap, because the number of IO are recorded in bitmap->behind_writes, and callers rely on bitmap_wait_behind_writes() to wait for IO to be done. However, currently callers doesn't check if bitmap is enabeld before calling into behind methods. Hence if behind write start without bitmap, readers will not wait for slow write IO to be done and old data can be read in some corner cases. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/md-bitmap.c | 6 ------ drivers/md/raid1.c | 45 ++++++++++++++++++++++++++---------------- 2 files changed, 28 insertions(+), 23 deletions(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index a079cbe2e6f1..5bd75fa6ee1d 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2049,9 +2049,6 @@ static void bitmap_start_behind_write(struct mddev *m= ddev) struct bitmap *bitmap =3D mddev->bitmap; int bw; =20 - if (!bitmap) - return; - atomic_inc(&bitmap->behind_writes); bw =3D atomic_read(&bitmap->behind_writes); if (bw > bitmap->behind_writes_used) @@ -2065,9 +2062,6 @@ static void bitmap_end_behind_write(struct mddev *mdd= ev) { struct bitmap *bitmap =3D mddev->bitmap; =20 - if (!bitmap) - return; - if (atomic_dec_and_test(&bitmap->behind_writes)) wake_up(&bitmap->behind_wait); pr_debug("dec write-behind count %d/%lu\n", diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index a46ce996ea9c..015eabb502ec 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1366,7 +1366,8 @@ static void raid1_read_request(struct mddev *mddev, s= truct bio *bio, (unsigned long long)r1_bio->sector, mirror->rdev->bdev); =20 - if (test_bit(WriteMostly, &mirror->rdev->flags)) { + if (test_bit(WriteMostly, &mirror->rdev->flags) && + md_bitmap_enabled(mddev, false)) { /* * Reading from a write-mostly device must take care not to * over-take any writes that are 'behind' @@ -1452,6 +1453,30 @@ static bool wait_blocked_rdev(struct mddev *mddev, s= truct bio *bio) return true; } =20 +static void raid1_start_write_behind(struct mddev *mddev, struct r1bio *r1= _bio, + struct bio *bio) +{ + unsigned long max_write_behind =3D mddev->bitmap_info.max_write_behind; + struct md_bitmap_stats stats; + int err; + + /* behind write rely on bitmap, see bitmap_operations */ + if (!md_bitmap_enabled(mddev, false)) + return; + + err =3D mddev->bitmap_ops->get_stats(mddev->bitmap, &stats); + if (err) + return; + + /* Don't do behind IO if reader is waiting, or there are too many. */ + if (!stats.behind_wait && stats.behind_writes < max_write_behind) + alloc_behind_master_bio(r1_bio, bio); + + if (test_bit(R1BIO_BehindIO, &r1_bio->state)) + mddev->bitmap_ops->start_behind_write(mddev); + +} + static void raid1_write_request(struct mddev *mddev, struct bio *bio, int max_write_sectors) { @@ -1612,22 +1637,8 @@ static void raid1_write_request(struct mddev *mddev,= struct bio *bio, continue; =20 if (first_clone) { - unsigned long max_write_behind =3D - mddev->bitmap_info.max_write_behind; - struct md_bitmap_stats stats; - int err; - - /* do behind I/O ? - * Not if there are too many, or cannot - * allocate memory, or a reader on WriteMostly - * is waiting for behind writes to flush */ - err =3D mddev->bitmap_ops->get_stats(mddev->bitmap, &stats); - if (!err && write_behind && !stats.behind_wait && - stats.behind_writes < max_write_behind) - alloc_behind_master_bio(r1_bio, bio); - - if (test_bit(R1BIO_BehindIO, &r1_bio->state)) - mddev->bitmap_ops->start_behind_write(mddev); + if (write_behind) + raid1_start_write_behind(mddev, r1_bio, bio); first_clone =3D 0; } =20 --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9CF182206AC; Mon, 7 Jul 2025 01:32:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851973; cv=none; b=F3+KbvkuIbk+RUUib1HX+Q7ARzTxgSrwZ5+ZlFi1P9+1HnSkfbm4dWRcnS+o46mq2Y+DQaDmsmT23jURB6CLIFO+O32i+stDJKxmZd9fkg3cObMZ7IXweSp9R9/HwGzyGdi77tHdMf2DpXsSvgZr99BKTYiotZo6K/Y/CXpYsYQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851973; c=relaxed/simple; bh=6/AqTqaVEz9w3QYQQN662MoIHqTyx2Xb7blxEX+PTpg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Yhu+gJ/VbB8/sJZnlrCU936WhQMhARCxd/hidC6PziT5bmyx9yxJ5tHfWbXNgsKEI0MPovscFZHB9r/uNb6Ip/oLjakVdZwjWGR5MiKGVkawoHpkbUDIrqUvG/cscedp6HoPleBwYSByVEs0SKlptfpwI3JPZjmfTG3PKGBJTuc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dr48F0zKHMkR; Mon, 7 Jul 2025 09:32:44 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 0B5031A13FB; Mon, 7 Jul 2025 09:32:43 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S14; Mon, 07 Jul 2025 09:32:42 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 10/15] md/raid1: check before referencing mddev->bitmap_ops Date: Mon, 7 Jul 2025 09:27:06 +0800 Message-Id: <20250707012711.376844-11-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S14 X-Coremail-Antispam: 1UD129KBjvJXoWxJr43WF4rCw18urWDZw1DJrb_yoW8Cw45pw srtFy3try5GrWag345Aa4kuF1Fy3yxtrZrtryfW3WxWrn7GryDZF4rWFWjqF1jya45ZFy5 JayDJr45CF13WF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/raid1.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 015eabb502ec..ea6a134be9d5 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2819,7 +2819,8 @@ static sector_t raid1_sync_request(struct mddev *mdde= v, sector_t sector_nr, else /* completed sync */ conf->fullsync =3D 0; =20 - mddev->bitmap_ops->close_sync(mddev); + if (md_bitmap_enabled(mddev, false)) + mddev->bitmap_ops->close_sync(mddev); close_sync(conf); =20 if (mddev_is_clustered(mddev)) { @@ -2856,10 +2857,11 @@ static sector_t raid1_sync_request(struct mddev *md= dev, sector_t sector_nr, /* we are incrementing sector_nr below. To be safe, we check against * sector_nr + two times RESYNC_SECTORS */ - - mddev->bitmap_ops->cond_end_sync(mddev, sector_nr, - mddev_is_clustered(mddev) && - (sector_nr + 2 * RESYNC_SECTORS > conf->cluster_sync_high)); + if (md_bitmap_enabled(mddev, false)) + mddev->bitmap_ops->cond_end_sync(mddev, sector_nr, + mddev_is_clustered(mddev) && + (sector_nr + 2 * RESYNC_SECTORS > + conf->cluster_sync_high)); =20 if (raise_barrier(conf, sector_nr)) return 0; @@ -3334,15 +3336,17 @@ static int raid1_resize(struct mddev *mddev, sector= _t sectors) * worth it. */ sector_t newsize =3D raid1_size(mddev, sectors, 0); - int ret; =20 if (mddev->external_size && mddev->array_sectors > newsize) return -EINVAL; =20 - ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0); - if (ret) - return ret; + if (md_bitmap_enabled(mddev, false)) { + int ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0); + + if (ret) + return ret; + } =20 md_set_array_sectors(mddev, newsize); if (sectors > mddev->dev_sectors && --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 530D7202F7C; Mon, 7 Jul 2025 01:32:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851967; cv=none; b=JlcOPHb6ahG0dATiqPWMi/WP6xun+MPKwGN3Dv4qZaFUtfn0m6TGPdgsVKt3yksD68BxEU004sZjUhqYq478y7GCfEcWhUqCrx9P0V+vzbH1mU0jnv2g5nNld2lj+zMdFHKRokxr+175eUzvJ2wDMVG01Mqf0R51Aa4lQCVhb0o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851967; c=relaxed/simple; bh=S9x3hdeJifMfFlIZ+FR8vfWKzFr5RTKZ2A60y4AiK/o=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=JN03A9Kyk5Yo24s2M4jRQ+1MVgl2OPJkKL6edrTMtjUAi6ztNvh40g989tfARs4rKAOfZ8nJ/EeVmPdzLci8urYn3oR+zpJB/+oAFtkpr/wHEKC9O1yX1a5bNgkcRivXSBGz02rTswI1ryuVv09K6dbIbMnp0f9fWmvkx5gEbG8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dr5NgmzYQv3h; Mon, 7 Jul 2025 09:32:44 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 9288C1A018C; Mon, 7 Jul 2025 09:32:43 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S15; Mon, 07 Jul 2025 09:32:43 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 11/15] md/raid10: check before referencing mddev->bitmap_ops Date: Mon, 7 Jul 2025 09:27:07 +0800 Message-Id: <20250707012711.376844-12-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S15 X-Coremail-Antispam: 1UD129KBjvJXoWxJr4furyDXw1DGr15tF15twb_yoW5JFyrp3 9rtFy3tryUA3yaga15AFyku3WFv3s7tr9rtFyxWw1xGrn7GrnrJF4rWFWjqF1jva45ZF15 X3yDJr45CF1fWF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/raid10.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index c0aa19935881..5397b7e20399 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -3242,7 +3242,8 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, } conf->fullsync =3D 0; } - mddev->bitmap_ops->close_sync(mddev); + if (md_bitmap_enabled(mddev, false)) + mddev->bitmap_ops->close_sync(mddev); close_sync(conf); *skipped =3D 1; return sectors_skipped; @@ -3561,7 +3562,8 @@ static sector_t raid10_sync_request(struct mddev *mdd= ev, sector_t sector_nr, * safety reason, which ensures curr_resync_completed is * updated in bitmap_cond_end_sync. */ - mddev->bitmap_ops->cond_end_sync(mddev, sector_nr, + if (md_bitmap_enabled(mddev, false)) + mddev->bitmap_ops->cond_end_sync(mddev, sector_nr, mddev_is_clustered(mddev) && (sector_nr + 2 * RESYNC_SECTORS > conf->cluster_sync_high)); =20 @@ -4214,7 +4216,6 @@ static int raid10_resize(struct mddev *mddev, sector_= t sectors) */ struct r10conf *conf =3D mddev->private; sector_t oldsize, size; - int ret; =20 if (mddev->reshape_position !=3D MaxSector) return -EBUSY; @@ -4228,9 +4229,12 @@ static int raid10_resize(struct mddev *mddev, sector= _t sectors) mddev->array_sectors > size) return -EINVAL; =20 - ret =3D mddev->bitmap_ops->resize(mddev, size, 0); - if (ret) - return ret; + if (md_bitmap_enabled(mddev, false)) { + int ret =3D mddev->bitmap_ops->resize(mddev, size, 0); + + if (ret) + return ret; + } =20 md_set_array_sectors(mddev, size); if (sectors > mddev->dev_sectors && @@ -4496,7 +4500,8 @@ static int raid10_start_reshape(struct mddev *mddev) oldsize =3D raid10_size(mddev, 0, 0); newsize =3D raid10_size(mddev, 0, conf->geo.raid_disks); =20 - if (!mddev_is_clustered(mddev)) { + if (!mddev_is_clustered(mddev) && + md_bitmap_enabled(mddev, false)) { ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0); if (ret) goto abort; @@ -4519,6 +4524,7 @@ static int raid10_start_reshape(struct mddev *mddev) MD_FEATURE_RESHAPE_ACTIVE)) || (oldsize =3D=3D newsize)) goto out; =20 + /* cluster can't be setup without bitmap */ ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0); if (ret) goto abort; --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D34E20FAAB; Mon, 7 Jul 2025 01:32:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851968; cv=none; b=aCqb24Q8M5n0oHenlHDhr/Vhhpt1dy6OYeMHweWil070ACdXxIinHo8ShXj5dUUGSrI0/SveWuF9e3Kr5fam1mn8YhNUGZKFOruXTC/1h0/Ga7l6mEcHUVn0kvqslDI6AfXsNGFOapK9B9nnpls/AVtYhO6Auytnzjum56bTfqY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851968; c=relaxed/simple; bh=sCFJwX+L8hE6qow8qcXmKz4PdYwVNYDG4IGLshNX0us=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=F3GEGHGJxEgzOtwhUsFz9A0+eZ+BuM/ASk48GBj/bVAbowHoExmk/iyBfvWfQoemrgT9csH0qf22dGiz5LTe+gdroZcGrI+vzZl606CEAQkfXrCgBkpiWGlOA2wPitzyOMmGB9VbjRPUPoNFJGvtQse3HrAdkZ8xDcf0bI3cPOc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.235]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Ds2Tt6zYQtsQ; Mon, 7 Jul 2025 09:32:45 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 2AB411A0FED; Mon, 7 Jul 2025 09:32:44 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S16; Mon, 07 Jul 2025 09:32:43 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 12/15] md/raid5: check before referencing mddev->bitmap_ops Date: Mon, 7 Jul 2025 09:27:08 +0800 Message-Id: <20250707012711.376844-13-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S16 X-Coremail-Antispam: 1UD129KBjvJXoWxJr4DJF15uFy7AFW5KrykXwb_yoW8tFWfp3 9rtFyaqry5ZrZagw4DJFykuF1Fvasrtr9rtryfWwn3Wwn7Gr9rWF4rWFyjqF1jya4rZFWr Jay5AF15CF13WF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/raid5.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 156504ed0dd4..519bbfb67dcb 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -6496,7 +6496,8 @@ static inline sector_t raid5_sync_request(struct mdde= v *mddev, sector_t sector_n &sync_blocks); else /* completed sync */ conf->fullsync =3D 0; - mddev->bitmap_ops->close_sync(mddev); + if (md_bitmap_enabled(mddev, false)) + mddev->bitmap_ops->close_sync(mddev); =20 return 0; } @@ -6534,7 +6535,8 @@ static inline sector_t raid5_sync_request(struct mdde= v *mddev, sector_t sector_n return sync_blocks * RAID5_STRIPE_SECTORS(conf); } =20 - mddev->bitmap_ops->cond_end_sync(mddev, sector_nr, false); + if (md_bitmap_enabled(mddev, false)) + mddev->bitmap_ops->cond_end_sync(mddev, sector_nr, false); =20 sh =3D raid5_get_active_stripe(conf, NULL, sector_nr, R5_GAS_NOBLOCK); @@ -6760,7 +6762,8 @@ static void raid5d(struct md_thread *thread) /* Now is a good time to flush some bitmap updates */ conf->seq_flush++; spin_unlock_irq(&conf->device_lock); - mddev->bitmap_ops->unplug(mddev, true); + if (md_bitmap_enabled(mddev, true)) + mddev->bitmap_ops->unplug(mddev, true); spin_lock_irq(&conf->device_lock); conf->seq_write =3D conf->seq_flush; activate_bit_delay(conf, conf->temp_inactive_list); @@ -8309,7 +8312,6 @@ static int raid5_resize(struct mddev *mddev, sector_t= sectors) */ sector_t newsize; struct r5conf *conf =3D mddev->private; - int ret; =20 if (raid5_has_log(conf) || raid5_has_ppl(conf)) return -EINVAL; @@ -8319,9 +8321,12 @@ static int raid5_resize(struct mddev *mddev, sector_= t sectors) mddev->array_sectors > newsize) return -EINVAL; =20 - ret =3D mddev->bitmap_ops->resize(mddev, sectors, 0); - if (ret) - return ret; + if (md_bitmap_enabled(mddev, false)) { + int ret =3D mddev->bitmap_ops->resize(mddev, sectors, 0); + + if (ret) + return ret; + } =20 md_set_array_sectors(mddev, newsize); if (sectors > mddev->dev_sectors && --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56AB02144CF; Mon, 7 Jul 2025 01:32:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851968; cv=none; b=FE5Xj5CeFf4TpydX6hmOrjGmGUXvbVQXPPROIbwwEnDSjqsSK9nG/mZtpiPu8JYaPDG726vqZoe/oqDQrbUXhzAubyR3KVfST6EROJvmLEBauh1b9tOybG1RESvS0Oq5MTRQeWemkFhPWymA0ZrzhlZbJtm37hZDDg61bjU/xCI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851968; c=relaxed/simple; bh=0a7/WG3mgzgY0l//4NfvK4sbSzedfN6RQRRxNPXW+7E=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=WPPom1nKpEeIQaKaX+axmCNXtLWkjLO7d+2MUdxmmBi8IRkdXhlEjUxVLCQ/1pQ2RXXDCxOn21paMN6Mbcp+nYBcah2a0MWZP3t6nGHxNHmRxbDMULThOD9yKNe3iFodM0bOttqQ7AVyTnzUPnHM2Xb88N0dZT8nb54WqKXm3Yc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.163.216]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Ds6M0CzYQtsQ; Mon, 7 Jul 2025 09:32:45 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id B2FE51A1BAD; Mon, 7 Jul 2025 09:32:44 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S17; Mon, 07 Jul 2025 09:32:44 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 13/15] md/dm-raid: check before referencing mddev->bitmap_ops Date: Mon, 7 Jul 2025 09:27:09 +0800 Message-Id: <20250707012711.376844-14-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S17 X-Coremail-Antispam: 1UD129KBjvJXoWxJr4fJF15Ar1xJr47KFyrXrb_yoW8Xr47pw sxGFWayry3Jr45Xw43XFyv9a40qwn5trZ0yryxJa43XF97XrnxWFyrGFWYq3W0kFyrAFsx Aa1DJr4jkF1jgaUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/dm-raid.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c index 9757c32ea1f5..f11b4e1d9b75 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -3950,9 +3950,11 @@ static int __load_dirty_region_bitmap(struct raid_se= t *rs) !test_and_set_bit(RT_FLAG_RS_BITMAP_LOADED, &rs->runtime_flags)) { struct mddev *mddev =3D &rs->md; =20 - r =3D mddev->bitmap_ops->load(mddev); - if (r) - DMERR("Failed to load bitmap"); + if (md_bitmap_enabled(mddev, false)) { + r =3D mddev->bitmap_ops->load(mddev); + if (r) + DMERR("Failed to load bitmap"); + } } =20 return r; @@ -4067,10 +4069,12 @@ static int raid_preresume(struct dm_target *ti) mddev->bitmap_info.chunksize !=3D to_bytes(rs->requested_bitmap_ch= unk_sectors)))) { int chunksize =3D to_bytes(rs->requested_bitmap_chunk_sectors) ?: mddev-= >bitmap_info.chunksize; =20 - r =3D mddev->bitmap_ops->resize(mddev, mddev->dev_sectors, - chunksize); - if (r) - DMERR("Failed to resize bitmap"); + if (md_bitmap_enabled(mddev, false)) { + r =3D mddev->bitmap_ops->resize(mddev, mddev->dev_sectors, + chunksize); + if (r) + DMERR("Failed to resize bitmap"); + } } =20 /* Check for any resize/reshape on @rs and adjust/initiate */ --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout12.his.huawei.com (dggsgout12.his.huawei.com [45.249.212.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7CDDA215077; Mon, 7 Jul 2025 01:32:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.56 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851973; cv=none; b=MMV3AwBV6qnB4KsmnPOatzcNUQa/EJmIxq5b/2aialWeWctd3Yw4lrTt5y3AsNa+vFU66unELkz36m9wu4uU0Eg2tKqCercnHCzAhW3KnXyS7v5Xj5ofR5yKEPURuuiJtEhHgz+6IuG5ASIoT04Bp3s7LceR6EZnCJk4W7q+qH8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851973; c=relaxed/simple; bh=Sdiy6j0WC+m4Q6ASAdQP14zPihhovqD7Xz7GFbD7pq8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=TMi6RuwSeQmlU45SoNyBaHIQEkQcgRLFJLCnBus5MdDKZGNZLRSWn3KscHQx/XApIjYqImv3uSVDoin1FvtPArfdWLWCNTzB5hMzv32KMKZINHY0O8Le11/0z+sgYXheQf3hg0Pe7FgpnP3wvJE7Kq93Bbusb7QkpF47Ymlgy5s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout12.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dt5t24zKHMkQ; Mon, 7 Jul 2025 09:32:46 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id 47B671A0D27; Mon, 7 Jul 2025 09:32:45 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S18; Mon, 07 Jul 2025 09:32:45 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 14/15] md: check before referencing mddev->bitmap_ops Date: Mon, 7 Jul 2025 09:27:10 +0800 Message-Id: <20250707012711.376844-15-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S18 X-Coremail-Antispam: 1UD129KBjvJXoW3Jr4DGryUXFyUWw4xKw4Durg_yoW3AFWfp3 yxt3Z8KrW5XrWfWw47AFyv9F1rXwn7tr9rtryxXw13Gr1rJrnxWF4rWFy8tr15C348AFn8 Zw4rta1rCr17WF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/md.c | 68 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/drivers/md/md.c b/drivers/md/md.c index 7ed95e5e43fc..2f7e8d77e7ef 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -1346,6 +1346,9 @@ static u64 md_bitmap_events_cleared(struct mddev *mdd= ev) struct md_bitmap_stats stats; int err; =20 + if (!md_bitmap_enabled(mddev, false)) + return 0; + err =3D mddev->bitmap_ops->get_stats(mddev->bitmap, &stats); if (err) return 0; @@ -2303,13 +2306,15 @@ static int super_1_allow_new_offset(struct md_rdev *rdev, unsigned long long new_offset) { + struct mddev *mddev =3D rdev->mddev; + /* All necessary checks on new >=3D old have been done */ if (new_offset >=3D rdev->data_offset) return 1; =20 /* with 1.0 metadata, there is no metadata to tread on * so we can always move back */ - if (rdev->mddev->minor_version =3D=3D 0) + if (mddev->minor_version =3D=3D 0) return 1; =20 /* otherwise we must be sure not to step on @@ -2321,8 +2326,7 @@ super_1_allow_new_offset(struct md_rdev *rdev, if (rdev->sb_start + (32+4)*2 > new_offset) return 0; =20 - if (!rdev->mddev->bitmap_info.file) { - struct mddev *mddev =3D rdev->mddev; + if (md_bitmap_registered(mddev) && !mddev->bitmap_info.file) { struct md_bitmap_stats stats; int err; =20 @@ -2794,7 +2798,8 @@ void md_update_sb(struct mddev *mddev, int force_chan= ge) =20 mddev_add_trace_msg(mddev, "md md_update_sb"); rewrite: - mddev->bitmap_ops->update_sb(mddev->bitmap); + if (md_bitmap_enabled(mddev, false)) + mddev->bitmap_ops->update_sb(mddev->bitmap); rdev_for_each(rdev, mddev) { if (rdev->sb_loaded !=3D 1) continue; /* no noise on spare devices */ @@ -4670,6 +4675,9 @@ bitmap_store(struct mddev *mddev, const char *buf, si= ze_t len) unsigned long chunk, end_chunk; int err; =20 + if (!md_bitmap_enabled(mddev, false)) + return len; + err =3D mddev_lock(mddev); if (err) return err; @@ -5995,7 +6003,7 @@ struct mddev *md_alloc(dev_t dev, char *name) return ERR_PTR(error); } =20 - if (mddev->bitmap_ops && mddev->bitmap_ops->group) + if (md_bitmap_registered(mddev) && mddev->bitmap_ops->group) if (sysfs_create_group(&mddev->kobj, mddev->bitmap_ops->group)) pr_warn("md: cannot register extra bitmap attributes for %s\n", mdname(mddev)); @@ -6239,7 +6247,7 @@ int md_run(struct mddev *mddev) (unsigned long long)pers->size(mddev, 0, 0) / 2); err =3D -EINVAL; } - if (err =3D=3D 0 && pers->sync_request && + if (err =3D=3D 0 && pers->sync_request && md_bitmap_registered(mddev) && (mddev->bitmap_info.file || mddev->bitmap_info.offset)) { err =3D mddev->bitmap_ops->create(mddev); if (err) @@ -6314,7 +6322,8 @@ int md_run(struct mddev *mddev) pers->free(mddev, mddev->private); mddev->private =3D NULL; put_pers(pers); - mddev->bitmap_ops->destroy(mddev); + if (md_bitmap_registered(mddev)) + mddev->bitmap_ops->destroy(mddev); abort: bioset_exit(&mddev->io_clone_set); exit_sync_set: @@ -6334,10 +6343,12 @@ int do_md_run(struct mddev *mddev) if (err) goto out; =20 - err =3D mddev->bitmap_ops->load(mddev); - if (err) { - mddev->bitmap_ops->destroy(mddev); - goto out; + if (md_bitmap_registered(mddev)) { + err =3D mddev->bitmap_ops->load(mddev); + if (err) { + mddev->bitmap_ops->destroy(mddev); + goto out; + } } =20 if (mddev_is_clustered(mddev)) @@ -6476,7 +6487,8 @@ static void __md_stop_writes(struct mddev *mddev) mddev->pers->quiesce(mddev, 0); } =20 - mddev->bitmap_ops->flush(mddev); + if (md_bitmap_enabled(mddev, true)) + mddev->bitmap_ops->flush(mddev); =20 if (md_is_rdwr(mddev) && ((!mddev->in_sync && !mddev_is_clustered(mddev)) || @@ -6503,7 +6515,8 @@ EXPORT_SYMBOL_GPL(md_stop_writes); =20 static void mddev_detach(struct mddev *mddev) { - mddev->bitmap_ops->wait_behind_writes(mddev); + if (md_bitmap_enabled(mddev, false)) + mddev->bitmap_ops->wait_behind_writes(mddev); if (mddev->pers && mddev->pers->quiesce && !is_md_suspended(mddev)) { mddev->pers->quiesce(mddev, 1); mddev->pers->quiesce(mddev, 0); @@ -6519,7 +6532,8 @@ static void __md_stop(struct mddev *mddev) { struct md_personality *pers =3D mddev->pers; =20 - mddev->bitmap_ops->destroy(mddev); + if (md_bitmap_registered(mddev)) + mddev->bitmap_ops->destroy(mddev); mddev_detach(mddev); spin_lock(&mddev->lock); mddev->pers =3D NULL; @@ -7236,6 +7250,9 @@ static int set_bitmap_file(struct mddev *mddev, int f= d) { int err =3D 0; =20 + if (!md_bitmap_registered(mddev)) + return -EINVAL; + if (mddev->pers) { if (!mddev->pers->quiesce || !mddev->thread) return -EBUSY; @@ -7586,6 +7603,14 @@ static int update_array_info(struct mddev *mddev, md= u_array_info_t *info) rv =3D update_raid_disks(mddev, info->raid_disks); =20 if ((state ^ info->state) & (1<pers->quiesce =3D=3D NULL || mddev->thread =3D=3D NULL) { rv =3D -EINVAL; goto err; @@ -8420,6 +8445,9 @@ static void md_bitmap_status(struct seq_file *seq, st= ruct mddev *mddev) unsigned long chunk_kb; int err; =20 + if (!md_bitmap_enabled(mddev, false)) + return; + err =3D mddev->bitmap_ops->get_stats(mddev->bitmap, &stats); if (err) return; @@ -8822,7 +8850,7 @@ static void md_end_clone_io(struct bio *bio) struct bio *orig_bio =3D md_io_clone->orig_bio; struct mddev *mddev =3D md_io_clone->mddev; =20 - if (bio_data_dir(orig_bio) =3D=3D WRITE && mddev->bitmap) + if (bio_data_dir(orig_bio) =3D=3D WRITE && md_bitmap_enabled(mddev, false= )) md_bitmap_end(mddev, md_io_clone); =20 if (bio->bi_status && !orig_bio->bi_status) @@ -8849,7 +8877,7 @@ static void md_clone_bio(struct mddev *mddev, struct = bio **bio) if (blk_queue_io_stat(bdev->bd_disk->queue)) md_io_clone->start_time =3D bio_start_io_acct(*bio); =20 - if (bio_data_dir(*bio) =3D=3D WRITE && mddev->bitmap) { + if (bio_data_dir(*bio) =3D=3D WRITE && md_bitmap_enabled(mddev, false)) { md_io_clone->offset =3D (*bio)->bi_iter.bi_sector; md_io_clone->sectors =3D bio_sectors(*bio); md_bitmap_start(mddev, md_io_clone); @@ -8873,7 +8901,7 @@ void md_free_cloned_bio(struct bio *bio) struct bio *orig_bio =3D md_io_clone->orig_bio; struct mddev *mddev =3D md_io_clone->mddev; =20 - if (bio_data_dir(orig_bio) =3D=3D WRITE && mddev->bitmap) + if (bio_data_dir(orig_bio) =3D=3D WRITE && md_bitmap_enabled(mddev, false= )) md_bitmap_end(mddev, md_io_clone); =20 if (bio->bi_status && !orig_bio->bi_status) @@ -9598,7 +9626,7 @@ static void md_start_sync(struct work_struct *ws) * We are adding a device or devices to an array which has the bitmap * stored on all devices. So make sure all bitmap pages get written. */ - if (spares) + if (spares && md_bitmap_enabled(mddev, true)) mddev->bitmap_ops->write_all(mddev); =20 name =3D test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) ? @@ -9686,7 +9714,7 @@ static void unregister_sync_thread(struct mddev *mdde= v) */ void md_check_recovery(struct mddev *mddev) { - if (mddev->bitmap) + if (md_bitmap_enabled(mddev, false)) mddev->bitmap_ops->daemon_work(mddev); =20 if (signal_pending(current)) { @@ -10066,7 +10094,7 @@ static void check_sb_changes(struct mddev *mddev, s= truct md_rdev *rdev) ret =3D mddev->pers->resize(mddev, le64_to_cpu(sb->size)); if (ret) pr_info("md-cluster: resize failed\n"); - else + else if (md_bitmap_enabled(mddev, false)) mddev->bitmap_ops->update_sb(mddev->bitmap); } =20 --=20 2.39.2 From nobody Tue Oct 7 19:56:40 2025 Received: from dggsgout11.his.huawei.com (dggsgout11.his.huawei.com [45.249.212.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 531AF1C7017; Mon, 7 Jul 2025 01:32:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=45.249.212.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851971; cv=none; b=CjbfPC+E8QRJ1Iq42iBykJYx8erLT4taBN4YK4HZgi+YhEuIosaobrO2CjKyOWqTW4hS4AGtO0HC0y+x40BX6rLNx9GLCjmRp25q8fiMjc8wiBm/xyBxWugJtusX3mZGK9rApJL6sQ/eAqfdSM8MFjsI3pAp929YzULWDqQO7ao= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1751851971; c=relaxed/simple; bh=n27BftNqXRM7r3ieQZr04aRkNFf2LZTYJj09JWVEgy8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dvAIHp1fP8GqxYTpqby4kyFHuHKdOiGPQ6Ug3bZJTaYcmyW+maz7TUtNQEBSiWaVPoRlBnyZTFcn59ZZr+oW62knnaaYdFsGY1Yvc8oLrmlBZLS9W8ftR6Z8y9/LQ2h3SHFlVn4DXX0dVX6Mfca7kwrl0EUpKWq3eHbhyissM8g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com; spf=pass smtp.mailfrom=huaweicloud.com; arc=none smtp.client-ip=45.249.212.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=huaweicloud.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huaweicloud.com Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTPS id 4bb6Dv0BJGzYQv55; Mon, 7 Jul 2025 09:32:47 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.252]) by mail.maildlp.com (Postfix) with ESMTP id D2AD01A0CEC; Mon, 7 Jul 2025 09:32:45 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP3 (Coremail) with SMTP id _Ch0CgDnSCazI2to_nSRAw--.35890S19; Mon, 07 Jul 2025 09:32:45 +0800 (CST) From: Yu Kuai To: agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com, song@kernel.org, yukuai3@huawei.com Cc: dm-devel@lists.linux.dev, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com, johnny.chenyi@huawei.com Subject: [PATCH v5 15/15] md/md-bitmap: introduce CONFIG_MD_BITMAP Date: Mon, 7 Jul 2025 09:27:11 +0800 Message-Id: <20250707012711.376844-16-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250707012711.376844-1-yukuai1@huaweicloud.com> References: <20250707012711.376844-1-yukuai1@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-CM-TRANSID: _Ch0CgDnSCazI2to_nSRAw--.35890S19 X-Coremail-Antispam: 1UD129KBjvJXoWxKF4rWw4fury3CrWrWFWDCFg_yoWfJF1kpF WrJF15Cr45JFWaqa17Ja4DuFyYqr1ktr9rtryfGw1rCF9xXr98JF4rWFyUtrykGFyxZFsx Za1rGFWUCF1UWr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_tr0E3s1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F 4UJwA2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq 3wAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7 IYx2IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4U M4x0Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2 kIc2xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkE bVWUJVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67 AF67kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVW8JVW5JwCI 42IY6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJwCI42IY6xAIw20EY4v20xvaj40_Jr0_JF 4lIxAIcVC2z280aVAFwI0_Gr0_Cr1lIxAIcVC2z280aVCY1x0267AKxVW8Jr0_Cr1UYxBI daVFxhVjvjDU0xZFpf9x0JUQFxUUUUUU= X-CM-SenderInfo: 51xn3trlr6x35dzhxuhorxvhhfrp/ Content-Type: text/plain; charset="utf-8" From: Yu Kuai Now that all implementations are internal, it's sensible to add a config option for md-bitmap, and it's a good way for isolation. Signed-off-by: Yu Kuai Reviewed-by: Xiao Ni --- drivers/md/Kconfig | 18 ++++++++++++++++++ drivers/md/Makefile | 3 ++- drivers/md/md-bitmap.c | 23 +++++++++++++++++++++-- drivers/md/md-bitmap.h | 17 +++++++++++++++-- drivers/md/md.c | 40 ++++++++++++++++++++++++++++------------ drivers/md/md.h | 3 +-- 6 files changed, 85 insertions(+), 19 deletions(-) diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index ddb37f6670de..f913579e731c 100644 --- a/drivers/md/Kconfig +++ b/drivers/md/Kconfig @@ -37,6 +37,21 @@ config BLK_DEV_MD =20 If unsure, say N. =20 +config MD_BITMAP + bool "MD RAID bitmap support" + default y + depends on BLK_DEV_MD + help + If you say Y here, support for the write intent bitmap will be + enabled. The bitmap can be used to optimize resync speed after power + failure or readding a disk, limiting it to recorded dirty sectors in + bitmap. + + This feature can be added to existing MD array or MD array can be + created with bitmap via mdadm(8). + + If unsure, say Y. + config MD_AUTODETECT bool "Autodetect RAID arrays during kernel boot" depends on BLK_DEV_MD=3Dy @@ -54,6 +69,7 @@ config MD_AUTODETECT config MD_BITMAP_FILE bool "MD bitmap file support (deprecated)" default y + depends on MD_BITMAP help If you say Y here, support for write intent bitmaps in files on an external file system is enabled. This is an alternative to the internal @@ -174,6 +190,7 @@ config MD_RAID456 =20 config MD_CLUSTER tristate "Cluster Support for MD" + select MD_BITMAP depends on BLK_DEV_MD depends on DLM default n @@ -393,6 +410,7 @@ config DM_RAID select MD_RAID1 select MD_RAID10 select MD_RAID456 + select MD_BITMAP select BLK_DEV_MD help A dm target that supports RAID1, RAID10, RAID4, RAID5 and RAID6 mappings diff --git a/drivers/md/Makefile b/drivers/md/Makefile index 87bdfc9fe14c..2e18147a9c40 100644 --- a/drivers/md/Makefile +++ b/drivers/md/Makefile @@ -27,7 +27,8 @@ dm-clone-y +=3D dm-clone-target.o dm-clone-metadata.o dm-verity-y +=3D dm-verity-target.o dm-zoned-y +=3D dm-zoned-target.o dm-zoned-metadata.o dm-zoned-reclaim.o =20 -md-mod-y +=3D md.o md-bitmap.o +md-mod-y +=3D md.o +md-mod-$(CONFIG_MD_BITMAP) +=3D md-bitmap.o raid456-y +=3D raid5.o raid5-cache.o raid5-ppl.o linear-y +=3D md-linear.o =20 diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 5bd75fa6ee1d..28dd66ab8df9 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -224,6 +224,8 @@ struct bitmap { int cluster_slot; }; =20 +static struct workqueue_struct *md_bitmap_wq; + static int __bitmap_resize(struct bitmap *bitmap, sector_t blocks, int chunksize, bool init); =20 @@ -2980,6 +2982,12 @@ static struct attribute_group md_bitmap_group =3D { }; =20 static struct bitmap_operations bitmap_ops =3D { + .head =3D { + .type =3D MD_BITMAP, + .id =3D ID_BITMAP, + .name =3D "bitmap", + }, + .enabled =3D bitmap_enabled, .create =3D bitmap_create, .resize =3D bitmap_resize, @@ -3014,7 +3022,18 @@ static struct bitmap_operations bitmap_ops =3D { .group =3D &md_bitmap_group, }; =20 -void mddev_set_bitmap_ops(struct mddev *mddev) +int md_bitmap_init(void) +{ + md_bitmap_wq =3D alloc_workqueue("md_bitmap", WQ_MEM_RECLAIM | WQ_UNBOUND, + 0); + if (!md_bitmap_wq) + return -ENOMEM; + + return register_md_submodule(&bitmap_ops.head); +} + +void md_bitmap_exit(void) { - mddev->bitmap_ops =3D &bitmap_ops; + destroy_workqueue(md_bitmap_wq); + unregister_md_submodule(&bitmap_ops.head); } diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index 61cfc650c69c..42f91755a341 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -62,6 +62,8 @@ struct md_bitmap_stats { }; =20 struct bitmap_operations { + struct md_submodule_head head; + bool (*enabled)(void *data, bool flush); int (*create)(struct mddev *mddev); int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize); @@ -105,8 +107,6 @@ struct bitmap_operations { }; =20 /* the bitmap API */ -void mddev_set_bitmap_ops(struct mddev *mddev); - static inline bool md_bitmap_registered(struct mddev *mddev) { return mddev->bitmap_ops !=3D NULL; @@ -147,4 +147,17 @@ static inline void md_bitmap_end_sync(struct mddev *md= dev, sector_t offset, mddev->bitmap_ops->end_sync(mddev, offset, blocks); } =20 +#ifdef CONFIG_MD_BITMAP +int md_bitmap_init(void); +void md_bitmap_exit(void); +#else +static inline int md_bitmap_init(void) +{ + return 0; +} +static inline void md_bitmap_exit(void) +{ +} +#endif + #endif diff --git a/drivers/md/md.c b/drivers/md/md.c index 2f7e8d77e7ef..c2a90d8ec06d 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -94,7 +94,6 @@ static struct workqueue_struct *md_wq; * workqueue whith reconfig_mutex grabbed. */ static struct workqueue_struct *md_misc_wq; -struct workqueue_struct *md_bitmap_wq; =20 static int remove_and_add_spares(struct mddev *mddev, struct md_rdev *this); @@ -670,15 +669,34 @@ static void active_io_release(struct percpu_ref *ref) =20 static void no_op(struct percpu_ref *r) {} =20 +static void mddev_set_bitmap_ops(struct mddev *mddev, enum md_submodule_id= id) +{ + xa_lock(&md_submodule); + mddev->bitmap_ops =3D xa_load(&md_submodule, id); + xa_unlock(&md_submodule); + if (!mddev->bitmap_ops) + pr_warn_once("md: can't find bitmap id %d\n", id); +} + +static void mddev_clear_bitmap_ops(struct mddev *mddev) +{ + mddev->bitmap_ops =3D NULL; +} + int mddev_init(struct mddev *mddev) { + /* TODO: support more versions */ + mddev_set_bitmap_ops(mddev, ID_BITMAP); =20 if (percpu_ref_init(&mddev->active_io, active_io_release, - PERCPU_REF_ALLOW_REINIT, GFP_KERNEL)) + PERCPU_REF_ALLOW_REINIT, GFP_KERNEL)) { + mddev_clear_bitmap_ops(mddev); return -ENOMEM; + } =20 if (percpu_ref_init(&mddev->writes_pending, no_op, PERCPU_REF_ALLOW_REINIT, GFP_KERNEL)) { + mddev_clear_bitmap_ops(mddev); percpu_ref_exit(&mddev->active_io); return -ENOMEM; } @@ -706,7 +724,6 @@ int mddev_init(struct mddev *mddev) mddev->resync_min =3D 0; mddev->resync_max =3D MaxSector; mddev->level =3D LEVEL_NONE; - mddev_set_bitmap_ops(mddev); =20 INIT_WORK(&mddev->sync_work, md_start_sync); INIT_WORK(&mddev->del_work, mddev_delayed_delete); @@ -717,6 +734,7 @@ EXPORT_SYMBOL_GPL(mddev_init); =20 void mddev_destroy(struct mddev *mddev) { + mddev_clear_bitmap_ops(mddev); percpu_ref_exit(&mddev->active_io); percpu_ref_exit(&mddev->writes_pending); } @@ -10038,8 +10056,12 @@ static void md_geninit(void) =20 static int __init md_init(void) { - int ret =3D -ENOMEM; + int ret =3D md_bitmap_init(); =20 + if (ret) + return ret; + + ret =3D -ENOMEM; md_wq =3D alloc_workqueue("md", WQ_MEM_RECLAIM, 0); if (!md_wq) goto err_wq; @@ -10048,11 +10070,6 @@ static int __init md_init(void) if (!md_misc_wq) goto err_misc_wq; =20 - md_bitmap_wq =3D alloc_workqueue("md_bitmap", WQ_MEM_RECLAIM | WQ_UNBOUND, - 0); - if (!md_bitmap_wq) - goto err_bitmap_wq; - ret =3D __register_blkdev(MD_MAJOR, "md", md_probe); if (ret < 0) goto err_md; @@ -10071,12 +10088,11 @@ static int __init md_init(void) err_mdp: unregister_blkdev(MD_MAJOR, "md"); err_md: - destroy_workqueue(md_bitmap_wq); -err_bitmap_wq: destroy_workqueue(md_misc_wq); err_misc_wq: destroy_workqueue(md_wq); err_wq: + md_bitmap_exit(); return ret; } =20 @@ -10379,8 +10395,8 @@ static __exit void md_exit(void) spin_unlock(&all_mddevs_lock); =20 destroy_workqueue(md_misc_wq); - destroy_workqueue(md_bitmap_wq); destroy_workqueue(md_wq); + md_bitmap_exit(); } =20 subsys_initcall(md_init); diff --git a/drivers/md/md.h b/drivers/md/md.h index d6fba4240f97..b7dc8253efd8 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -38,7 +38,7 @@ enum md_submodule_id { ID_RAID6 =3D 6, ID_RAID10 =3D 10, ID_CLUSTER, - ID_BITMAP, /* TODO */ + ID_BITMAP, ID_LLBITMAP, /* TODO */ }; =20 @@ -1012,7 +1012,6 @@ struct mdu_array_info_s; struct mdu_disk_info_s; =20 extern int mdp_major; -extern struct workqueue_struct *md_bitmap_wq; void md_autostart_arrays(int part); int md_set_array_info(struct mddev *mddev, struct mdu_array_info_s *info); int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info); --=20 2.39.2