From nobody Mon Feb 9 09:49:01 2026 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 EED27DDD3; Thu, 23 Jan 2025 02:13:20 +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=1737598404; cv=none; b=j3mkwWKi49ETBvbc6ttqA+AUKIurfehwm/hkMjRz3vJR2y7hyZf1sXwOFBnMYq7U6STgrbWYf4Mma+QKgpJfCS96LsS//EArIGr4wUaokhgV8+h6XfCVzJrYHuj4FgzImMG4XN9zU9i2ONxLVncTyT0QjG6K6OS3wXuQKJOasco= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598404; c=relaxed/simple; bh=pm5Slt+znNC5SPnFqwk7Wf51U1EHBt58KIWvpUjsnZk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=SiMFGIQt8ErKOlHgJeCM2LDHmDDyn+REZSe8tWolFNiZxS8/ItlPlxUFNv0Afv6yP8lZYBUSXMioFlDcMTlolLBXfHQsm/Sh3eaTreayUgbQeL5ETcsQcmeybnjQ+LwQGmpOYaCVjyFJtHoK0VaoKsiy1Pye5bm3vGdp5rnguqg= 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 ESMTP id 4YdkxN6vG7z4f3khp; Thu, 23 Jan 2025 10:12:56 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 9538F1A1380; Thu, 23 Jan 2025 10:13:17 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S5; Thu, 23 Jan 2025 10:13:17 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 01/11] md/md-bitmap: remove the parameter 'init' for bitmap_ops->resize() Date: Thu, 23 Jan 2025 10:07:20 +0800 Message-Id: <20250123020730.2003602-2-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S5 X-Coremail-Antispam: 1UD129KBjvJXoWxJFyxAr15tr1xWw13XF4fKrg_yoWrKw1Dpa 17tFy3A345KrW5Wa1UXFykuFyFq34ktr9rKryxC34fWF9rXrZrXF4rWFWqqF1Dta45XFZI qan8trWUCF1xXFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUm014x267AKxVW5JVWrJwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jr4l82xGYIkIc2 x26xkF7I0E14v26r4j6ryUM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_Gr1j6F4UJw A2z4x0Y4vEx4A2jsIE14v26rxl6s0DM28EF7xvwVC2z280aVCY1x0267AKxVW0oVCq3wAS 0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv7VC0I7IYx2 IY67AKxVWUJVWUGwAv7VC2z280aVAFwI0_Jr0_Gr1lOx8S6xCaFVCjc4AY6r1j6r4UM4x0 Y48IcxkI7VAKI48JM4x0x7Aq67IIx4CEVc8vx2IErcIFxwACI402YVCY1x02628vn2kIc2 xKxwCY1x0262kKe7AKxVWUtVW8ZwCF04k20xvY0x0EwIxGrwCFx2IqxVCFs4IE7xkEbVWU JVW8JwC20s026c02F40E14v26r1j6r18MI8I3I0E7480Y4vE14v26r106r1rMI8E67AF67 kF1VAFwI0_Jw0_GFylIxkGc2Ij64vIr41lIxAIcVC0I7IYx2IY67AKxVWUJVWUCwCI42IY 6xIIjxv20xvEc7CjxVAFwI0_Gr0_Cr1lIxAIcVCF04k26cxKx2IYs7xG6r1j6r1xMIIF0x vEx4A2jsIE14v26r1j6r4UMIIF0xvEx4A2jsIEc7CjxVAFwI0_Gr0_Gr1UYxBIdaVFxhVj vjDU0xZFpf9x0JU2dgAUUUUU= 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 --- 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 1e0d3b9b75d6..0ca73b571c7d 100644 --- a/drivers/md/dm-raid.c +++ b/drivers/md/dm-raid.c @@ -4069,7 +4069,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 ec4ecd96e6b1..b745eb6ad0e4 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2581,15 +2581,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 31c93019c76b..6d1ab949ed95 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -73,8 +73,7 @@ struct md_bitmap_stats { struct bitmap_operations { bool (*enabled)(struct mddev *mddev); int (*create)(struct mddev *mddev, int slot); - 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 6595f89becdb..67898a02bd3a 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 a5cd6522fc2d..49960fbcffca 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -3334,7 +3334,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 e1e6cd7fb125..8d4d19012f42 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -4248,7 +4248,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 @@ -4517,7 +4517,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 @@ -4539,13 +4539,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 md_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 5c79429acc64..8f33d2478d94 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -8331,7 +8331,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 Mon Feb 9 09:49:01 2026 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 6C433125B2; Thu, 23 Jan 2025 02:13:21 +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=1737598406; cv=none; b=kGuJRBo62L8tr+Q5gNWNY/k1yXUVv3flUxsW3zRg+nYOLhvDF3CXD+wuBveyI2dgj+z15sztUQqGUi3VnN0OboHcSHuXten3O54dn9ePxrN2I52shk4Arw4nFwtUsa1G/HFrC5AApkyqQ97ntDWZs1V5X7xQAYhJVyfhu+GmJRY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598406; c=relaxed/simple; bh=I3Kb1Sc33g9dQI2co3vGh8L+ZqgO2/PTBk1Wsifb4iU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=PhwNvqXAdCjZEtJU1ql+fw2zZmi5Ejtydg8YAyNNvJtHB/7+HJl2A0pTtR6klw56jbP9EniZP4bPqbnYK/pBkPAzOTp/jrgjgSP3ZPeo65VHPEueGTHlGusPJ/2Vt+PsoQQLXyob3r63SflOVUfcK1A0h+v9bdTUJyoQxpTumrI= 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 ESMTP id 4YdkxV4TVQz4f3jsy; Thu, 23 Jan 2025 10:13:02 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 188EF1A0A4A; Thu, 23 Jan 2025 10:13:18 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S6; Thu, 23 Jan 2025 10:13:17 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 02/11] md/md-bitmap: merge md_bitmap_group into bitmap_operations Date: Thu, 23 Jan 2025 10:07:21 +0800 Message-Id: <20250123020730.2003602-3-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S6 X-Coremail-Antispam: 1UD129KBjvJXoWxXFy5CFWktFWrtFWrAF4kXrb_yoW5WryDpF ZrJ343Zw1rJF45Xa17Z34DuFyrX3s7trZrKrWfC34F9Fy7XasxJr48KayUArn0gFy3CFsI qw1Yyw1Uur18WF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUm014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_Jryl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 Now that all bitmap implementations are internal, it doesn't make sense to export md_bitmap_group anymore. Signed-off-by: Yu Kuai --- 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 b745eb6ad0e4..f3e78d416490 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2977,7 +2977,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, }; @@ -3013,6 +3014,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 6d1ab949ed95..5a2aa1324df0 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -109,6 +109,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 866015b681af..c9c17a68cdff 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -5682,7 +5682,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 @@ -5924,6 +5923,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 def808064ad8..87edf81c25b0 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -756,7 +756,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 Mon Feb 9 09:49:01 2026 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 928F8179A7; Thu, 23 Jan 2025 02:13:21 +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=1737598403; cv=none; b=WeG30sPRIRp07mMXP3dQbLkcm6evuc+biCgv5VqTCs/49lrDFMAnzFU+Y9T/jKdIox/6FIOwvSjoRhiMDzsZRcuXq7nC5b9FRaHNbowSeJpWz4tdtSPVKGHYYmS84ZVais5AqFXRpS+Iv/xi7F19qYifyzfLv9u8jJIWdD92SDQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598403; c=relaxed/simple; bh=tnfdDT6+GA63dV1ZlMryC5NpryZJM0aehtqtaIrU5ho=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=pSTnYgdnF8YgR7xR3sSWM7S6oR37UekGfBj0qwGKfC06yCXA/0ovhI8Ss3awbKLpUCS01kW/nHC0Q1brk/ZmlQiyJPXaShCr9701UeHR9DeQcVs2ywUWs6QYCFOUh38el3f7VVjr9r0FKmZQC9fQXpp1knlHMse71Hks4zOdhgo= 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 ESMTP id 4YdkxN4myVz4f3jLW; Thu, 23 Jan 2025 10:12:56 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 923461A1094; Thu, 23 Jan 2025 10:13:18 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S7; Thu, 23 Jan 2025 10:13:18 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 03/11] md/md-bitmap: add md_bitmap_registered/enabled() helper Date: Thu, 23 Jan 2025 10:07:22 +0800 Message-Id: <20250123020730.2003602-4-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S7 X-Coremail-Antispam: 1UD129KBjvJXoWxur1UJF48KF47uFW5ur1ftFb_yoW5AFy3p3 9rta43Cr45JFWaga17AFWkua4Yqwn7trZrKryfC34ruFy3ZFs8GF4FgayUt3Z7t343AFsI vw4rtr4UCr1UWF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUm014x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JrWl82xGYIkIc2 x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2z4x0 Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 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 --- 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 f3e78d416490..8e14bbfbfc88 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -220,22 +220,14 @@ 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(void *data) { + struct bitmap *bitmap =3D data; + return bitmap->storage.filemap && !test_bit(BITMAP_STALE, &bitmap->flags); } =20 -static bool bitmap_enabled(struct mddev *mddev) -{ - struct bitmap *bitmap =3D mddev->bitmap; - - if (!bitmap) - return false; - - return __bitmap_enabled(bitmap); -} - /* * check a page and, if necessary, allocate it (or hijack it if the alloc = fails) * @@ -1232,7 +1224,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)) 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 5a2aa1324df0..3b242ee10856 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -71,7 +71,7 @@ struct md_bitmap_stats { }; =20 struct bitmap_operations { - bool (*enabled)(struct mddev *mddev); + bool (*enabled)(void *data); int (*create)(struct mddev *mddev, int slot); int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize); =20 @@ -116,4 +116,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) +{ + /* 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); +} + #endif diff --git a/drivers/md/raid1-10.c b/drivers/md/raid1-10.c index 4378d3250bd7..6b8b7b7f1678 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 (!md_bitmap_enabled(mddev)) { raid1_submit_write(bio); return true; } --=20 2.39.2 From nobody Mon Feb 9 09:49:01 2026 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 6F3B31B960; Thu, 23 Jan 2025 02:13:22 +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=1737598404; cv=none; b=nPShpaa9EU9JL7g2tARVeWDTG8TLtZ4CJYhIi5CgrbIiJIk+bvmnzWB++byvFL61khbL7qjTs2qWNkQWQru8wVejGgyTvTreZlMneQhKzscrpErtuAZEkswKC9gh/w6NUYEr7sEqNs6TeNQDIYJicAMFyfER2dhpUlxhYCbj34w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598404; c=relaxed/simple; bh=3SFOrsjQF4HrzruxXJTlhZKA/xezoD9Lf4rRPOYVGyE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=dC9/HcOfOcBCcAYswFYdZQmcc/2EoPT9Gg1w4avud8+w9W6IlvOkXMrMVm2Bk0lvj0VieLlLN7ZI2r1m3mJBlx4EG6QqWgreni1xSLDG8Jqq6hky3u63I04PUGqUQfdni0jPTMQpui4IazxOBjq81T7b5hFbR4vo42odoeyXmWE= 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 ESMTP id 4YdkxQ2p8Gz4f3khl; Thu, 23 Jan 2025 10:12:58 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 0C56B1A1092; Thu, 23 Jan 2025 10:13:19 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S8; Thu, 23 Jan 2025 10:13:18 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 04/11] md/md-bitmap: handle the case bitmap is not enabled before start_sync() Date: Thu, 23 Jan 2025 10:07:23 +0800 Message-Id: <20250123020730.2003602-5-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S8 X-Coremail-Antispam: 1UD129KBjvJXoW3Gr1UKF15uryrJw15uryrtFb_yoW7ArWrpw s7JFy3Kw45WFW5X3W7AFyDuFyFv3srtFZrtr1fW34fWFykGFykAF48WFyjqFyqgFyFyF98 X3Z8AF45CFyaqFJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 This case can be handled without knowing internal implementation. Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai --- 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 8e14bbfbfc88..33f952c78397 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -1769,15 +1769,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 3b242ee10856..6a5806ebb11a 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -133,4 +133,16 @@ static inline bool md_bitmap_enabled(struct mddev *mdd= ev) return mddev->bitmap_ops->enabled(mddev->bitmap); } =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)) { + *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 49960fbcffca..f6943849f34a 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2827,7 +2827,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; @@ -3002,8 +3002,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 8d4d19012f42..ca594d56f8d0 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -3358,9 +3358,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 && @@ -3403,9 +3402,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; @@ -3581,9 +3579,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 8f33d2478d94..5b825c196b56 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -6534,8 +6534,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)); @@ -6566,9 +6565,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 Mon Feb 9 09:49:01 2026 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 7962D1DA53; Thu, 23 Jan 2025 02:13:22 +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=1737598404; cv=none; b=tCMfiXQCPAS/14E6mU6IczwCbyg8oU+2pG0AwliOSr0efrrCERERFneaeYGxQaVZXf0e/BwVhPYCbjpUySMxftoS/38DBe55ysRouh1hXZpqu9bLXITVa3+sj28XPT4D0/aldvmwA3dLwoBP3LbdCFJPRBfTUP9oB2IIrqF4wXk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598404; c=relaxed/simple; bh=I4LoQebpJtSEWMHcIa2fOqc5/lBWAgZgbxhkGwxwOkQ=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=i+maV99DoEngcsXa24+1yPc7dfFcbsm8z/lVuvK238JvS4IzgcYOCIomLaTdhnvcVAxvAO+k9zb29bjegYsBR8ANX0+eQK3m9QgGgq/2VIWSA7b4BcKoY0LGl+/0OYn4LeiyK3FtD/dDtj508q/+EuBMZ4HCSK5fS6aYyl7HFSQ= 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 ESMTP id 4YdkxQ6C13z4f3khn; Thu, 23 Jan 2025 10:12:58 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 81B6F1A0F82; Thu, 23 Jan 2025 10:13:19 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S9; Thu, 23 Jan 2025 10:13:19 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 05/11] md/md-bitmap: handle the case bitmap is not enabled before end_sync() Date: Thu, 23 Jan 2025 10:07:24 +0800 Message-Id: <20250123020730.2003602-6-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S9 X-Coremail-Antispam: 1UD129KBjvJXoWxXryfuF1DXryxKr4rJrW3trb_yoWrGw4xp3 9rJFW3uw1UWFW5X3WUZrykuFyFvwnrtr9rtFyxW3s3uFyrXF9rJF4rGFyjqw1qka4fAFZ8 X34YkrW5CF1UWrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 --- 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 33f952c78397..a92e3c52bfcf 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -1820,10 +1820,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 6a5806ebb11a..fefa00bc438e 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -145,4 +145,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)) { + *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 f6943849f34a..a94f71e79783 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2060,7 +2060,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); @@ -2802,8 +2802,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 ca594d56f8d0..f448b5d9faf3 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -3228,15 +3228,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 5b825c196b56..9098762ccfa6 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -6501,8 +6501,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 Mon Feb 9 09:49:01 2026 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 563401EA80; Thu, 23 Jan 2025 02:13:23 +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=1737598405; cv=none; b=QPh2hDXe7tYofa4N9Y6BMii4AS5FMhsEgq5BYOy6yG47q/028CgYNtUahE48geN6K4X3D5Sq1O/bpmhQuTQl9DJE7x5Q8dhkyKbtxEVWJUZpyEDDt/Yc0VJc9sDb5ZiBFEaxS5d++LY47ujyqGZrNXNc+K8HSHwCojl6c36BNdI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598405; c=relaxed/simple; bh=kNbqTDkKa8jjldJ3OOur3/gKFQNnLDcHbmNvFC/m1P4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HN007tMhklx/n4HURtVZ+iYavreF/ZUMNetEldzJqhw6yLjQB87T27EGZ0G1f93ffzif9KCLYi/AquursYSAS6HaPx/pJRdp7ckDa6r9cfncz39CgPJNHcWA23q3zyILCcMqoL2ISZUq3GP7efFnqYRYY59murLyWXR8h0hnuCo= 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 ESMTP id 4YdkxQ0nj9z4f3jLN; Thu, 23 Jan 2025 10:12:58 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 067AB1A1658; Thu, 23 Jan 2025 10:13:20 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S10; Thu, 23 Jan 2025 10:13:19 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 06/11] md/raid1: check bitmap before behind write Date: Thu, 23 Jan 2025 10:07:25 +0800 Message-Id: <20250123020730.2003602-7-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S10 X-Coremail-Antispam: 1UD129KBjvJXoWxJFWUuF17Xr47ZF17tFW8Zwb_yoWrJF1kpa 9FqFn0kr45trW3Xrn8AFykuFyrXw4ktF9rtrWfW34FgF12yrn0gF4FgFyrGrnxA3s3CF45 Zw4Yyr1UWrWSqFUanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 behind write rely on bitmap, because the number of IO are recoreded in bitmap->behind_writes, and callers rely on bitmap_wait_behind_writes() to wait for IO to be done. Hence if behind write start without bitmap, readers will not wait for the IO to be done because bitmap_wait_behind_writes() do nothing, and old data can be read. Signed-off-by: Yu Kuai --- 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 a92e3c52bfcf..142ba203063a 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -2031,9 +2031,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) @@ -2047,9 +2044,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 a94f71e79783..95dbf4aa5f64 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -1367,7 +1367,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)) { /* * Reading from a write-mostly device must take care not to * over-take any writes that are 'behind' @@ -1454,6 +1455,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)) + 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) { @@ -1614,22 +1639,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 Mon Feb 9 09:49:01 2026 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 6BEFE1885BF; Thu, 23 Jan 2025 02:13:29 +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=1737598418; cv=none; b=ut9rTXoIU6YexJo6P4aOkr9ApyDNn+Jah6OAR/ZN8dBkfYd8XtiHpvfNVxmp1y3sEL2ynRlte1XjlbXPxTIvySBrz0FAC270XouTlO+MnuYdzaC0DAAhit3S3Dx6aG7Xgtkr9QgeMheSUPTTPAJ1/TyELfnyDEtU1ivVhP5elAA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598418; c=relaxed/simple; bh=iIHJrSAQpfDoT3aVCPy6kQTQFGsIhEJcWZEHKeHC+us=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=jmswoya1jFP5e0VUpM/JNsOs0TpE/T3uAiAeEN2Pk7P3Ti9bcqHFtvAM1z+OFYkKUWMtai9eIh2kNb7Hxq+ay6w5PKnyYomKs8ckr1TC9ojuVolsPcvZfEh/26FuLOi5xZlIPMcUlugG42jGIuJm/zgJXsNy8EW8ESbfRu0XPwE= 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 ESMTP id 4YdkxR5xfbz4f3khl; Thu, 23 Jan 2025 10:12:59 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 78D2A1A0F87; Thu, 23 Jan 2025 10:13:20 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S11; Thu, 23 Jan 2025 10:13:20 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 07/11] md/raid1: check before deferencing mddev->bitmap_ops Date: Thu, 23 Jan 2025 10:07:26 +0800 Message-Id: <20250123020730.2003602-8-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S11 X-Coremail-Antispam: 1UD129KBjvJXoWxJr43WF45Ww4xWF4rZr1xGrg_yoW8CFW7pw srtFy3try5GrWag345ArykuF1Fy3yxJr9rtryxW3WxGrn7GryDAFWrWFWjqF1jya45ZFy5 t3yDJr45CF15JF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai --- 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 95dbf4aa5f64..cf55fa816cf7 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c @@ -2818,7 +2818,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)) + mddev->bitmap_ops->close_sync(mddev); close_sync(conf); =20 if (mddev_is_clustered(mddev)) { @@ -2855,10 +2856,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)) + 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; @@ -3339,15 +3341,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)) { + 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 Mon Feb 9 09:49:01 2026 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 F29A73DBB6; Thu, 23 Jan 2025 02:13:23 +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=1737598406; cv=none; b=SPCD4HMfOQY51u7MS5zrA280X6YIgLVv7uYUKQCQ28PrMx7fGU5UBfoB9iDBzb37uNEAoi+/FpyqaMiSp5EReLFTf2pJ8/23ENS/UCbENUMC9JPPIWeKCQrG/Qy6xpUy6aeBgTqQmkdupg/M0rrbYHxScboZbbgPsWrCaL4QaNs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598406; c=relaxed/simple; bh=tMtJppGCxGGSCHt/b0v0wZQC5PqX95uteV/tWAG+sv0=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=qv+il9m+LT7X2bVouraWiD0D1CKGuDsd5uKgQ/tww+O4gQAJvZOZP7Vjo0C73/PmhSWOv+SR9HiXyEOYFA7ETlcG8Y/3j+UfGuuToVdWFIMLsMlMtS0qDhdnTZEjLSKPntQldjyfUZjMUv8ntBxDvNqlxBlb+j63iFA+A5f8n8A= 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 ESMTP id 4YdkxS2R5Fz4f3khm; Thu, 23 Jan 2025 10:13:00 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id F33951A0F82; Thu, 23 Jan 2025 10:13:20 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S12; Thu, 23 Jan 2025 10:13:20 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 08/11] md/raid10: check before deferencing mddev->bitmap_ops Date: Thu, 23 Jan 2025 10:07:27 +0800 Message-Id: <20250123020730.2003602-9-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S12 X-Coremail-Antispam: 1UD129KBjvJXoWxJr4DJF13WrW8Zr1xCr43trb_yoW5JrWfp3 9rtFy3tryUCrWagw45AFyku3WFv3s7tr9rtFyxWw1xGrn7GrnrJF4rWFWjqF1jva4rAF15 X3yDtr45CF13WF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmI14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai --- drivers/md/raid10.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index f448b5d9faf3..ed5e6a49523a 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c @@ -3254,7 +3254,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)) + mddev->bitmap_ops->close_sync(mddev); close_sync(conf); *skipped =3D 1; return sectors_skipped; @@ -3573,7 +3574,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)) + mddev->bitmap_ops->cond_end_sync(mddev, sector_nr, mddev_is_clustered(mddev) && (sector_nr + 2 * RESYNC_SECTORS > conf->cluster_sync_high)); =20 @@ -4229,7 +4231,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; @@ -4243,9 +4244,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)) { + 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 && @@ -4511,7 +4515,7 @@ 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)) { ret =3D mddev->bitmap_ops->resize(mddev, newsize, 0); if (ret) goto abort; @@ -4534,6 +4538,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 Mon Feb 9 09:49:01 2026 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 7ECF55A4D5; Thu, 23 Jan 2025 02:13:24 +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=1737598407; cv=none; b=Du0IrfBhJtPiwnbwxglwdMaldH4E0FU6Kd4C/oV56hTvzM5IStGIxAc09YdHM+7nT4VG9D5f76ZRJGfYaow48zfTQrwqGUJ2H1ZJ+n9573COu0Q9m1HG5etAo+ft+9XlMKZheZZ1KEsQRMrqYYLbfEQ9f99QWDP7ZKOXgUwMW5I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598407; c=relaxed/simple; bh=NwirNklYFRpfOH+wfI7YFrT824/URRxjFu0Q6EZSZ7U=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=SUe5ehexWoMj2OIVM8S16HFupZTMMH2wP1X6SC9UBgUjnYeSNyvMekY8ER59a7FfQPHcE7yyf75pMrtW7j7wMszM6PQolW+mb6FFYQps93MpbyKIiVuQhhd+QB2SHbrm+OG2plhLWVZWGd+XyofvxZdrw4CI98YO9+W2wRxVkm0= 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 ESMTP id 4YdkxR3r7Jz4f3jLm; Thu, 23 Jan 2025 10:12:59 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 746901A08C5; Thu, 23 Jan 2025 10:13:21 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S13; Thu, 23 Jan 2025 10:13:21 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 09/11] md/raid5: check before deferencing mddev->bitmap_ops Date: Thu, 23 Jan 2025 10:07:28 +0800 Message-Id: <20250123020730.2003602-10-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S13 X-Coremail-Antispam: 1UD129KBjvJXoWxJr4DJF15urW3KF4DJrWrKrg_yoW8tF47p3 9rtFyaqry5ZrW3Ww4DJFykuF1Fva97tr9rtryfWw1xWwn7Gr9xWF4rWFyjqF1jya4rAFWr J3y5AF45Cr13Wr7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 Prepare to introduce CONFIG_MD_BITMAP. Signed-off-by: Yu Kuai --- 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 9098762ccfa6..f81600a6cd14 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c @@ -6505,7 +6505,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)) + mddev->bitmap_ops->close_sync(mddev); =20 return 0; } @@ -6543,7 +6544,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)) + mddev->bitmap_ops->cond_end_sync(mddev, sector_nr, false); =20 sh =3D raid5_get_active_stripe(conf, NULL, sector_nr, R5_GAS_NOBLOCK); @@ -6769,7 +6771,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)) + 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); @@ -8318,7 +8321,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; @@ -8328,9 +8330,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)) { + 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 Mon Feb 9 09:49:01 2026 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 13369182D0; Thu, 23 Jan 2025 02:13:47 +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=1737598434; cv=none; b=u0lBxPn1POrVKxTTHxZ+fhw6lDjWipRLZFokghvFqBggb+XSfN/w/yXOT6I6vfpymsMk/7I1ogDKQA+Ss8Ixbc8RPJih/eRw3FI2C61CgXUXcmykZbozm26ccNvDfhYJqyXn4M+sMGPIGAZQvG6fY6SoR9puZ5dG1ag/StNllAI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598434; c=relaxed/simple; bh=1E+V/62u89k5BgOL+q82wGiszOJstUTVi0bYx7m31sg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=c4Tc2NOXoY4YxMgYp9nEQcDgULUQeoWPdZazNogMJkVZ+vdxwtMop/m8O5dHNqEZ/VvEqLRXNKUqUgGMrsFRUX64tVoZStj7OhuQbP9dZlbYmwvQe9zd9oFXyj84BF36OiWuzBZt33YAD/wY7TmS12eDve28Ty+P1SJ1/qQezVw= 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 ESMTP id 4YdkxS0DPZz4f3jLR; Thu, 23 Jan 2025 10:13:00 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id EA5A11A12CE; Thu, 23 Jan 2025 10:13:21 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S14; Thu, 23 Jan 2025 10:13:21 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 10/11] md: check before deferencing mddev->bitmap_ops Date: Thu, 23 Jan 2025 10:07:29 +0800 Message-Id: <20250123020730.2003602-11-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S14 X-Coremail-Antispam: 1UD129KBjvJXoW3Jr4DGr4DJw18AFW8XF4xJFb_yoW3Ar4Dp3 yxtas5KrW5XrWfWw47ZFyv9F1rXwn7tr97tryxXw13Gr1rJrnxWF4rWFyUt345C348CFs8 Zw4rta1rCr17WF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 --- 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 c9c17a68cdff..264756a54f59 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -1292,6 +1292,9 @@ static u64 md_bitmap_events_cleared(struct mddev *mdd= ev) struct md_bitmap_stats stats; int err; =20 + if (!md_bitmap_enabled(mddev)) + return 0; + err =3D mddev->bitmap_ops->get_stats(mddev->bitmap, &stats); if (err) return 0; @@ -2249,13 +2252,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 @@ -2267,8 +2272,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 @@ -2753,7 +2757,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)) + mddev->bitmap_ops->update_sb(mddev->bitmap); rdev_for_each(rdev, mddev) { if (rdev->sb_loaded !=3D 1) continue; /* no noise on spare devices */ @@ -4633,6 +4638,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)) + return len; + err =3D mddev_lock(mddev); if (err) return err; @@ -5923,7 +5931,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)); @@ -6176,7 +6184,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, -1); if (err) @@ -6251,7 +6259,8 @@ int md_run(struct mddev *mddev) pers->free(mddev, mddev->private); mddev->private =3D NULL; module_put(pers->owner); - 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: @@ -6271,10 +6280,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)) @@ -6418,7 +6429,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)) + mddev->bitmap_ops->flush(mddev); =20 if (md_is_rdwr(mddev) && ((!mddev->in_sync && !mddev_is_clustered(mddev)) || @@ -6445,7 +6457,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)) + 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); @@ -6461,7 +6474,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; @@ -7183,6 +7197,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; @@ -7511,6 +7528,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; @@ -8342,6 +8367,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)) + return; + err =3D mddev->bitmap_ops->get_stats(mddev->bitmap, &stats); if (err) return; @@ -8772,7 +8800,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)) md_bitmap_end(mddev, md_io_clone); =20 if (bio->bi_status && !orig_bio->bi_status) @@ -8799,7 +8827,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)) { 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); @@ -8823,7 +8851,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)) md_bitmap_end(mddev, md_io_clone); =20 if (bio->bi_status && !orig_bio->bi_status) @@ -9530,7 +9558,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)) mddev->bitmap_ops->write_all(mddev); =20 name =3D test_bit(MD_RECOVERY_RESHAPE, &mddev->recovery) ? @@ -9618,7 +9646,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)) mddev->bitmap_ops->daemon_work(mddev); =20 if (signal_pending(current)) { @@ -9998,7 +10026,7 @@ static void check_sb_changes(struct mddev *mddev, st= ruct 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)) mddev->bitmap_ops->update_sb(mddev->bitmap); } =20 --=20 2.39.2 From nobody Mon Feb 9 09:49:01 2026 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 0A46F84D0F; Thu, 23 Jan 2025 02:13:25 +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=1737598407; cv=none; b=SLM1hRN3xOoM52Z9jvUOoq0Wb5gR42oK4oExk9zK8n2v30AG2veCzsN/C6sp03z4/MF7QyBnhNrDG74++gn/SGMrEmPV8JqD50rMgJFTaUpj4rAQZyv/roMalrGchtrfxz9hoPFtcbwil91P0z5An2m84V9hHSRXGyskBIiWJVI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737598407; c=relaxed/simple; bh=cXK63JbLwlqtlSIqlQxs28lAXhYTv6GW9Xyfglxuoj4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=UB/XYxkCO3BwO5Upkj26dCm4mVSzXb30DZ9NfCMSVSKW+a7vBZJPXhBZP7/d3KTJ/C1gPJSm9+7K0RoEhkh2b9RfO2XHbsqUFrNgjCO7U/DQlRVDUoLcF+z5urijCoPCXY0F9Vjowts3OFTHJW72sC89GzxKAqYwckYOkAOWlCA= 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 ESMTP id 4YdkxZ6pnCz4f3jqy; Thu, 23 Jan 2025 10:13:06 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.128]) by mail.maildlp.com (Postfix) with ESMTP id 68E241A165E; Thu, 23 Jan 2025 10:13:22 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.104.67]) by APP4 (Coremail) with SMTP id gCh0CgA3m1+7pZFno+znBg--.59488S15; Thu, 23 Jan 2025 10:13:22 +0800 (CST) From: Yu Kuai To: song@kernel.org, yukuai3@huawei.com, agk@redhat.com, snitzer@kernel.org, mpatocka@redhat.com Cc: linux-raid@vger.kernel.org, dm-devel@lists.linux.dev, linux-kernel@vger.kernel.org, yukuai1@huaweicloud.com, yi.zhang@huawei.com, yangerkun@huawei.com Subject: [PATCH v3 md-6.15 11/11] md/md-bitmap: introducet CONFIG_MD_BITMAP Date: Thu, 23 Jan 2025 10:07:30 +0800 Message-Id: <20250123020730.2003602-12-yukuai1@huaweicloud.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20250123020730.2003602-1-yukuai1@huaweicloud.com> References: <20250123020730.2003602-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: gCh0CgA3m1+7pZFno+znBg--.59488S15 X-Coremail-Antispam: 1UD129KBjvJXoW3JryUur4fKFyxCw4DZw43KFg_yoWfAryfpF WrGa45Gr45JFZxWa1UJa4DuFySgr1ktr9rtryfGwnYkF9rXF9xXF4rWFyUt3s8GFWfXFsx Za1rGFWUCr4UXF7anT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUmS14x267AKxVWrJVCq3wAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2048vs2IY020E87I2jVAFwI0_JF0E3s1l82xGYI kIc2x26xkF7I0E14v26ryj6s0DM28lY4IEw2IIxxk0rwA2F7IY1VAKz4vEj48ve4kI8wA2 z4x0Y4vE2Ix0cI8IcVAFwI0_Ar0_tr1l84ACjcxK6xIIjxv20xvEc7CjxVAFwI0_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 --- drivers/md/Kconfig | 18 ++++++++++ drivers/md/md-bitmap.c | 21 +++++++++-- drivers/md/md-bitmap.h | 19 +++++++++- drivers/md/md.c | 82 +++++++++++++++++++++++++++++++++++------- drivers/md/md.h | 1 - 5 files changed, 125 insertions(+), 16 deletions(-) diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index 0b1870a09e1f..0da07182494c 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 @@ -392,6 +409,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/md-bitmap.c b/drivers/md/md-bitmap.c index 142ba203063a..a1bfb3669f3c 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -212,6 +212,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 @@ -2960,6 +2962,8 @@ static struct attribute_group md_bitmap_group =3D { }; =20 static struct bitmap_operations bitmap_ops =3D { + .version =3D 1, + .enabled =3D bitmap_enabled, .create =3D bitmap_create, .resize =3D bitmap_resize, @@ -2994,7 +2998,20 @@ 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; + + INIT_LIST_HEAD(&bitmap_ops.list); + register_md_bitmap(&bitmap_ops); + return 0; +} + +void md_bitmap_exit(void) { - mddev->bitmap_ops =3D &bitmap_ops; + destroy_workqueue(md_bitmap_wq); + unregister_md_bitmap(&bitmap_ops); } diff --git a/drivers/md/md-bitmap.h b/drivers/md/md-bitmap.h index fefa00bc438e..1c716b54b4a8 100644 --- a/drivers/md/md-bitmap.h +++ b/drivers/md/md-bitmap.h @@ -71,6 +71,9 @@ struct md_bitmap_stats { }; =20 struct bitmap_operations { + int version; + struct list_head list; + bool (*enabled)(void *data); int (*create)(struct mddev *mddev, int slot); int (*resize)(struct mddev *mddev, sector_t blocks, int chunksize); @@ -114,7 +117,8 @@ struct bitmap_operations { }; =20 /* the bitmap API */ -void mddev_set_bitmap_ops(struct mddev *mddev); +void register_md_bitmap(struct bitmap_operations *op); +void unregister_md_bitmap(struct bitmap_operations *op); =20 static inline bool md_bitmap_registered(struct mddev *mddev) { @@ -156,4 +160,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 +extern int md_bitmap_init(void); +extern 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 264756a54f59..9451cc5cc574 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -83,6 +83,9 @@ static const char *action_name[NR_SYNC_ACTIONS] =3D { static LIST_HEAD(pers_list); static DEFINE_SPINLOCK(pers_lock); =20 +static LIST_HEAD(bitmap_list); +static DEFINE_SPINLOCK(bitmap_lock); + static const struct kobj_type md_ktype; =20 const struct md_cluster_operations *md_cluster_ops; @@ -100,7 +103,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); @@ -650,15 +652,73 @@ static void active_io_release(struct percpu_ref *ref) =20 static void no_op(struct percpu_ref *r) {} =20 +void register_md_bitmap(struct bitmap_operations *op) +{ + pr_info("md: bitmap version %d registered\n", op->version); + + spin_lock(&bitmap_lock); + list_add_tail(&op->list, &bitmap_list); + spin_unlock(&bitmap_lock); +} + +void unregister_md_bitmap(struct bitmap_operations *op) +{ + pr_info("md: bitmap version %d unregistered\n", op->version); + + spin_lock(&bitmap_lock); + list_del_init(&op->list); + spin_unlock(&bitmap_lock); +} + +static struct bitmap_operations *find_bitmap(int version) +{ + struct bitmap_operations *op =3D NULL; + struct bitmap_operations *tmp; + + spin_lock(&bitmap_lock); + list_for_each_entry(tmp, &bitmap_list, list) { + if (tmp->version =3D=3D version) { + op =3D tmp; + break; + } + } + spin_unlock(&bitmap_lock); + + return op; +} + +static void mddev_set_bitmap_ops(struct mddev *mddev, int version) +{ + struct bitmap_operations *op =3D find_bitmap(version); + + if (!op) + pr_warn_once("md: can't find version %d bitmap\n", version); + + mddev->bitmap_ops =3D op; +} + +static void mddev_clear_bitmap_ops(struct mddev *mddev) +{ + if (!mddev->bitmap_ops) + return; + + mddev->bitmap_ops =3D NULL; +} + int mddev_init(struct mddev *mddev) { + /* TODO: support more versions */ + mddev_set_bitmap_ops(mddev, 1); =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; } @@ -686,7 +746,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); @@ -697,6 +756,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); } @@ -9970,8 +10030,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; @@ -9980,11 +10044,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; @@ -10003,12 +10062,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 @@ -10311,8 +10369,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 87edf81c25b0..9e35d49f90a2 100644 --- a/drivers/md/md.h +++ b/drivers/md/md.h @@ -978,7 +978,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