mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	btrfs: initialize fs_info::csum_size earlier in open_ctree
User reported that btrfs-progs misc-tests/028-superblock-recover fails:
      [TEST/misc]   028-superblock-recover
  unexpected success: mounted fs with corrupted superblock
  test failed for case 028-superblock-recover
The test case expects that a broken image with bad superblock will be
rejected to be mounted. However, the test image just passed csum check
of superblock and was successfully mounted.
Commit 55fc29bed8 ("btrfs: use cached value of fs_info::csum_size
everywhere") replaces all calls to btrfs_super_csum_size by
fs_info::csum_size. The calls include the place where fs_info->csum_size
is not initialized. So btrfs_check_super_csum() passes because memcmp()
with len 0 always returns 0.
Fix it by caching csum size in btrfs_fs_info::csum_size once we know the
csum type in superblock is valid in open_ctree().
Link: https://github.com/kdave/btrfs-progs/issues/250
Fixes: 55fc29bed8 ("btrfs: use cached value of fs_info::csum_size everywhere")
Signed-off-by: Su Yue <l@damenly.su>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
			
			
This commit is contained in:
		
							parent
							
								
									9ad6d91f05
								
							
						
					
					
						commit
						83c68bbcb6
					
				
					 1 changed files with 2 additions and 1 deletions
				
			
		| 
						 | 
					@ -3044,6 +3044,8 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device
 | 
				
			||||||
		goto fail_alloc;
 | 
							goto fail_alloc;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fs_info->csum_size = btrfs_super_csum_size(disk_super);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ret = btrfs_init_csum_hash(fs_info, csum_type);
 | 
						ret = btrfs_init_csum_hash(fs_info, csum_type);
 | 
				
			||||||
	if (ret) {
 | 
						if (ret) {
 | 
				
			||||||
		err = ret;
 | 
							err = ret;
 | 
				
			||||||
| 
						 | 
					@ -3161,7 +3163,6 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device
 | 
				
			||||||
	fs_info->nodesize = nodesize;
 | 
						fs_info->nodesize = nodesize;
 | 
				
			||||||
	fs_info->sectorsize = sectorsize;
 | 
						fs_info->sectorsize = sectorsize;
 | 
				
			||||||
	fs_info->sectorsize_bits = ilog2(sectorsize);
 | 
						fs_info->sectorsize_bits = ilog2(sectorsize);
 | 
				
			||||||
	fs_info->csum_size = btrfs_super_csum_size(disk_super);
 | 
					 | 
				
			||||||
	fs_info->csums_per_leaf = BTRFS_MAX_ITEM_SIZE(fs_info) / fs_info->csum_size;
 | 
						fs_info->csums_per_leaf = BTRFS_MAX_ITEM_SIZE(fs_info) / fs_info->csum_size;
 | 
				
			||||||
	fs_info->stripesize = stripesize;
 | 
						fs_info->stripesize = stripesize;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue