diff mbox

btrfs: Don't continue mounting when superblock csum mismatches even generation is less than 10.

Message ID 1403599753-4072-1-git-send-email-quwenruo@cn.fujitsu.com (mailing list archive)
State Rejected
Headers show

Commit Message

Qu Wenruo June 24, 2014, 8:49 a.m. UTC
Revert kernel commit 667e7d94a1683661cff5fe9a0fa0d7f8fdd2c007.
(Btrfs: allow superblock mismatch from older mkfs by Chris Mason)

Above commit will cause disaster if someone try to mount a newly created but
later corrupted btrfs filesystem.

And before btrfs entered mainline, btrfs-progs has already superblock
checksum. See btrfs-progs commit: 5ccd1715fa2eaad0b26037bb53706779c8c93b5f
(superblock duplication by Yan Zheng).
Before commit 5ccd17, mkfs.btrfs uses 16K as super offset, while current btrfs
uses 64K super offset, anyway old btrfs without super csum will not be
mountable due to the change of super offset.

So backward compatibility is not a problem.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
---
 fs/btrfs/disk-io.c | 6 ------
 1 file changed, 6 deletions(-)

Comments

Qu Wenruo Aug. 7, 2014, 2:51 a.m. UTC | #1
It seems that the patch is rejected in patchwork,

Could any one tell me the reason?

Thanks,
Qu
-------- Original Message --------
Subject: [PATCH] btrfs: Don't continue mounting when superblock csum 
mismatches even generation is less than 10.
From: Qu Wenruo <quwenruo@cn.fujitsu.com>
To: linux-btrfs@vger.kernel.org
Date: 2014?06?24? 16:49
> Revert kernel commit 667e7d94a1683661cff5fe9a0fa0d7f8fdd2c007.
> (Btrfs: allow superblock mismatch from older mkfs by Chris Mason)
>
> Above commit will cause disaster if someone try to mount a newly created but
> later corrupted btrfs filesystem.
>
> And before btrfs entered mainline, btrfs-progs has already superblock
> checksum. See btrfs-progs commit: 5ccd1715fa2eaad0b26037bb53706779c8c93b5f
> (superblock duplication by Yan Zheng).
> Before commit 5ccd17, mkfs.btrfs uses 16K as super offset, while current btrfs
> uses 64K super offset, anyway old btrfs without super csum will not be
> mountable due to the change of super offset.
>
> So backward compatibility is not a problem.
>
> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
> ---
>   fs/btrfs/disk-io.c | 6 ------
>   1 file changed, 6 deletions(-)
>
> diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
> index 8bb4aa1..dbfb2a3 100644
> --- a/fs/btrfs/disk-io.c
> +++ b/fs/btrfs/disk-io.c
> @@ -400,12 +400,6 @@ static int btrfs_check_super_csum(char *raw_disk_sb)
>   
>   		if (memcmp(raw_disk_sb, result, csum_size))
>   			ret = 1;
> -
> -		if (ret && btrfs_super_generation(disk_sb) < 10) {
> -			printk(KERN_WARNING
> -				"BTRFS: super block crcs don't match, older mkfs detected\n");
> -			ret = 0;
> -		}
>   	}
>   
>   	if (csum_type >= ARRAY_SIZE(btrfs_csum_sizes)) {

--
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
David Sterba Aug. 19, 2014, 5:18 p.m. UTC | #2
On Thu, Aug 07, 2014 at 10:51:15AM +0800, Qu Wenruo wrote:
> It seems that the patch is rejected in patchwork,

It was not me :)

> Could any one tell me the reason?

I'd understand that the patch is no longer needed after the original
problem went away, but it's not what you describe in your changelog.
From that point the reason might not be compelling.

> >Above commit will cause disaster if someone try to mount a newly created but
> >later corrupted btrfs filesystem.

The generation after mkfs is something like 4 or 5, this means that the
corruption would have to happen in the first few transaction commits,
this is unlikely and the filesystem will be probably fairly empty at
that time.

If the concern is about corrupted generation counter itself in the
superblock, then yes this could hurt.

It's still possible to compare the 1st superblock with the copies, the
one at offset 64M is available in 99%, there are enough data to make a
decision what's actually corrupted. This could catch more corruption
than just the generation counter.

From the output of btrfs-show-super:

generation              56392
chunk_root_generation   56392
cache_generation        56392
uuid_tree_generation    56392

the generation is duplicated several times, so a minimal patch could be
to do additional comparison with the others.

> >And before btrfs entered mainline, btrfs-progs has already superblock
> >checksum. See btrfs-progs commit: 5ccd1715fa2eaad0b26037bb53706779c8c93b5f
> >(superblock duplication by Yan Zheng).

The superblock checksum was not calculated the same way as in kernel,
but with the missing check this was not detected.

> >Before commit 5ccd17, mkfs.btrfs uses 16K as super offset, while current btrfs
> >uses 64K super offset, anyway old btrfs without super csum will not be
> >mountable due to the change of super offset.
> >
> >So backward compatibility is not a problem.

Superblocks at offset 16k are not supported anymore AFAICT.
--
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
Chris Mason Aug. 19, 2014, 7:48 p.m. UTC | #3
On 08/06/2014 10:51 PM, Qu Wenruo wrote:
> It seems that the patch is rejected in patchwork,
> 
> Could any one tell me the reason?

I had nack'd it because I was worried at the time about the super crc
errors that Dave had found in the past.  Sorry, I really thought I had
sent email about it.

But Dave has a great point in his reply about validating the super
generation.

-chris
--
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
Qu Wenruo Aug. 20, 2014, 1:16 a.m. UTC | #4
-------- Original Message --------
Subject: Re: [PATCH] btrfs: Don't continue mounting when superblock csum 
mismatches even generation is less than 10.
From: David Sterba <dsterba@suse.cz>
To: Qu Wenruo <quwenruo@cn.fujitsu.com>
Date: 2014?08?20? 01:18
> On Thu, Aug 07, 2014 at 10:51:15AM +0800, Qu Wenruo wrote:
>> It seems that the patch is rejected in patchwork,
> It was not me :)
>
>> Could any one tell me the reason?
> I'd understand that the patch is no longer needed after the original
> problem went away, but it's not what you describe in your changelog.
>  From that point the reason might not be compelling.
>
>>> Above commit will cause disaster if someone try to mount a newly created but
>>> later corrupted btrfs filesystem.
> The generation after mkfs is something like 4 or 5, this means that the
> corruption would have to happen in the first few transaction commits,
> this is unlikely and the filesystem will be probably fairly empty at
> that time.
>
> If the concern is about corrupted generation counter itself in the
> superblock, then yes this could hurt.
>
> It's still possible to compare the 1st superblock with the copies, the
> one at offset 64M is available in 99%, there are enough data to make a
> decision what's actually corrupted. This could catch more corruption
> than just the generation counter.
>
>  From the output of btrfs-show-super:
>
> generation              56392
> chunk_root_generation   56392
> cache_generation        56392
> uuid_tree_generation    56392
>
> the generation is duplicated several times, so a minimal patch could be
> to do additional comparison with the others.
Thanks for the explaination.
But in fact, when investigating some bugs (not kernel bugzilla but 
proprietary one), I found not only one but two
disk images whose superblock csum doesn't match and a lot of values go 
crazy.
For example, num_devices goes to 871878361089 and serval bits diffs in 
dev_item.fsid and fsid.
BTW, cache generation is also crazy.

Normally, such superblock should not be mountable since the csum doesn't 
match.
But due to the mentioned commit, the generation (4) is below 10 and 
kernel just ignore the csum error,
and finally, a kernel BUG is triggered, since a lot of things go wrong 
anything is possible.

So I sent the patch and hope to avoid such problem.

Thanks,
Qu
>
>>> And before btrfs entered mainline, btrfs-progs has already superblock
>>> checksum. See btrfs-progs commit: 5ccd1715fa2eaad0b26037bb53706779c8c93b5f
>>> (superblock duplication by Yan Zheng).
> The superblock checksum was not calculated the same way as in kernel,
> but with the missing check this was not detected.
>
>>> Before commit 5ccd17, mkfs.btrfs uses 16K as super offset, while current btrfs
>>> uses 64K super offset, anyway old btrfs without super csum will not be
>>> mountable due to the change of super offset.
>>>
>>> So backward compatibility is not a problem.
> Superblocks at offset 16k are not supported anymore AFAICT.

--
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
Qu Wenruo Aug. 20, 2014, 2:34 a.m. UTC | #5
-------- Original Message --------
Subject: Re: [PATCH] btrfs: Don't continue mounting when superblock csum 
mismatches even generation is less than 10.
From: Chris Mason <clm@fb.com>
To: Qu Wenruo <quwenruo@cn.fujitsu.com>, <linux-btrfs@vger.kernel.org>
Date: 2014?08?20? 03:48
> On 08/06/2014 10:51 PM, Qu Wenruo wrote:
>> It seems that the patch is rejected in patchwork,
>>
>> Could any one tell me the reason?
> I had nack'd it because I was worried at the time about the super crc
> errors that Dave had found in the past.  Sorry, I really thought I had
> sent email about it.
>
> But Dave has a great point in his reply about validating the super
> generation.
Thanks for the reason.
I'll search and look at Dave's mail and dig into it.

Although as mentioned in the reply to David,
the main problem is that I found two disk images with crazy values in 
superblock and wrong csum,
but generation is still 4, and ignoring the csum error caused kernel BUG.

Thanks,
Qu

>
> -chris

--
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
David Sterba Aug. 25, 2014, 3:28 p.m. UTC | #6
On Wed, Aug 20, 2014 at 10:34:53AM +0800, Qu Wenruo wrote:
> Although as mentioned in the reply to David,
> the main problem is that I found two disk images with crazy values in
> superblock and wrong csum,
> but generation is still 4, and ignoring the csum error caused kernel BUG.

Can you please share the dump of the broken superblock
(btrfs-show-super)?  Thanks.
--
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
diff mbox

Patch

diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 8bb4aa1..dbfb2a3 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -400,12 +400,6 @@  static int btrfs_check_super_csum(char *raw_disk_sb)
 
 		if (memcmp(raw_disk_sb, result, csum_size))
 			ret = 1;
-
-		if (ret && btrfs_super_generation(disk_sb) < 10) {
-			printk(KERN_WARNING
-				"BTRFS: super block crcs don't match, older mkfs detected\n");
-			ret = 0;
-		}
 	}
 
 	if (csum_type >= ARRAY_SIZE(btrfs_csum_sizes)) {