54eb3b1f88
<polk@bsdi.com>. His notes are as follows: ------------------------------------------------------------------------------ July 22, 1993 - Changed name of entire package from PCFS to MSDOSFS - Fixed bugs: root directory size in clusters instead of bytes growing directory didn't update in-core size link, symlink, mknod didn't free locked parent (deadlock) lookup returned real error on create and rename instead of EJUSTRETURN rename changed `.' entry in child instead of name entry in parent rename removed `.' entry in child instead of removing entry in parent when moving a directory from one dir to another createde() left new node locked when write of parent failed (deadlock) removede() decremented refcount even on error (rmdir's which failed due to write errors left in-core cache entries inconsistent) changed validation for filesystem to not check for the boot signature since some disks (e.g., mtools) aren't bootable directories are always show current time as modify time (needed for NFS export since DOS never updates dir mod times -- ctime is true create time). - Added support for cookies changes to the readdir() vnode interface (#ifdef __bsdi__) - Punted on the whole problem of inode generation numbers. This means that there's a chance of using a stale file handle to access a new file, but it doesn't appear to be the common case, and I don't see how to generate reasonable generation numbers without changing something on the disk (which is the way the SVR4 filesystem survival kit guys did it). I don't think it would be very safe to change the on-disk format. Jeff Polk (polk@BSDI.COM) ------------------------------------------------------------------------------
106 lines
3.7 KiB
C
106 lines
3.7 KiB
C
/*
|
|
* Written by Paul Popelka (paulp@uts.amdahl.com)
|
|
*
|
|
* You can do anything you want with this software, just don't say you wrote
|
|
* it, and don't remove this notice.
|
|
*
|
|
* This software is provided "as is".
|
|
*
|
|
* The author supplies this software to be publicly redistributed on the
|
|
* understanding that the author is not responsible for the correct
|
|
* functioning of this software in any circumstances and is not liable for
|
|
* any damages caused by this software.
|
|
*
|
|
* October 1992
|
|
*
|
|
* $Id: bpb.h,v 1.1 1993/08/13 11:35:30 cgd Exp $
|
|
*/
|
|
|
|
/*
|
|
* BIOS Parameter Block (BPB) for DOS 3.3
|
|
*/
|
|
struct bpb33 {
|
|
u_short bpbBytesPerSec; /* bytes per sector */
|
|
u_char bpbSecPerClust; /* sectors per cluster */
|
|
u_short bpbResSectors; /* number of reserved sectors */
|
|
u_char bpbFATs; /* number of FATs */
|
|
u_short bpbRootDirEnts; /* number of root directory entries */
|
|
u_short bpbSectors; /* total number of sectors */
|
|
u_char bpbMedia; /* media descriptor */
|
|
u_short bpbFATsecs; /* number of sectors per FAT */
|
|
u_short bpbSecPerTrack; /* sectors per track */
|
|
u_short bpbHeads; /* number of heads */
|
|
u_short bpbHiddenSecs; /* number of hidden sectors */
|
|
};
|
|
|
|
/*
|
|
* BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
|
|
* and bpbHugeSectors is not in the 3.3 bpb.
|
|
*/
|
|
struct bpb50 {
|
|
u_short bpbBytesPerSec; /* bytes per sector */
|
|
u_char bpbSecPerClust; /* sectors per cluster */
|
|
u_short bpbResSectors; /* number of reserved sectors */
|
|
u_char bpbFATs; /* number of FATs */
|
|
u_short bpbRootDirEnts; /* number of root directory entries */
|
|
u_short bpbSectors; /* total number of sectors */
|
|
u_char bpbMedia; /* media descriptor */
|
|
u_short bpbFATsecs; /* number of sectors per FAT */
|
|
u_short bpbSecPerTrack; /* sectors per track */
|
|
u_short bpbHeads; /* number of heads */
|
|
u_long bpbHiddenSecs; /* number of hidden sectors */
|
|
u_long bpbHugeSectors; /* number of sectrs if bpbSectors == 0 */
|
|
};
|
|
|
|
/*
|
|
* The following structures represent how the bpb's look on disk. shorts
|
|
* and longs are just character arrays of the appropriate length. This is
|
|
* because the compiler forces shorts and longs to align on word or
|
|
* halfword boundaries.
|
|
*/
|
|
#include <machine/endian.h>
|
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
|
#define getushort(x) *((u_short *)(x))
|
|
#define getulong(x) *((u_long *)(x))
|
|
#define putushort(p, v) (*((u_short *)(p)) = (v))
|
|
#define putulong(p, v) (*((u_long *)(p)) = (v))
|
|
#else
|
|
|
|
#endif
|
|
|
|
/*
|
|
* BIOS Parameter Block (BPB) for DOS 3.3
|
|
*/
|
|
struct byte_bpb33 {
|
|
char bpbBytesPerSec[2]; /* bytes per sector */
|
|
char bpbSecPerClust; /* sectors per cluster */
|
|
char bpbResSectors[2]; /* number of reserved sectors */
|
|
char bpbFATs; /* number of FATs */
|
|
char bpbRootDirEnts[2]; /* number of root directory entries */
|
|
char bpbSectors[2]; /* total number of sectors */
|
|
char bpbMedia; /* media descriptor */
|
|
char bpbFATsecs[2]; /* number of sectors per FAT */
|
|
char bpbSecPerTrack[2]; /* sectors per track */
|
|
char bpbHeads[2]; /* number of heads */
|
|
char bpbHiddenSecs[2]; /* number of hidden sectors */
|
|
};
|
|
|
|
/*
|
|
* BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
|
|
* and bpbHugeSectors is not in the 3.3 bpb.
|
|
*/
|
|
struct byte_bpb50 {
|
|
char bpbBytesPerSec[2]; /* bytes per sector */
|
|
char bpbSecPerClust; /* sectors per cluster */
|
|
char bpbResSectors[2]; /* number of reserved sectors */
|
|
char bpbFATs; /* number of FATs */
|
|
char bpbRootDirEnts[2]; /* number of root directory entries */
|
|
char bpbSectors[2]; /* total number of sectors */
|
|
char bpbMedia; /* media descriptor */
|
|
char bpbFATsecs[2]; /* number of sectors per FAT */
|
|
char bpbSecPerTrack[2]; /* sectors per track */
|
|
char bpbHeads[2]; /* number of heads */
|
|
char bpbHiddenSecs[4]; /* number of hidden sectors */
|
|
char bpbHugeSectors[4]; /* number of sectrs if bpbSectors == 0 */
|
|
};
|