The patched code is used to get chunks number, should use round-up div to replace current sector_div. The same code is in md_bitmap_resize(): ``` chunks = DIV_ROUND_UP_SECTOR_T(blocks, 1 << chunkshift); ``` Signed-off-by: Zhao Heming <heming.zhao@suse.com> --- drivers/md/md-bitmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 593fe15..1efd2b4 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -605,7 +605,7 @@ static int md_bitmap_read_sb(struct bitmap *bitmap) if (bitmap->cluster_slot >= 0) { sector_t bm_blocks = bitmap->mddev->resync_max_sectors; - sector_div(bm_blocks, + DIV_ROUND_UP_SECTOR_T(bm_blocks, bitmap->mddev->bitmap_info.chunksize >> 9); /* bits to bytes */ bm_blocks = ((bm_blocks+7) >> 3) + sizeof(bitmap_super_t); -- 1.8.3.1
md_bitmap_get_counter() has code: ``` if (bitmap->bp[page].hijacked || bitmap->bp[page].map == NULL) csize = ((sector_t)1) << (bitmap->chunkshift + PAGE_COUNTER_SHIFT - 1); ``` the minus 1 is wrong, this branch should report 2048 bits of space. with "-1" action, this only report 1024 bit of space. this bug code returns wrong blocks, but it doesn't inflence bitmap logic: 1. most callers focus this function return value (the counter of offset), not the parameter blocks. 2. the bug is only triggered when hijacked is true or map is NULL. the hijacked true condition is very rare. the "map == null" only true when array is creating or resizing. 3. even the caller gets wrong blocks, current code makes caller just to call md_bitmap_get_counter() one more time. Signed-off-by: Zhao Heming <heming.zhao@suse.com> --- drivers/md/md-bitmap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c index 1efd2b4..145b3b2 100644 --- a/drivers/md/md-bitmap.c +++ b/drivers/md/md-bitmap.c @@ -1367,7 +1367,7 @@ static bitmap_counter_t *md_bitmap_get_counter(struct bitmap_counts *bitmap, if (bitmap->bp[page].hijacked || bitmap->bp[page].map == NULL) csize = ((sector_t)1) << (bitmap->chunkshift + - PAGE_COUNTER_SHIFT - 1); + PAGE_COUNTER_SHIFT); else csize = ((sector_t)1) << bitmap->chunkshift; *blocks = csize - (offset & (csize - 1)); -- 1.8.3.1
very sorry for my mistake.
the patch should be change from:
```
- sector_div(bm_blocks,
+ DIV_ROUND_UP_SECTOR_T(bm_blocks,
bitmap->mddev->bitmap_info.chunksize >> 9);
```
to
```
- sector_div(bm_blocks,
- bitmap->mddev->bitmap_info.chunksize >> 9);
+ bm_blocks = DIV_ROUND_UP_SECTOR_T(bm_blocks,
+ (bitmap->mddev->bitmap_info.chunksize >> 9));
```
If my patch would be accepted, I will send v2 patch including above lines.
On 10/4/20 12:11 AM, Zhao Heming wrote:
> The patched code is used to get chunks number, should use
> round-up div to replace current sector_div.
> The same code is in md_bitmap_resize():
> ```
> chunks = DIV_ROUND_UP_SECTOR_T(blocks, 1 << chunkshift);
> ```
>
> Signed-off-by: Zhao Heming <heming.zhao@suse.com>
> ---
> drivers/md/md-bitmap.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/md/md-bitmap.c b/drivers/md/md-bitmap.c
> index 593fe15..1efd2b4 100644
> --- a/drivers/md/md-bitmap.c
> +++ b/drivers/md/md-bitmap.c
> @@ -605,7 +605,7 @@ static int md_bitmap_read_sb(struct bitmap *bitmap)
> if (bitmap->cluster_slot >= 0) {
> sector_t bm_blocks = bitmap->mddev->resync_max_sectors;
>
> - sector_div(bm_blocks,
> + DIV_ROUND_UP_SECTOR_T(bm_blocks,
> bitmap->mddev->bitmap_info.chunksize >> 9);
> /* bits to bytes */
> bm_blocks = ((bm_blocks+7) >> 3) + sizeof(bitmap_super_t);
>
On Sat, Oct 3, 2020 at 9:26 AM heming.zhao@suse.com
<heming.zhao@suse.com> wrote:
>
> very sorry for my mistake.
>
> the patch should be change from:
> ```
> - sector_div(bm_blocks,
> + DIV_ROUND_UP_SECTOR_T(bm_blocks,
> bitmap->mddev->bitmap_info.chunksize >> 9);
> ```
>
> to
> ```
> - sector_div(bm_blocks,
> - bitmap->mddev->bitmap_info.chunksize >> 9);
> + bm_blocks = DIV_ROUND_UP_SECTOR_T(bm_blocks,
> + (bitmap->mddev->bitmap_info.chunksize >> 9));
> ```
>
> If my patch would be accepted, I will send v2 patch including above lines.
Please send v2 of the patch. Please also CC Guoqing in v2.
Thanks,
Song