md/raid5-cache: adjust the write position of the empty block if no data blocks
authorJackieLiu <liuyun01@kylinos.cn>
Mon, 5 Dec 2016 03:58:53 +0000 (11:58 +0800)
committerShaohua Li <shli@fb.com>
Tue, 6 Dec 2016 01:11:02 +0000 (17:11 -0800)
commit43b9674832cc41ad0ad7b7e2ec397e47dcd5f6c3
tree0bce93ce3f2cf58db16454a7d68d4ced1fd6f47f
parentf687a33ef02d3e0f13c4fa9e3b2e90f656bbfb26
md/raid5-cache: adjust the write position of the empty block if no data blocks

When recovery is complete, we write an empty block and record his
position first, then make the data-only stripes rewritten done,
the location of the empty block as the last checkpoint position
to write into the super block. And we should update last_checkpoint
to this empty block position.

------------------------------------------------------------------
|  old log       | empty block | data only stripes | invalid log |
------------------------------------------------------------------
^                ^                                 ^
|                |- log->last_checkpoint           |- log->log_start
|                |- log->last_cp_seq               |- log->next_checkpoint
|- log->seq=n    |- log->seq=10+n

At the same time, if there is no data-only stripes, this scene may appear,
| meta1 | meta2 | meta3 |
meta 1 is valid, meta 2 is invalid. meta 3 could be valid. so we should
The solution is we create a new meta in meta2 with its seq == meta1's
seq + 10 and let superblock points to meta2.

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