md/md-bitmap: fix stats collection for external bitmaps
authorZheng Qixing <zhengqixing@huawei.com>
Thu, 3 Apr 2025 01:53:22 +0000 (09:53 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Apr 2025 08:45:39 +0000 (10:45 +0200)
[ Upstream commit 6ec1f0239485028445d213d91cfee5242f3211ba ]

The bitmap_get_stats() function incorrectly returns -ENOENT for external
bitmaps.

Remove the external bitmap check as the statistics should be available
regardless of bitmap storage location.

Return -EINVAL only for invalid bitmap with no storage (neither in
superblock nor in external file).

Note: "bitmap_info.external" here refers to a bitmap stored in a separate
file (bitmap_file), not to external metadata.

Fixes: 8d28d0ddb986 ("md/md-bitmap: Synchronize bitmap_get_stats() with bitmap lifetime")
Signed-off-by: Zheng Qixing <zhengqixing@huawei.com>
Link: https://lore.kernel.org/linux-raid/20250403015322.2873369-1-zhengqixing@huaweicloud.com
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/md/md-bitmap.c

index deb40a8ba3999501fba9c6d26cd1dda1e3669218..8317e07b326d0d51544faa5ee34695457214598f 100644 (file)
@@ -2119,9 +2119,8 @@ int md_bitmap_get_stats(struct bitmap *bitmap, struct md_bitmap_stats *stats)
 
        if (!bitmap)
                return -ENOENT;
-       if (bitmap->mddev->bitmap_info.external)
-               return -ENOENT;
-       if (!bitmap->storage.sb_page) /* no superblock */
+       if (!bitmap->mddev->bitmap_info.external &&
+           !bitmap->storage.sb_page)
                return -EINVAL;
        sb = kmap_local_page(bitmap->storage.sb_page);
        stats->sync_size = le64_to_cpu(sb->sync_size);