Problem with ntfs and media sector size 1024
Guido van Rooij
guido at gvr.org
Sun Dec 6 13:24:30 UTC 2009
I am running 6-stable and cannot mount an NTFS on a disk with a 1024-byte
sector size.
The disk:
beck# geom disk list da1
Geom name: da1
Providers:
1. Name: da1
Mediasize: 500107862016 (466G)
Sectorsize: 1024
Mode: r0w0e0
fwsectors: 63
fwheads: 255
beck# fdisk /dev/da1
******* Working on device /dev/da1 *******
parameters extracted from in-core disklabel are:
cylinders=30400 heads=255 sectors/track=63 (16065 blks/cyl)
Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=30400 heads=255 sectors/track=63 (16065 blks/cyl)
Media sector size is 1024
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 7 (0x07),(OS/2 HPFS, NTFS, QNX-2 (16 bit) or Advanced UNIX)
start 63, size 488375937 (476929 Meg), flag 0
beg: cyl 0/ head 1/ sector 1;
end: cyl 1023/ head 254/ sector 63
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>
When I try to mount the ntfs, I get:
ntfs_mountfs(): bps: 1024, spc: 4, media: f8, mftrecsz: 246 (1 sects)
ntfs_mountfs(): mftcn: 0xc0000|0x3a380d0
ntfs_mountfs(): case-sens., uid: 0, gid: 0, mode: 755
ntfs_vgetex: ino: 0, attr: 0x80:, lkf: 0x2, f: 0x0
ntfs_ntlookup: looking for ntnode 0
ntfs_ntget: get ntnode 0: 0xc7bdc500, usecount: 0
ntfs_ntlookup: ntnode 0: 0xc7bdc500, usecount: 1
ntfs_loadntnode: loading ino: 0
ntfs_loadntnode: read system node
ntfs_loadntnode: bn: 3145728
ntfs_procfixups: magic doesn't match: 421f128f != 454c4946
ntfs_loadntnode: BAD MFT RECORD 0
ntfs_vget: CAN'T LOAD ATTRIBUTES FOR INO: 0
ntfs_ntput: rele ntnode 0: 0xc7bdc500, usecount: 1
ntfs_ntput: deallocating ntnode: 0
Note: bn: 3145728 is an additional debug printf I inserted just before the
first bread in ntfs_loadntnode().
When I dd this block (using a bs=1k), I get a block with the correct ntfs magic:
> dd if=/dev/da1s1 bs=1k skip=3145728 count=1 of=/tmp/1
1+0 records in
1+0 records out
1024 bytes transferred in 0.000735 secs (1393113 bytes/sec)
> hexdump /tmp/1 | head -2
0000000 4946 454c 0030 0003 0ef9 0200 0000 0000
0000010 0001 0001 0038 0001 0198 0000 0400 0000
However:
> dd if=/dev/da1s1 bs=1k skip=1572864 count=1 of=/tmp/2
1+0 records in
1+0 records out
1024 bytes transferred in 0.000732 secs (1399012 bytes/sec)
> hexdump /tmp/2 | head -2
0000000 128f 421f 0b99 36e7 5e54 4062 cb2c ddd0
0000010 bdba 6c0e d690 aa5a d22e 2a30 cea2 b08e
Note that this is exactly the wrong magic reported in the line:
ntfs_procfixups: magic doesn't match: 421f128f != 454c4946
Note also the 1572864 * 2 = 3145728
I have tried to understand what is going on, and it seems that something is
wrong in the following lines:
bn = ntfs_cntobn(ntmp->ntm_mftcn) +
ntmp->ntm_bpmftrec * ip->i_number;
error = bread(ntmp->ntm_devvp,
bn, ntfs_bntob(ntmp->ntm_bpmftrec),
NOCRED, &bp);
In bread, we see that the blocknumber passed is mulitplie by the statfs
f_iosize value. I this case that is 4K, however, I think that
blocknumbers are 1K in size. That gives a factor 4 though...
Anyone with some fs internal clues on what might be wrong?
-Guido
More information about the freebsd-fs
mailing list