Gui Hecheng
2014-Jun-12 02:24 UTC
[PATCH 1/3] btrfs-progs: fix missing parity stripe for raid6 in chunk-recover
When deal with the p & q stripes for data profile raid6, chunk-recover forgets to insert them into the chunk record. Just insert them back freely. Also wrap the inert procedure into a new function, fill_chunk_up. Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com> --- chunk-recover.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/chunk-recover.c b/chunk-recover.c index dfa7ff6..9b46b0b 100644 --- a/chunk-recover.c +++ b/chunk-recover.c @@ -1785,6 +1785,23 @@ static inline int count_devext_records(struct list_head *record_list) return num_of_records; } +static int fill_chunk_up(struct chunk_record *chunk, struct list_head *devexts, + struct recover_control *rc) +{ + int ret = 0; + int i; + + for (i = 0; i < chunk->num_stripes; i++) { + if (!chunk->stripes[i].devid) { + ret = insert_stripe(devexts, rc, chunk, i); + if (ret) + break; + } + } + + return ret; +} + #define EQUAL_STRIPE (1 << 0) static int rebuild_raid_data_chunk_stripes(struct recover_control *rc, @@ -1919,9 +1936,9 @@ next_csum: num_unordered = count_devext_records(&unordered); if (chunk->type_flags & BTRFS_BLOCK_GROUP_RAID6 && num_unordered == 2) { - list_splice_init(&unordered, &chunk->dextents); btrfs_release_path(&path); - return 0; + ret = fill_chunk_up(chunk, &unordered, rc); + return ret; } goto next_stripe; @@ -1966,14 +1983,7 @@ out: & BTRFS_BLOCK_GROUP_RAID5) || (num_unordered == 3 && chunk->type_flags & BTRFS_BLOCK_GROUP_RAID6)) { - for (i = 0; i < chunk->num_stripes; i++) { - if (!chunk->stripes[i].devid) { - ret = insert_stripe(&unordered, rc, - chunk, i); - if (ret) - break; - } - } + ret = fill_chunk_up(chunk, &unordered, rc); } } fail_out: -- 1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html