> Hi Namjae - Hi Eric, > > It seems that exfat is unhappy on 4k logical sector size devices: Thanks for your report! We have got same report from Christophe Vu-Brugier. And he sent us the patch(https://github.com/exfatprogs/exfatprogs/pull/164) to fix it yesterday.(Thanks Christophe!), I will check it today. > > [root@big18 exfatprogs]# modprobe scsi_debug sector_size=4096 > dev_size_mb=256 > [root@big18 exfatprogs]# dmesg | tail -n 1 > [933449.931608] sd 16:0:0:0: [sdh] Attached SCSI disk > [root@big18 exfatprogs]# mkfs.exfat /dev/sdh > exfatprogs version : 1.0.4 > Creating exFAT filesystem(/dev/sdh, cluster size=4096) > > Writing volume boot record: done > Writing backup volume boot record: done > Fat table creation: done > Allocation bitmap creation: done > Upcase table creation: done > Writing root directory entry: done > Synchronizing... > > exFAT format complete! > > [root@big18 exfatprogs]# fsck.exfat /dev/sdh > exfatprogs version : 1.0.4 > checksums of boot sector are not correct. 0x44e6c5, but expected 0xda55694. > Fix (y/N)? n > > [root@big18 exfatprogs]# mount /dev/sdh /mnt/test > mount: /mnt/test: wrong fs type, bad option, bad superblock on /dev/sdh, > missing codepage or helper program, or other error. > [root@big18 exfatprogs]# dmesg > <...> > [933485.685102] exFAT-fs (sdh): Invalid exboot-signature(sector = 1): > 0x00000000 > [933485.686134] exFAT-fs (sdh): Invalid exboot-signature(sector = 2): > 0x00000000 > [933485.687173] exFAT-fs (sdh): Invalid exboot-signature(sector = 3): > 0x00000000 > [933485.688209] exFAT-fs (sdh): Invalid exboot-signature(sector = 4): > 0x00000000 > [933485.689247] exFAT-fs (sdh): Invalid exboot-signature(sector = 5): > 0x00000000 > [933485.690283] exFAT-fs (sdh): Invalid exboot-signature(sector = 6): > 0x00000000 > [933485.691318] exFAT-fs (sdh): Invalid exboot-signature(sector = 7): > 0x00000000 > [933485.692352] exFAT-fs (sdh): Invalid exboot-signature(sector = 8): > 0x00000000 > [933485.695450] exFAT-fs (sdh): Invalid boot checksum (boot checksum : > 0x0044e6c5, checksum : 0x04653cbf) > [933485.695452] exFAT-fs (sdh): invalid boot region > [933485.695453] exFAT-fs (sdh): failed to recognize exfat type > > I think the primary problem here is that the boot sector disk structures are > always 512 bytes, even if the underlying disk sectors are 4k. There is a > mismatch between mkfs, fsck, and the kernel in this respect. mkfs calculates > checksums using 512 bytes for all but the OEM and reserved sectors, where it > uses sector_size instead (which may be 4k) Right. > > 3 mkfs/mkfs.c exfat_write_boot_sector 129 > boot_calc_checksum((unsigned char *)ppbr, sizeof(struct pbr), > 4 mkfs/mkfs.c exfat_write_extended_boot_sectors 155 > boot_calc_checksum((unsigned char *) &eb, sizeof(struct exbs), > 5 mkfs/mkfs.c exfat_write_oem_sector 184 > boot_calc_checksum((unsigned char *)oem, bd->sector_size, false, > 6 mkfs/mkfs.c exfat_write_oem_sector 196 > boot_calc_checksum((unsigned char *)oem, bd->sector_size, false, > > but fsck uses the disk sector size (4k) for everything, so there is a > checksum mismatch and failure. > > exfat_update_boot_checksum() > ... > int sector_size = bd->sector_size; > ... > boot_calc_checksum(buf, sector_size, is_boot_sec, > &checksum); > > The kernel has similar problems at mount time. > > (the kernel also has an issue where exfat_verify_boot_region is looking at 4 > bytes from the end of the sector for EXBOOT_SIGNATURE, rather than 4 bytes > from the end of the boot_sector. Also, s_blocksize_bits never gets set...) > > Anyway, this can all be fixed, but first there is a question about what is > proper: Okay. > > For these 11 regions (main boot sector, main extended boot sectors, OEM, and > reserved, I think?) should the checksums be calculated on the full sector > size (possibly 4k) or 512, or is it calculated on 512 (structure size) for > all but the OEM sector as mkfs does? It's not clear to me from a quick read > of the spec. > > (But from the example at > https://docs.microsoft.com/en-us/windows/win32/fileio/exfat-specification#figure-1-boot-checksum-computation > it almost looks like the checksum calculation should cover the entire 4k for > all these regions, even if the disk structure itself is smaller?) In this case, We can check a dump of boot sectors formatted from Windows. Let me check it more. Thanks Eric! > > Thanks, > -Eric >