Cedar Nucleus (Files): management of physical volumes
PhysicalVolume.mesa
Andrew Birrell September 20, 1983 2:11 pm
DIRECTORY
Disk USING[ Channel, PageCount, PageNumber ],
File USING[ RC, Volume, VolumeFile, 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];
Standard enumerator. No errors.
GetPhysical: PROC[volume: File.Volume, page: LogicalPage ← [0]] RETURNS[ Physical ];
Returns the physical volume containing the specified page of the logical volume. No errors.
PhysicalRC: TYPE = File.RC[ok..hardware];
PhysicalInfo: PROC[Physical] RETURNS[
channel: Disk.Channel,
rootStatus: PhysicalRC,
The following results are defined only if rootStatus = ok
id: File.VolumeID,
name: Rope.ROPE,
size: Disk.PageCount,
free: Disk.PageCount,
timeValid: BOOL,
time: TimeParameters];
No errors.
TimeParameters: TYPE[2];
Opaque at this level. Concrete type is only interesting to Time software.
SetPhysicalRoot: PROC[volume: File.Volume, root: File.VolumeFile];
! File.Error[wentOffline, nonCedarVolume, inconsistent, software, hardware]
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.
LogicalPage: TYPE = RECORD[INT];
Page number relative to a logical volume
LogicalPageCount: TYPE = INT;
GetSubVolumes: PROC[physical: PhysicalVolume.Physical] RETURNS[ SubVolumes ];
! File.Error[wentOffline, nonCedarVolume, inconsistent, software, hardware]
SubVolumes: TYPE = REF SubVolumesObject;
SubVolumesObject: TYPE = RECORD[
subVolumes: SEQUENCE count: CARDINAL OF SubVolumeDetailsObject];
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 --
];
END.