Skip to content
Snippets Groups Projects
  • Zhao Heming's avatar
    a43817fd
    md/bitmap: md_bitmap_get_counter returns wrong blocks · a43817fd
    Zhao Heming authored
    
    [ Upstream commit d837f727 ]
    
    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: default avatarZhao Heming <heming.zhao@suse.com>
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    a43817fd
    History
    md/bitmap: md_bitmap_get_counter returns wrong blocks
    Zhao Heming authored
    
    [ Upstream commit d837f727 ]
    
    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: default avatarZhao Heming <heming.zhao@suse.com>
    Signed-off-by: default avatarSong Liu <songliubraving@fb.com>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Code owners
Assign users and groups as approvers for specific file changes. Learn more.