]> git.baikalelectronics.ru Git - kernel.git/commit
md/raid5: write an empty meta-block when creating log super-block
authorZhengyuan Liu <liuzhengyuan@kylinos.cn>
Mon, 24 Oct 2016 08:15:59 +0000 (16:15 +0800)
committerShaohua Li <shli@fb.com>
Mon, 24 Oct 2016 22:28:18 +0000 (15:28 -0700)
commite8f2668edb481ee7627744d8eec292195dbbe171
treedcd22f765aa0a73e947f5c550c5b6e116d5304f7
parent26858eeaf7a278795552ec4316adb54d88d0ed84
md/raid5: write an empty meta-block when creating log super-block

If superblock points to an invalid meta block, r5l_load_log will set
create_super with true and create an new superblock, this runtime path
would always happen if we do no writing I/O to this array since it was
created. Writing an empty meta block could avoid this unnecessary
action at the first time we created log superblock.

Another reason is for the corretness of log recovery. Currently we have
bellow code to guarantee log revocery to be correct.

        if (ctx.seq > log->last_cp_seq + 1) {
                int ret;

                ret = r5l_log_write_empty_meta_block(log, ctx.pos, ctx.seq + 10);
                if (ret)
                        return ret;
                log->seq = ctx.seq + 11;
                log->log_start = r5l_ring_add(log, ctx.pos, BLOCK_SECTORS);
                r5l_write_super(log, ctx.pos);
        } else {
                log->log_start = ctx.pos;
                log->seq = ctx.seq;
        }

If we just created a array with a journal device, log->log_start and
log->last_checkpoint should all be 0, then we write three meta block
which are valid except mid one and supposed crash happened. The ctx.seq
would equal to log->last_cp_seq + 1 and log->log_start would be set to
position of mid invalid meta block after we did a recovery, this will
lead to problems which could be avoided with this patch.

Signed-off-by: Zhengyuan Liu <liuzhengyuan@kylinos.cn>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/raid5-cache.c