btrfs-progs: mkfs: use correct size for superblock csum and writeout

If sectorsize is not BTRFS_SUPER_INFO_SIZE (4k), the superblock checksum
is wrong and mkfs fails. This has been reported on ppc64 where we pick
sectorisize from page size (64k).  This has been broken since ages
(2008) and discovered by the recently added superblock checks.

Reported-by: Dinar Valeev <dvaleev@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
master
David Sterba 2015-11-19 15:55:05 +01:00
parent 37a3f64756
commit bf1ac8305a
1 changed files with 4 additions and 4 deletions

View File

@ -552,12 +552,12 @@ int make_btrfs(int fd, struct btrfs_mkfs_config *cfg)
/* and write out the super block */
BUG_ON(sizeof(super) > cfg->sectorsize);
memset(buf->data, 0, cfg->sectorsize);
memset(buf->data, 0, BTRFS_SUPER_INFO_SIZE);
memcpy(buf->data, &super, sizeof(super));
buf->len = cfg->sectorsize;
buf->len = BTRFS_SUPER_INFO_SIZE;
csum_tree_block_size(buf, BTRFS_CRC32_SIZE, 0);
ret = pwrite(fd, buf->data, cfg->sectorsize, cfg->blocks[0]);
if (ret != cfg->sectorsize) {
ret = pwrite(fd, buf->data, BTRFS_SUPER_INFO_SIZE, cfg->blocks[0]);
if (ret != BTRFS_SUPER_INFO_SIZE) {
ret = (ret < 0 ? -errno : -EIO);
goto out;
}