Tested-by: Tristan Ye <[email protected]>

Tao Ma wrote:
> In commit 6b82021b9e91cd689fdffadbcdb9a42597bbe764, we increase
> our local alloc size and calculate how much megabytes we can
> get according to group size and volume size.
> But we also need to check the maximum bits a local alloc block
> bitmap can have. With a bs=512, cs=32K, local volume with 160G,
> it calculate 96MB while the maximum local alloc size is only
> 76M. So the bitmap will overflow and corrupt the system truncate
> log file. See bug
> http://oss.oracle.com/bugzilla/show_bug.cgi?id=1262
>
> Cc: Mark Fasheh <[email protected]>
> Signed-off-by: Tao Ma <[email protected]>
> ---
>  fs/ocfs2/localalloc.c |    7 +++++++
>  1 files changed, 7 insertions(+), 0 deletions(-)
>
> diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c
> index 3d74196..ec6adbf 100644
> --- a/fs/ocfs2/localalloc.c
> +++ b/fs/ocfs2/localalloc.c
> @@ -118,6 +118,7 @@ unsigned int ocfs2_la_default_mb(struct ocfs2_super *osb)
>  {
>       unsigned int la_mb;
>       unsigned int gd_mb;
> +     unsigned int la_max_mb;
>       unsigned int megs_per_slot;
>       struct super_block *sb = osb->sb;
>  
> @@ -182,6 +183,12 @@ unsigned int ocfs2_la_default_mb(struct ocfs2_super *osb)
>       if (megs_per_slot < la_mb)
>               la_mb = megs_per_slot;
>  
> +     /* We can't store more bits than we can in a block. */
> +     la_max_mb = ocfs2_clusters_to_megabytes(osb->sb,
> +                                             ocfs2_local_alloc_size(sb) * 8);
> +     if (la_mb > la_max_mb)
> +             la_mb = la_max_mb;
> +
>       return la_mb;
>  }
>  


_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to