On Thu, 22 Mar 2012 15:56:39 -0700 <[email protected]> wrote:

> 
> The patch below does not apply to the 3.0-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git commit
> id to <[email protected]>.

Sorry - that should have been "stable release 3.1 and later".
It is not relevant for 3.0.

Thanks,
NeilBrown


> 
> thanks,
> 
> greg k-h
> 
> ------------------ original commit in Linus's tree ------------------
> 
> >From d0962936bff659d20522555b517582a2715fd23f Mon Sep 17 00:00:00 2001
> From: NeilBrown <[email protected]>
> Date: Mon, 19 Mar 2012 12:46:41 +1100
> Subject: [PATCH] md: fix clearing of the 'changed' flags for the bad blocks
>  list.
> 
> In super_1_sync (the first hunk) we need to clear 'changed' before
> checking read_seqretry(), otherwise we might race with other code
> adding a bad block and so won't retry later.
> 
> In md_update_sb (the second hunk), in the case where there is no
> metadata (neither persistent nor external), we treat any bad blocks as
> an error.  However we need to clear the 'changed' flag before calling
> md_ack_all_badblocks, else it won't do anything.
> 
> This patch is suitable for -stable release 3.0 and later.
> 
> Cc: [email protected]
> Signed-off-by: NeilBrown <[email protected]>
> 
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index 26591cc..21a90ef 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -1805,13 +1805,13 @@ retry:
>                                               | BB_LEN(internal_bb));
>                               *bbp++ = cpu_to_le64(store_bb);
>                       }
> +                     bb->changed = 0;
>                       if (read_seqretry(&bb->lock, seq))
>                               goto retry;
>  
>                       bb->sector = (rdev->sb_start +
>                                     (int)le32_to_cpu(sb->bblog_offset));
>                       bb->size = le16_to_cpu(sb->bblog_size);
> -                     bb->changed = 0;
>               }
>       }
>  
> @@ -2366,6 +2366,7 @@ repeat:
>                       clear_bit(MD_CHANGE_PENDING, &mddev->flags);
>                       rdev_for_each(rdev, mddev) {
>                               if (rdev->badblocks.changed) {
> +                                     rdev->badblocks.changed = 0;
>                                       md_ack_all_badblocks(&rdev->badblocks);
>                                       md_error(mddev, rdev);
>                               }

Attachment: signature.asc
Description: PGP signature

Reply via email to