201 lines
8.2 KiB
PHP
201 lines
8.2 KiB
PHP
;static char *SCCSID = "@(#)tables.h 12.2 88/12/19";
|
||
ifdef MASM
|
||
BREAK <OFT - Open File Table>
|
||
endif
|
||
|
||
;* OFT - Open File Table
|
||
;
|
||
; The OFT contains file specific information which is independent
|
||
; of an instance of use of the file.
|
||
;
|
||
; If the file is open for write access, we keep a pointer to
|
||
; it's directory entry, not just it's
|
||
; FNODE, so that we can update the length and modification time when it's
|
||
; written.
|
||
;
|
||
; We store the directory's FNODE number and the file name, with these
|
||
; we can find the directory entry again even if the directory has
|
||
; been shuffled by creates or deletes of other files. Two advisorys
|
||
; are kept - the Vsector number, cache block address, and cache block
|
||
; offset of the actual directory entry. This information has three
|
||
; levels of validity:
|
||
;
|
||
; 1) Vsector, header address, and offset are valid
|
||
; you can find the dir entry easily
|
||
; 2) the header address is invalid due to cache flushing.
|
||
; Vsector # and offset are still valid, so read the
|
||
; cache block and go directly to the entry
|
||
; In this case the header address points to the wrong
|
||
; Vsector
|
||
; 3) the directory has been altered since we opened the file,
|
||
; so none of this info is accurate. In this case the
|
||
; directory alteration routines located this OFT
|
||
; entry and zeroed the Vsector number. Go to the directory
|
||
; and search the name again.
|
||
;
|
||
|
||
OFT struc
|
||
OFT_P db (size DCHDR) dup (?) ; double chain of OFT structures, rooted in OFTHead[i]
|
||
OFT_FHT db (size DCHDR) dup (?) ; double chain of FHT structures
|
||
OFT_RLCK db (size DCHDR) dup (?) ; double chain of RECLOCK structures
|
||
OFT_FN db (size SECPTR) dup (?) ; pointer to file FNODE
|
||
OFT_SBD dw ? ; pointer to SBDIR structure
|
||
OFT_DIRE db (size SECPTR) dup (?) ; pointer to directory block
|
||
|
||
OFT_CCNT dd ? ; DB_CCNT value for OFT_DIRE to check OFT_DIRO validity
|
||
OFT_FREEDCNT dd ? ; SD_FREEDCNT value for DIRE to be valid
|
||
|
||
;
|
||
; These length fields are used when writing the file.
|
||
; The OFN_ entries will reflect the OFT_ALEN value. These
|
||
; aren't updated in the FNODE until the file closes, whereup
|
||
; they are trimmed back to OFT_LEN which is itself propigated
|
||
; to the file's DIR entry. If write-through is set then the
|
||
; OFN_ entries below will be propigated to the FNODE and
|
||
; then to the disk, but if we crash the cleanup program
|
||
; will deallocate the "extra" sectors.
|
||
;
|
||
|
||
OFT_LEN dd ? ; file actual length
|
||
OFT_ALEN dd ? ; file allocated length (SECSIZE multiple)
|
||
OFT_WLEN dd ? ; last byte+1 of valid data in the file
|
||
; (optimization for writing into extended areas
|
||
OFT_LAST dd ? ; Psector # of last sector in file, or 0
|
||
OFT_LRP db (size SECPTR) dup (?) ; last run pointer. Valid if OFT_LAST !=0
|
||
; if OFN_AB.ABF_NODE ==0 this is the address of
|
||
; an OFN_SEC record in this OFT
|
||
; else this is a SECPTR to the SIB
|
||
; containing the last run record
|
||
|
||
OFT_VOL dd ? ; pointer to VOLTAB for this guy
|
||
|
||
OFT_NAME dd ? ; address of name string len byte
|
||
; followed by name string itself
|
||
; len doesn't include len byte
|
||
|
||
OFT_DIRO dw ? ; offset into directory block for entry
|
||
OFT_FILL dw ? ; unused, fill
|
||
|
||
OFT_LCKCNT dw ? ; count of guys in OFT_RLCK
|
||
|
||
OFT_WCNT dw ? ; # of threads blocked on this OFT
|
||
|
||
; the following three fields are used to
|
||
; control access. They're identical in use
|
||
; to the equivalent fields in SBDIR. The
|
||
; Flag byte only contains locking/holding
|
||
; flags, so if DWORD PTR OFT_HCNT is 0 then
|
||
; the OFT is known to be free and clear
|
||
|
||
OFT_HCNT dw ? ; held count, has OTF_PND bit also
|
||
OFT_DMY db ? ; unused, must be 0
|
||
OFT_FLAG db ? ; flag byte, high order in OFT_HCNT dword
|
||
|
||
OFT_WAITC dd ? ; head of wait chain if locked
|
||
|
||
OFT_OPLOCK dd ? ; Oplock value, 0 if none
|
||
|
||
OFT_BANDP dd ? ; pointer to BandTab structure in BandList
|
||
; for our last allocation. =0 if unused
|
||
|
||
; The following 5 fields hold the accumulation of all FHTs for this OFT.
|
||
; This saves us from having to scan the FHTs to do a sharing check upon
|
||
; open. An OFT is unused when OFT_RD and OFT_WT and OFT_FIND are zero
|
||
|
||
OFT_RD dw ? ; # of opens for read
|
||
OFT_WT dw ? ; # of opens for write
|
||
OFT_DR dw ? ; # of opens with deny read
|
||
OFT_DW dw ? ; # of opens with deny write
|
||
OFT_COMPAT dw ? ; # of opens for compatibility mode
|
||
OFT_FIND dw ? ; count of active FINDs using this OFT
|
||
|
||
OFT_REALLYBAD db ? ; non-zero if file is unusable due to
|
||
; corrupt disk BUGBUG - FOLD INTO BITS
|
||
OFT_SFLAG db ? ; special flag byte
|
||
OFT_DMY2 dw ? ; unused
|
||
|
||
|
||
; BUGBUG - rearrange these fields for er offsets dw ?
|
||
;
|
||
; Info copied from the file's FNODE
|
||
;
|
||
; The ALLEAF blocks must follow the ALBLK value
|
||
;
|
||
|
||
OFN_AB db (size ALBLK) dup (?) ; allocation block structure
|
||
OFN_ALREC db (8*size ALLEAF) dup (?) ; referenced from FN_AB
|
||
|
||
OFT ends
|
||
|
||
; flag bits for OFT_FLAG
|
||
|
||
OTF_LCK equ 01h ; file is locked against access
|
||
OTF_PLK equ 02h ; pending lock
|
||
OTF_PSO equ 04h ; pending solo
|
||
OTF_PND equ 80h ; lock pending bit
|
||
|
||
; flag bits for OFT_SFLAG
|
||
|
||
OFS_OPLK equ 01h ; oplocked
|
||
OFS_OPBA equ 02h ; oplock BATCH flag set
|
||
OFS_DASD equ 04h ; DASD file
|
||
ifdef DEBUG
|
||
OFS_SAC equ 08h ; supress OFT_ALEN debug check
|
||
endif
|
||
|
||
; The file storage information from the fnode is replicated
|
||
; in the OFT. This saves us from having to blow a cache block
|
||
; keeping the FNODE in ram for every open file. The FNODE
|
||
; is only accessed when a file is open, and when it's closed.
|
||
; (If write-through is set, it's accessed for every growth)
|
||
;
|
||
; These statements are to keep the FNODE and the OFT in sync.
|
||
|
||
ifdef MASM
|
||
.errnz (size OFN_ALREC - size FN_ALREC)
|
||
endif
|
||
|
||
|
||
;* FHT - File Handle Table
|
||
;
|
||
; The FHT contains per-handle informatiuon
|
||
|
||
FHT struc
|
||
FHT_SEEK dd ? ; seek pointer
|
||
FHT_OFT dd ? ; pointer to OFT
|
||
FHT_CHN db (size DCHDR) dup (?) ; chain of FHTs for an OFT
|
||
FHT_UID dd ? ; UID and Session ID
|
||
FHT_MODE dw ? ; mode bits from OPEN
|
||
FHT_RAA dw ? ; read ahead advisory
|
||
FHT_HINT dd ? ; hint flags
|
||
FHT ends
|
||
|
||
ifdef MASM
|
||
.errnz FHT_CHN-OFT_FHT ; same offset used for both
|
||
endif
|
||
|
||
;* FHT_HINT flags
|
||
|
||
FHH_SEQ equ 01 ; sequential file
|
||
|
||
|
||
;* RecLock - Record Locking Records
|
||
;
|
||
; One record per lock, chained to the OFT. These are chained
|
||
; in order RL_BEG
|
||
;
|
||
|
||
RECLOCK struc
|
||
RL_BEG dd ? ; begining byte of locked range
|
||
RL_END dd ? ; end byte of locked range
|
||
RL_TYPE db ? ; =1 if read allowed, =0 if full lock
|
||
RL_MEM db ? ; =0 if from heap, =1 if from special list
|
||
RL_DMY dw ? ; padding
|
||
RL_SPID dd ? ; Session/Pid
|
||
RL_CHN db (size DCHDR) dup (?) ; double chain of RECLOCK structures
|
||
RECLOCK ends
|
||
|
||
ifdef MASM
|
||
.errnz RL_CHN-OFT_RLCK ; must have same offset to work
|
||
endif
|
||
|