btrfs-progs: Fix a bug in chunk item extra check and allow degraded chunk.
diff mbox

Message ID 1431666674-23322-1-git-send-email-quwenruo@cn.fujitsu.com
State Accepted
Headers show

Commit Message

Qu Wenruo May 15, 2015, 5:11 a.m. UTC
For DUP profile, the num_stripes should be 2 not 1.
This causes btrfs offline tool fails on valid image.

Also, num_stripes check is too restrict for btrfsck self test,
as there is some image in degraded mode, so modify it to allow degraded
chunk.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
---
 volumes.c | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

Comments

David Sterba May 20, 2015, 12:27 p.m. UTC | #1
On Fri, May 15, 2015 at 01:11:14PM +0800, Qu Wenruo wrote:
> For DUP profile, the num_stripes should be 2 not 1.
> This causes btrfs offline tool fails on valid image.
> 
> Also, num_stripes check is too restrict for btrfsck self test,
> as there is some image in degraded mode, so modify it to allow degraded
> chunk.
> 
> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>

Applied, thanks. There relase of 4.0.1 is on the way.
--
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

Patch
diff mbox

diff --git a/volumes.c b/volumes.c
index 77cc305..14ce33e 100644
--- a/volumes.c
+++ b/volumes.c
@@ -1649,12 +1649,11 @@  static int read_one_chunk(struct btrfs_root *root, struct btrfs_key *key,
 	/*
 	 * Device number check against profile
 	 */
-	if ((map->type & BTRFS_BLOCK_GROUP_RAID10 && num_stripes < 4 &&
-	     map->sub_stripes < 2) ||
-	    (map->type & BTRFS_BLOCK_GROUP_RAID1 && num_stripes < 2) ||
-	    (map->type & BTRFS_BLOCK_GROUP_RAID5 && num_stripes < 3) ||
-	    (map->type & BTRFS_BLOCK_GROUP_RAID6 && num_stripes < 4) ||
-	    (map->type & BTRFS_BLOCK_GROUP_DUP && num_stripes != 1) ||
+	if ((map->type & BTRFS_BLOCK_GROUP_RAID10 && map->sub_stripes == 0) ||
+	    (map->type & BTRFS_BLOCK_GROUP_RAID1 && num_stripes < 1) ||
+	    (map->type & BTRFS_BLOCK_GROUP_RAID5 && num_stripes < 2) ||
+	    (map->type & BTRFS_BLOCK_GROUP_RAID6 && num_stripes < 3) ||
+	    (map->type & BTRFS_BLOCK_GROUP_DUP && num_stripes > 2) ||
 	    ((map->type & BTRFS_BLOCK_GROUP_PROFILE_MASK) == 0 &&
 	     num_stripes != 1)) {
 		fprintf(stderr,