Cedar Nucleus (Files): management of physical volumes
PhysicalVolume.mesa
Andrew Birrell August 8, 1983 10:16 am
DIRECTORY
Disk USING[ Channel, PageCount, PageNumber ],
File USING[ RC, Volume, VolumeID ],
Rope USING[ ROPE ];
PhysicalVolume: CEDAR DEFINITIONS =
BEGIN
The world consists of online packs, each mounted on a drive. Each interesting pack contains precisely one physical volume. Each physical volume contains some number of sub-volumes. Each sub-volume is a part of some logical volume. A logical volume consists of its constituent sub-volumes. Sub-volumes may be added to a physical volume, but once added their layout may not be changed without erasing the entire physical volume.
Physical: TYPE = REF PhysicalObject;
PhysicalObject: TYPE;
NextPhysical: PROC[prev: Physical, wait: BOOLFALSE] RETURNS[Physical];
GetPhysical: PROC[volume: File.Volume, page: LogicalPage ← [0]] RETURNS[ Physical ];
Returns the physical volume containing the specified page of the logical volume.
PhysicalRC: TYPE = File.RC[ok..hardware];
PhysicalInfo: PROC[Physical] RETURNS[
channel: Disk.Channel,
rootStatus: PhysicalRC,
id: File.VolumeID, -- unique id of this physical volume --
name: Rope.ROPE,
size: Disk.PageCount,
free: Disk.PageCount,
timeValid: BOOL,
time: TimeParameters];
If rootStatus # ok then the later results are undefined.
TimeParameters: TYPE[2];
Opaque at this level. Concrete type is only interesting to Time software.
LogicalPage: TYPE = RECORD[INT];
-- Page number relative to a logical volume --
LogicalPageCount: TYPE = INT;
SubVolumeDetails: TYPE = REF READONLY SubVolumeDetailsObject;
SubVolumeDetailsObject: TYPE = RECORD[ -- immutable information about the sub-volume --
id: File.VolumeID, -- logical volume of which this is a fragment --
start: LogicalPage, -- logical page number of this fragment of logical volume --
size: LogicalPageCount,
physical: Physical,
channel: Disk.Channel,
address: Disk.PageNumber -- physical page number of this subvolume --
];
WriteTimeParameters: PROC[physical: Physical, timeValid: BOOL, time: TimeParameters] RETURNS[ PhysicalRC ];
Credentials: TYPE = --VM-page-aligned-- LONG POINTER TO CredentialsObject;
CredentialsObject: TYPE;
ReadCredentials: UNSAFE PROC[physical: Physical, credentials: Credentials] RETURNS[ PhysicalRC ];
Assumes "credentials" is VM-page-aligned and occupies File.wordsPerPage words; the memory belongs to the caller. No errors.
WriteCredentials: PROC[physical: Physical, credentials: Credentials] RETURNS[ PhysicalRC ];
Assumes "credentials" is VM-page-aligned and occupies File.wordsPerPage words; the memory belongs to the caller. No errors.
END.