diff options
author | bde <bde@FreeBSD.org> | 2000-08-25 09:03:58 +0000 |
---|---|---|
committer | bde <bde@FreeBSD.org> | 2000-08-25 09:03:58 +0000 |
commit | bfd8253e3473797776e4cbf70d1083d3787169fc (patch) | |
tree | 4d52b1e5d07060919052a4b5437b554918eac9ff /sys/msdosfs/msdosfsmount.h | |
parent | 5653c3f28658da0866d1af8906cb9d9ac3d04b44 (diff) | |
download | FreeBSD-src-bfd8253e3473797776e4cbf70d1083d3787169fc.zip FreeBSD-src-bfd8253e3473797776e4cbf70d1083d3787169fc.tar.gz |
Quick fix for msdsofs_write() on alphas and other machines with either
longs larger than 32 bits or strict alignment requirements.
pm_fatmask had type u_long, but it must have a type that has precisely
32 bits and this type must be no smaller than int, so that ~pmp->pm_fatmask
has no bits above the 31st set. Otherwise, comparisons between (cn
| ~pmp->pm_fatmask) and magic 32-bit "cluster" numbers always fail.
The correct fix is to use the C99 type uint_least32_t and mask with
0xffffffff. The quick fix is to use u_int32_t and assume that ints
have
msdosfs metadata is riddled with unaligned fields, and on alphas,
unaligned_fixup() apparently has problems fixing up the unaligned
accesses caused by this. The quick fix is to not comment out the
NetBSD code that sort of handles this, and define UNALIGNED_ACCESS on
i386's so that the code doesn't change on i386's. The correct fix
would define UNALIGNED_ACCESS in a central machine-dependent header
and maybe add some extra cases to unaligned_fixup(). UNALIGNED_ACCESS
is also tested in isofs.
Submitted by: parts by Mark Abene <phiber@radicalmedia.com>
PR: 19086
Diffstat (limited to 'sys/msdosfs/msdosfsmount.h')
-rw-r--r-- | sys/msdosfs/msdosfsmount.h | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/msdosfs/msdosfsmount.h b/sys/msdosfs/msdosfsmount.h index adcfad0..da49190 100644 --- a/sys/msdosfs/msdosfsmount.h +++ b/sys/msdosfs/msdosfsmount.h @@ -84,7 +84,7 @@ struct msdosfsmount { u_long pm_fatblocksize; /* size of fat blocks in bytes */ u_long pm_fatblocksec; /* size of fat blocks in sectors */ u_long pm_fatsize; /* size of fat in bytes */ - u_long pm_fatmask; /* mask to use for fat numbers */ + u_int32_t pm_fatmask; /* mask to use for fat numbers */ u_long pm_fsinfo; /* fsinfo block number */ u_long pm_nxtfree; /* next free cluster in fsinfo block */ u_int pm_fatmult; /* these 2 values are used in fat */ |