diff options
author | Gui Hecheng <guihc.fnst@cn.fujitsu.com> | 2014-06-12 10:24:59 +0800 |
---|---|---|
committer | David Sterba <dsterba@suse.cz> | 2014-08-22 14:39:35 +0200 |
commit | 41b617ed73e0f12bfe13ca641861f133ab8d310f (patch) | |
tree | 556d2728ef5ea30ed1225d29eb2214d46707684c /chunk-recover.c | |
parent | 2100836188672d64adf0def8975dceea710ce51c (diff) | |
download | btrfs-progs-41b617ed73e0f12bfe13ca641861f133ab8d310f.tar.gz |
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 insert procedure into a new function, fill_chunk_up.
Signed-off-by: Gui Hecheng <guihc.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Diffstat (limited to 'chunk-recover.c')
-rw-r--r-- | chunk-recover.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/chunk-recover.c b/chunk-recover.c index 9c44b49..2d8dd11 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, @@ -1918,9 +1935,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; @@ -1965,14 +1982,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: |