All of lore.kernel.org
 help / color / mirror / Atom feed
From: Shaohua Li <shli@kernel.org>
To: Zhengyuan Liu <liuzhengyuan@kylinos.cn>
Cc: shli <shli@fb.com>, Song Liu <songliubraving@fb.com>,
	linux-raid <linux-raid@vger.kernel.org>
Subject: Re: Superblock of raid5 log can't be updated when array stoped
Date: Fri, 21 Oct 2016 15:43:41 -0700	[thread overview]
Message-ID: <20161021224341.GC105663@kernel.org> (raw)
In-Reply-To: <tencent_5F7A406104D26FAD7587F1C4@qq.com>

On Tue, Oct 18, 2016 at 01:51:57PM +0800, Zhengyuan Liu wrote:
> If that's the problem, I think there is another problem about next_checkpoint initialization.
> No initial operation was done to this field when we loaded/recovery  the log , it got
> assignment  only when IO to raid disk was finished.  So r5l_quiesce may use wrong 
> next_checkpoint to reclaim log space, that would confuse log recovery.  Bellow patch
> may help the expression.

Good catch. This doesn't confuse log recovery but maks reclaimable space
calculation confused. Could you please send a formal patch?

Thanks,
Shaohua 
> diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c
> index 1b1ab4a..998ea00 100644
> --- a/drivers/md/raid5-cache.c
> +++ b/drivers/md/raid5-cache.c
> @@ -1096,6 +1096,8 @@ static int r5l_recovery_log(struct r5l_log *log)
>                 log->seq = ctx.seq + 11;
>                 log->log_start = r5l_ring_add(log, ctx.pos, BLOCK_SECTORS);
>                 r5l_write_super(log, ctx.pos);
> +               log->last_checkpoint = ctx.pos;
> +               log->next_checkpoint = ctx.pos;
>         } else {
>                 log->log_start = ctx.pos;
>                 log->seq = ctx.seq;
> @@ -1168,6 +1170,7 @@ create:
>         if (log->max_free_space > RECLAIM_MAX_FREE_SPACE)
>                 log->max_free_space = RECLAIM_MAX_FREE_SPACE;
>         log->last_checkpoint = cp;
> +       log->next_checkpoint = cp;
>  
>         __free_page(page);
> 
> Thanks,
> --Zhengyuan
> 
> ------------------ Original ------------------
> From:  "Shaohua Li"<shli@kernel.org>;
> Date:  Tue, Oct 18, 2016 08:28 AM
> To:  "Zhengyuan Liu"<liuzhengyuan@kylinos.cn>;
> Cc:  "shli"<shli@fb.com>; "Song Liu"<songliubraving@fb.com>; "linux-raid"<linux-raid@vger.kernel.org>;
> Subject:  Re: Superblock of raid5 log can't be updated when array stoped
>  
> On Sat, Oct 15, 2016 at 10:19:36AM +0800, liuzhengyuan wrote:
> > Hi, Shaohua.
> > 
> > when we stop raid5 array with "mdadm -S" or reboot the system,  md module will 
> > call raid5_quiesce and r5l_quiesce to do some clean work. Some code of r5l_quiesce
> > was pasted bellow.
> > 
> >                 /* make sure r5l_write_super_and_discard_space exits */
> >                 mddev = log->rdev->mddev;
> >                 wake_up(&mddev->sb_wait);
> >                 r5l_wake_reclaim(log, -1L);
> >                 md_unregister_thread(&log->reclaim_thread);
> >                 r5l_do_reclaim(log);
> > +                md_update_sb(mddev, 1);
> > 
> > It will reclaim all used space of log and call r5l_write_super to reset rdev->journal_tail
> > to log->next_checkpoint . However, new rdev->journal_tail would not be written to 
> > journal device for persistent because journal device may not support discard operation
> > or due to mddev_trylock fail (this trylock should always get failed since raid5_quiesce 
> > was called with  reconfig_mutex hold, isn't it?). As a result, it will take a long time to
> >  recovery the log when the arrary was restarted. Should r5l_quiesce call md_update_sb
> >  directly to guarantee  superblock  update?
> 
> Yep, that's problem here. Unfortunately we can't call md_update_sb here,
> because we might not hold the mddev lock. I think we should call it at do_md_stop.
> 
> Thanks,
> Shaohua

      reply	other threads:[~2016-10-21 22:43 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-15  2:19 Superblock of raid5 log can't be updated when array stoped liuzhengyuan
2016-10-18  0:28 ` Shaohua Li
2016-10-18  5:51   ` Zhengyuan Liu
2016-10-21 22:43     ` Shaohua Li [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161021224341.GC105663@kernel.org \
    --to=shli@kernel.org \
    --cc=linux-raid@vger.kernel.org \
    --cc=liuzhengyuan@kylinos.cn \
    --cc=shli@fb.com \
    --cc=songliubraving@fb.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.