[PATCH] Make bit addressing consistent in rtems_rfs_group.c

Chris Johns chrisj at rtems.org
Tue Apr 10 04:29:53 UTC 2018


On 11/10/2017 10:11, Fan Deng wrote:
> This change fixes https://devel.rtems.org/ticket/3089.
> 
> Briefly, rtems_rfs_group.c contains conflicting conversions between
> block numbers and group number and bit offset pairs. This caused the
> actual bit stored on the bitmask to be one bit displaced from its
> intended location.
> 
> For more details, please see the associated ticket.
> 
> Tested by inspecting the written bitmasks with and without this change.

Hmmm well ....

> ---
>  cpukit/libfs/src/rfs/rtems-rfs-group.c | 13 ++++++++++++-
>  1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/cpukit/libfs/src/rfs/rtems-rfs-group.c b/cpukit/libfs/src/rfs/rtems-rfs-group.c
> index c319dc526c..e1480330a7 100644
> --- a/cpukit/libfs/src/rfs/rtems-rfs-group.c
> +++ b/cpukit/libfs/src/rfs/rtems-rfs-group.c
> @@ -167,7 +167,17 @@ rtems_rfs_group_bitmap_alloc (rtems_rfs_file_system* fs,
>      goal -= RTEMS_RFS_ROOT_INO;
>    }
>    else
> +  {
>      size = fs->group_blocks;
> +    /*
> +     * It is possible for 'goal' to be zero. Any newly created inode will have
> +     * its 'last_data_block' set to zero, which is then used as 'goal' to
> +     * allocate new blocks. When that happens, we simply set 'goal' to zero and
> +     * continue the search from there.
> +     */
> +    if (goal >= RTEMS_RFS_SUPERBLOCK_SIZE)
> +        goal -= RTEMS_RFS_SUPERBLOCK_SIZE;
> +  }
>  
>    group_start = goal / size;
>    bit = (rtems_rfs_bitmap_bit) (goal % size);
> @@ -324,8 +334,9 @@ rtems_rfs_group_bitmap_test (rtems_rfs_file_system* fs,
>    }
>    else
>    {
> -    if (no >= rtems_rfs_fs_blocks (fs))
> +    if ((no < RTEMS_RFS_SUPERBLOCK_SIZE) || (no >= rtems_rfs_fs_blocks (fs))

... there is a ')' missing?

RTEMS_RFS_SUPERBLOCK_SIZE should be RTEMS_RFS_ROOT_INO.

>          return EINVAL;
> +    no -= RTEMS_RFS_SUPERBLOCK_SIZE;

Same here.

Chris


More information about the devel mailing list