Skip to contentSkip to conversation

btrfs: fix disk-io.c/btrfs_read_dev_super with BTRFS_SUPER_MIRROR_MAX to control the loops

PATCH In review Wang Sheng-Hui 4 participants 4 messages Sep 10, 2012 – Sep 11, 2012 Btrfs file system

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 btrfs: fix disk-io.c/btrfs_read_dev_super with BTRFS_SUPER_MIRROR_MAX to control the loops

To check the duplicated super blocks, use BTRFS_SUPER_MIRROR_MAX as the loops limit.

---
 fs/btrfs/disk-io.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
fs/btrfs/disk-io.c +1 -1
index 22e98e0..a431144 100644
@@ -2723,7 +2723,7 @@ struct buffer_head *btrfs_read_dev_super(struct block_device *bdev)
 	 * So, we need to add a special mount option to scan for
 	 * later supers, using BTRFS_SUPER_MIRROR_MAX instead
 	 */
-	for (i = 0; i < 1; i++) {
+	for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
 		bytenr = btrfs_sb_offset(i);
 		if (bytenr + 4096 >= i_size_read(bdev->bd_inode))
 			break;
Signature · 1 line
1.7.1
#1 lore raw
Quoted 24 lines · Wang Sheng-Hui

To check the duplicated super blocks, use BTRFS_SUPER_MIRROR_MAX as the loops limit.

---
 fs/btrfs/disk-io.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
fs/btrfs/disk-io.c +1 -2
index 22e98e0..a431144 100644
@@ -2723,7 +2723,7 @@ struct buffer_head *btrfs_read_dev_super(struct block_device *bdev)
         * So, we need to add a special mount option to scan for
         * later supers, using BTRFS_SUPER_MIRROR_MAX instead
         */
-       for (i = 0; i < 1; i++) {
+       for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
                bytenr = btrfs_sb_offset(i);
                if (bytenr + 4096 >= i_size_read(bdev->bd_inode))
                        break;
--

1.7.1

Quoted 4 lines

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

Please fix the comment as well; if we check all the supers, then mounting as btrfs _will_ succeed after a different (non-btrfs) filesystem is created on the partition/device, pretty much guaranteeing it will be corrupted.

#2 lore raw
In reply to Wang Sheng-Hui
Quoted 13 lines · Wang Sheng-Hui

To check the duplicated super blocks, use BTRFS_SUPER_MIRROR_MAX as the loops limit.

---
 fs/btrfs/disk-io.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
fs/btrfs/disk-io.c +0 -0
index 22e98e0..a431144 100644

fs/btrfs/disk-io.c struct buffer_head *btrfs_read_dev_super(struct block_device *bdev) · line 2729

Quoted 8 lines
fs/btrfs/disk-io.c +1 -1
@@ -2723,7 +2723,7 @@ struct buffer_head *btrfs_read_dev_super(struct block_device *bdev)
 	 * So, we need to add a special mount option to scan for
 	 * later supers, using BTRFS_SUPER_MIRROR_MAX instead
 	 */
-	for (i = 0; i < 1; i++) {
+	for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; i++) {
 		bytenr = btrfs_sb_offset(i);
 		if (bytenr + 4096 >= i_size_read(bdev->bd_inode))
 			break;

We don't want to do this, it should be left for -o recovery or some such mount option. Thanks,

Josef

#3 lore raw
In reply to Wang Sheng-Hui

Hi,

Quoted 13 lines · Wang Sheng-Hui

To check the duplicated super blocks, use BTRFS_SUPER_MIRROR_MAX as the loops limit.

---
  fs/btrfs/disk-io.c |    2 +-
  1 files changed, 1 insertions(+), 1 deletions(-)
fs/btrfs/disk-io.c +0 -0
index 22e98e0..a431144 100644

fs/btrfs/disk-io.c struct buffer_head *btrfs_read_dev_super(struct block_device *bdev) · line 2729

Quoted 8 lines
fs/btrfs/disk-io.c +1 -1
@@ -2723,7 +2723,7 @@ struct buffer_head *btrfs_read_dev_super(struct block_device *bdev)
  	 * So, we need to add a special mount option to scan for
  	 * later supers, using BTRFS_SUPER_MIRROR_MAX instead
  	 */
-	for (i = 0; i<  1; i++) {
+	for (i = 0; i<  BTRFS_SUPER_MIRROR_MAX; i++) {
  		bytenr = btrfs_sb_offset(i);
  		if (bytenr + 4096>= i_size_read(bdev->bd_inode))
  			break;

Pay attention that when a device is removed from a filesystem by the command "btrfs device delete", *only* the 1st superblock btrfs signature is zeroed [1]. This means that the other (backup) superblocks will be considered valid with your change.

[1] See the function btrfs_rm_device() in volume.c