Multics Technical Bulletin MTB-553 Revision 1 DM: File Spec To: Distribution From: André Bensoussan & Jeffrey D. Ives & R. Michael Tague Date: 07/06/84 Subject: Data Management: File Manager Specifications ABSTRACT This document describes the functions provided by the data management file manager. For each of these functions, a description of what the function accomplishes, and what the caller of the function is supposed to know is given. The description of how the function accomplishes its task is in the file manager design document, MTB 554. Revision 1 of this document contains documentation on more than | 30 additional entry points. Many of these new entry points are | for setting and getting access control, ring, and directory name | information. | Comments should be sent to the author: via Forum: >udd>Multics>Spratt>mtgs>DMS_Development. via Multics Mail: Tague.Multics on either System M or MIT Multics. via telephone: HVN (617) 492-9358 _________________________________________________________________ Multics project internal working documentation. Not to be reproduced or distributed outside the Multics project without the consent of the author or the author's management. CONTENTS Page Abstract . . . . . . . . . . . . . . . i 1 Introduction . . . . . . . . . . . . 1 2 Characteristics of a data management file . . . . . . . . . . . . . . . . 1 2.1 Naming . . . . . . . . . . . . 1 2.2 Access control . . . . . . . . 1 2.3 Control intervals . . . . . . . 2 2.4 Capacity . . . . . . . . . . . 2 2.5 File accessing . . . . . . . . 3 2.6 Protected data management files 3 2.7 Unprotected files . . . . . . . 4 3 File manager primitives . . . . . . 4 file_manager_ . . . . . . . . . . . 5 $abandon . . . . . . . . . . . . 6 $add_acl_entries . . . . . . . . 7 $adopt . . . . . . . . . . . . . 9 $allocate . . . . . . . . . . . 10 $chname_file . . . . . . . . . . 11 $close . . . . . . . . . . . . . 12 $copy . . . . . . . . . . . . . 13 $create . . . . . . . . . . . . 15 $create_open . . . . . . . . . . 18 $delentry_file . . . . . . . . . 19 $delete_acl_entries . . . . . . 20 $delete_close . . . . . . . . . 22 $end_of_crash_recovery . . . . . 23 $find_old_uid_pn_table . . . . . 24 $flush_consecutive_ci . . . . . 25 $flush_modified_ci . . . . . . . 26 $free . . . . . . . . . . . . . 27 $get . . . . . . . . . . . . . . 28 ci_parts structure . . . . . . . 29 $get_ci_header . . . . . . . . . 31 ci_header structure . . . . . . 31 $get_ci_ptr . . . . . . . . . . 33 $get_exclusive . . . . . . . . . 35 $get_max_length . . . . . . . . 36 $get_ring_brackets . . . . . . . 37 $get_stream . . . . . . . . . . 38 $get_switch . . . . . . . . . . 39 $get_user_access_modes . . . . . 40 CONTENTS (cont) Page $list_acl . . . . . . . . . . . 42 $list_switches . . . . . . . . . 43 $lock_advice . . . . . . . . . . 45 $open . . . . . . . . . . . . . 47 $open_by_uid . . . . . . . . . . 49 $open_by_uid_after_crash . . . . 50 $per_system_init . . . . . . . . 51 $post_commit . . . . . . . . . . 52 $prepare_to_copy . . . . . . . . 53 $put . . . . . . . . . . . . . . 54 $put_journal . . . . . . . . . . 56 $put_stream . . . . . . . . . . 57 $raw_get . . . . . . . . . . . . 58 $raw_put . . . . . . . . . . . . 59 $replace_acl . . . . . . . . . . 60 $set_ring_brackets . . . . . . . 61 $set_switch . . . . . . . . . . 62 $simple_get . . . . . . . . . . 63 $simple_put . . . . . . . . . . 64 $status . . . . . . . . . . . . 65 $suffix_info . . . . . . . . . . 66 copy_flags . . . . . . . . . . . 67 $terminate_ci_ptr . . . . . . . 69 $undo . . . . . . . . . . . . . 70 $unput . . . . . . . . . . . . . 71 $user_shutdown . . . . . . . . . 72 $validate . . . . . . . . . . . 73 Multics Technical Bulletin MTB-553 Revision 1 DM: File Spec 1 INTRODUCTION An overview of the file access layer is in MTB 511, which describes data management files, their position in the data management architecture, and the services provided by the file manager. This document is more detailed and more specific than the overview. It contains the functional specifications of the file manager, given in terms of the entire set of entry points it provides to the rest of the system. For each entry point, a complete description of the calling sequence is given, with a full description of what the entry point does, and anything the caller is supposed to know to be able to make proper use of it. 2 CHARACTERISTICS OF A DATA MANAGEMENT FILE Like a segment, a data management file is an object that resides in the Multics hierarchy. It has a name, a directory entry and an access control list. Data can be stored into it and retrieved from it. Unlike a segment, it is generally accessed though software by file manager calls, although individual control intervals of a Data Management (DM) file can be read by direct memory reference. DM files are capable of being much larger than a segment. 2.1 Naming Like a segment, a data management file is found in the Multics hierarchy by its pathname. All pathname conventions that apply to segments also apply to data management files; except, if you change its name or the names of any of its parent directories, the mechanisms that protect it from process and system failure may not work for the rest of the bootload. A data management file is ring 2 multisegment file (MSF). A file with the pathname >A>B>C>F will be materialized by the directory >A>B>C>F in which MSF components will be created as needed. MTB-553 Revision 1 Multics Technical Bulletin DM: File Spec 2.2 Access control Like a segment, the list of users allowed to use a data management file is defined in an Access Control List (ACL). The access modes are read and write. During the period that data management files are implemented as MSFs, all MSF components will have identical ACLs. 2.3 Control intervals A data management file is made of logically contiguous fixed size blocks called control intervals. They are the unit of data transfer from disk to main memory and from main memory to disk. All control intervals in a file are the same size; but different files may have different control interval sizes. Control intervals within a file are designated by consecutive integers, starting from zero. Each control interval has a four word header and a two word trailer. These are used by the file manager to identify the control interval and to help implement the protection mechanism. They are not within the addressable portion of the control interval. The file manager has a special entry point for reading the header. The trailer is the same as the first two words of the header. While data management files are implemented as multisegment files, the only size available for control intervals will be 4096 bytes. After the 24 bytes taken up by the header and trailer, 4072 bytes are left for data storage. Control interval zero has 3176 bytes for data storage because file attributes are stored there. Data within a control interval is addressed by its byte offset and length. The offset of the first addressable byte is zero. It is the first byte after the header. The file manager does not permit applications to address data in the header, trailer, or the file attribute area in control interval zero. 2.4 Capacity Data management files have large capacities. During the MSF implementation, the limit will come from the maximum number of entries in an MSF directory, which is about 2000. This limits the size of a data management file to about 2*10**9 bytes. In the, so called, large file implementation, the limit will be about 10**12 bytes, using larger control intervals. The capacity Multics Technical Bulletin MTB-553 Revision 1 DM: File Spec can be even greater if the application can use control intervals larger than 10**4 bytes. 2.5 File accessing Before accessing a data management file within a process, you must open it and obtain an opening identifier. This protocol is comparable to introducing a segment to a process by obtaining a segment number with which it can be referenced. Segment numbers can be used for direct hardware access to a segment. An opening identifier can only be used for indirect software access through primitives provided by the file manager. Though a direct pointer to a specific control interval may be obtained via get_ci_ptr, it may only be used for reading a control interval. A data management file must be accessed through the get and put primitives in the file manager. The get entry point copies data from the data management file into the user's buffer. The put entry point copies data from the user's buffer into the file. The file manager does not associate any meaning to the data stored in the file. Its function is to provide access in the same way a disk controller provides access to a disk. The caller of the get and put primitives refers to the data by its file opening id, control interval number, byte offset, and length. 2.6 Protected data management files The meaning of protection is abstract. Protection does not imply any specific mechanism such as locking or journaling. It does imply that data in the files are protected against inconsistency caused by concurrent access and transaction failure. It enables applications to transform data from one consistent state to another by delimiting groups of operations into transactions that appear atomic to other processes. Protection against concurrent access can be turned off for applications that do not need it. Protection against inconsistency caused by transaction failure can also be disabled. o Transaction mode: A protected file can only be accessed by processes in transaction mode. Any attempt to read or modify a protected file by a process not in transaction mode causes an error to be returned. As a reminder to the reader, a process is said to be in transaction mode if it has executed a begin transaction operation but has not yet executed the commit or abort operation that would end the transaction (See MTB 555, Transaction Manager Spec). MTB-553 Revision 1 Multics Technical Bulletin DM: File Spec o Concurrency: The system makes transactions appear atomic with the concurrency control capability, which prevents simultaneous transactions in different processes from interfering with one another. The file manager's contribution in providing this service is to automatically lock control intervals of protected files on behalf of the transactions that reference them. It does this for all protected files, except for those with the "no_concurrency" option. o Rollback: The system provides protection against transaction failure with the rollback capability. Whenever a control interval is modified, the file manager logs a copy of the data, prior to modification. It does so automatically for all protected files except for those with the "no_rollback" option. These before images are logged in the before journal associated with the current transaction. If the application, the process, or the system fails, these before images are used to restore the content of the control intervals and thus undo the effects of the transaction on protected files. The fact that a data management file is protected is recorded as an attribute of the file. It is usually set when the file is created, but it can also be set by an administrative request. A protected file has two subattributes which indicate whether or not concurrency or rollback have been turned off. These subattributes are usually set when the data management file is created, but they can be changed by an administrative request. 2.7 Unprotected files A data management file which does not have the protected attribute is "unprotected". This means that it does not get the attention of the integrity services, and the system does not provide concurrency control or rollback capabilities when the file is used. An unprotected file may be used by a process whether or not the process is in transaction mode. 3 FILE MANAGER PRIMITIVES All file manager primitives are provided as entry points in the file_manager_ module. This module is described below, in the standard format used for MPM documentation. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Name: file_manager_ The file_manager_ module provides an entry point for each File Manager primitive. Most entry points are for manipulating DM files, while a few of the entries are for exclusive use by the Data Management system in the inner ring. _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$abandon | This entry point is called by the transaction manager when the | transaction manager has been called to abandon a transaction. | The effect of this call is to discard the list of pages that | would be flushed by the file manager to commit a transaction. It | is assumed that the abandoned transaction will be adopted by the | Data Management daemon and rolled back. | Usage | dcl file_manager_$abandon entry (bit(36) aligned, fixed bin, | fixed bin(35)); | call file_manager_$abandon (txn_id, txn_idx, code); | where: | txn_id (Input) | is the transaction identifier of the current | transaction. | txn_idx (Input) | is the corresponding index into the TDT for the | current transaction. | code (Output) | is the standard system status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$add_acl_entries | This entry point adds the specified access modes to the access | control list (ACL) of the specified Data Management (DM) file. | If the access name already appears on the ACL of the DM file, its | mode is changed to the one specified by the call. The legal | access modes for a DM file are: null, read, and read/write. | Usage | dcl file_manager_$add_acl_entries entry (char(*), char(*), | ptr, fixed bin, fixed bin(35)); | call file_manager_$add_acl_entries (dir_name, entryname, | acl_ptr, acl_count); | where: | dir_name (Input) | is the pathname of the containing directory. | entryname (Input) | is the entryname of the DM file. | acl_ptr (Input) | points to a user-supplied segment_acl structure | (described under "Notes" below). | acl_count (Input) | is the number of ACL entries in the segment_acl | structure. | code (Output) | is the standard system status code. | Notes | The following is the segment_acl structure (declared in | acl_structures.incl.pl1): | dcl 1 segment_acl (acl_count) aligned based (acl_ptr), | 2 access_name char(32) unaligned, | 2 mode bit(36) aligned, | 2 extended_mode bit(36) aligned, | 2 status_code fixed bin(35); | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | where: | access_name (Input) | is the access name (in the form Person_id.Project_id.tag) that | identifies the process to which the ACL entry applies. | mode (Input) | contains the modes for this access name. The first three bits | correspond to the modes read, execute, and write. The | remaining bits must be zero. The only allowed modes for DM | files are null, read, and read/write. Execute is not a valid | or meaningful mode for DM files. The include file | access_modes_values.incl.pl1 defines mnemonics for these | values: | dcl (N_ACCESS init ("000"b), | R_ACCESS init ("100"b), | RW_ACCESS init ("101"b), | bit(3) internal static | options (constant); | extended_mode (Input) | should contain the value "0"b. (This field is for use with | extended access and may only be used by the system). | status_code (Output) | is the storage system status code for this ACL entry only. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$adopt | This entry point is only called by Data Management daemon through | the dm_daemon_gate_. | This entry is called when the daemon is adopting an abandoned | transaction. The transaction may have been abandoned due to a | process or system failure or due to a call to abandon the | transaction by the transaction's owner. The effect of this call | is to discard the list of pages that would be flushed by the file | manager prior to a transaction commit. It is assumed that the | adopted transaction will be rolled back. | Usage | dcl file_manager_$adopt entry (bit(36) aligned, fixed bin, | fixed bin(35)); | call file_manager_$adopt (txn_id, txn_idx, code); | where: | txn_id (Input) | is the transaction identifier of the transaction to | be adopted. Before this entry point is called, the | per process control interval table pointer | fm_data_$proc_txn_tbl_ptr should be pointing to a | control interval table. This table is a list of | control intervals that have been modified by the | transaction, but not yet flushed. This entry clears | that table. | txn_idx (Input) | is the corresponding index into the TDT for the | transaction. | code (Output) | is the standard system status code. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$allocate Allocate allows applications to reserve disk space in large chunks for better performance. It avoids the frequent updates to the file map that occur by default if the control intervals are allocated as needed by the put primitive. Allocate allocates disk space for a set of consecutive control intervals of one file. The set is specified by the number of the first control interval, and the number of consecutive control intervals. It attempts to allocate contiguous disk addresses to consecutive control intervals, as much as possible. Allocate has a high fixed overhead, so it should not be called for one control interval at a time. Usage dcl file_manager_$allocate entry (bit (36) aligned, fixed bin (27), fixed bin (27), fixed bin (35)); call file_manager_$allocate (oid, first_ci, n_ci, code); where: oid (Input) is a file opening identifier. first_ci (Input) is the number of the first control interval. n_ci (Input) is the number of consecutive control intervals to allocate. code (Output) is a standard status code. If it is dm_error_$ci_already_allocated, the operation can still be considered a success. Notes Allocate is currently not efficiently implemented, because the only way to reserve a disk address for a page is to put something in it. The semantics of allocate are designed to allow for efficient implementation in a future. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$chname_file | This entry point changes the entry name on a specified Data | Management (DM) file. If a nonnull entry name is given for the | oldname argument, the specified name is deleted from the DM file, | if a nonnull entry name is given for the newname argument, the | name is added to the DM file. Thus, if only an old name is | specified, the effect is to delete a name; if only a new name is | specified, the effect is to add a name; and if both a new and an | old name is specified, the effect is to rename the DM file. | Usage | dcl file_manager_$chname_file entry (char(*), char(*), | char(*), char(*), fixed bin(35)); | call file_manager_$chname_file (dir_name, entryname, | oldname, newname, code); | where: | dir_name (Input) | is the pathname of the containing directory. | entryname (Input) | is the entryname of the DM file. | oldname (Input) | is the name to be deleted from the DM file. This | argument can be null if newname is not null. | newname (Input) | is the name to be added to the entry. This name | must not exist as the name of any other entry in the | containing directory. If this argument is null, | oldname must not be null and oldname cannot be the | only name on the DM file. | code (Output) | is the standard system status code. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$close This entry "closes" a file in the current process. The file to be closed is designated by its opening identifier. Usage dcl file_manager_$close entry (bit (36) aligned, fixed bin (35)); call file_manager_$close (oid, code); where: oid (Input/Output) is the file opening identifier of the file to be closed. It is set to zero by this entry point in order to indicate that it is no longer valid. code (Output) is a standard status code. Notes If the file has been opened more than once, closing it only decrements the opening count. The description of the open primitive says more about this. There is no requirement for the caller to be in transaction mode when closing a file, protected or not. Aborting a transaction will not reopen it, even if it was closed by delete_close and the deletion was rolled back. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$copy | This entry point is called to copy a Data Management (DM) file. | Usage | dcl file_manager_$copy entry (ptr, fixed bin(35)); | call file_manager_$copy (copy_options_ptr, code); | where: | copy_options_ptr (Input) | is a pointer to the copy_options structure defined | in the include file copy_options.incl.pl1 (described | under notes below). | code (Output) | is the standard system status code. | Notes | The following is the form of the include file | copy_options.incl.pl1: | dcl 1 copy_options aligned based (copy_options|_ptr), 2 version char(8), | 2 caller_name char(32) unaligned, | 2 source_dir char(168) unaligned, | 2 source_name char(32) unaligned, | 2 target_dir char(168) unaligned, | 2 target_name char(32) unaligned, | 2 flags, | 3 no_name_dup bit(1) unaligned, | 3 raw bit(1) unaligned, | 3 force bit(1) unaligned, | 3 delete bit(1) unaligned, | 3 target_err_switch bit(1) unaligned, | 3 mbz bit(31) unaligned, | 2 copy_items like copy_flags; | where: | version (Input) | is the current version of this structure. Currently | COPY_OPTIONS_VERSION_1. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | caller_name (Input) | is the name of the calling routine. This is required for the | used of the duplicate name handler, nd_handler_. | source_dir (Input) | is the pathname of the directory containing the source DM | file. | source_name (Input) | is the entryname of the source DM file. | target_dir (Input) | is the pathname of the directory of the target DM file. | target_name (Input) | is the entryname of target DM file. | flags.no_name_dup (Input) | If this flag is set, do not allow name duplication and do not | call the name duplication handler if a name duplication | occurs. | flags.raw (Input) | If this flag is set, use the standard hcs_ entries for copying | the object. Do not use any special knowledge of the object | type. | flags.force (Input) | if this flag is set, delete or force access to the target. | flags.delete (Input) | delete the original after copying. | target_err_switch (Output) | If this switch is set, then the error that occurred was with | the target and not the source object. | copy_items (Input) | is a structure describing which attributes of the source | should be copied to the target. (see the copy_flags.incl.pl1 | structure described at the suffix_info entry) _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$create This entry creates a data management file. The caller specifies its pathname and attributes, and must specify whether the file is protected. See "Notes" below. Usage dcl file_manager_$create entry (char (*), char (*), ptr, fixed bin (35)); call file_manager_$create (dir_path, entry_name, file_create_info_ptr, code); where: dir_path (Input) is the absolute pathname of a directory. The file will be added to this directory. entry_name (Input) will be the name of the file. file_create_info_ptr (Input) points to the file_create_info structure. (See notes below) If this pointer is null, an unprotected file is created with the default attribute values. code (Output) is a standard status code. Notes The caller must have enough access to add an entry to the directory. The file is created with read and write access for the caller and Data_Management.Daemon. In the current implementation, file attributes specified in the file_create_info structure such as ring brackets and blocking factor cannot be changed. 4 THE FILE_CREATE_INFO STRUCTURE Following is the structure used to describe the attributes to assign to a file being created. It is declared in dm_file_create_info.incl.pl1. _____________ _____________ file_manager_ file_manager_ _____________ _____________ dcl 1 file_create_info aligned based (file_create_info_ptr), 2 version char (8) aligned, 2 ci_size_in_bytes fixed bin (35), 2 blocking_factor fixed bin, 2 flags unal, 3 protected bit (1) unal, 3 no_concurrency bit (1) unal, 3 no_rollback bit (1) unal, 3 mbz_1 bit (15) unal, 2 ring_brackets (2) fixed bin (3) unal, 2 mbz_3 bit (10) unal, 2 mbz_2 (30) fixed bin (71); where: version must be set by the caller to FILE_CREATE_INFO_VERSION_2. This permits upward compatible changes to this structure. ci_size_in_bytes is the control interval size. Currently the only size available is 4096. If this item is zero, a default value is used. Currently the default value is 4096. blocking_factor tells the file manager how to allocate disk storage. In the current implementation this will be interpreted as the number of control intervals to put in each segment, and only 64 and 255 will be allowed. If this item is zero, a default value is used. The current default value is 255. flags.protected determines whether the file is protected from transaction failure and from concurrent access by other processes. If the protected bit is on, get, put, and allocate operations are permitted only in transaction mode. Create and delete operations are protected regardless of whether the process is in a transaction. If this bit is off, the file is unprotected, which means that the file and its contents may be damaged by concurrent access or transaction failure. An unprotected file may be accessed within or without a transaction. Accessing a protected file is substantially more expensive than accessing an unprotected file. The default is to provide protection. flags.no_concurrency turns off protection against concurrent access by other processes. Concurrency protection is implemented by locking each control interval that is accessed. The get operation _____________ _____________ file_manager_ file_manager_ _____________ _____________ locks in share mode. All other operations lock in exclusive mode. Create and delete lock the entire file in exclusive mode. Locking is expensive. This bit turns it off if it is not needed. If protection is off, this bit is ignored. The default is to provide concurrent access protection. flags.no_rollback turns off protection against transaction failure. Protection against transaction failure is implemented by journaling a before image of each modification. When a transaction fails, its modifications are undone by restoring these before images. Journaling is expensive. This bit turns it off if it is not needed. If protection is off, this bit is ignored. The default is to provide protection from transaction failure. ring_brackets are the extended ring brackets of the file. They specify the range of rings from which the file may be accessed. The first is the write bracket. It's value cannot be less than the Data Management ring (loosely, the ring of execution of the file_manager_) or the validation level of the creating process. The second is the read bracket. It's value cannot be less than the write bracket. The default for both ring brackets is the validation level of the calling process. mbz_1, mbz_2, mbz_3 must be initialized to zero by the caller. This is so that upward compatible changes will be able to assume that existing programs put zeros in these areas. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$create_open Calling this entry point is like calling create and open, but it is more efficient. If the file already exists, it will be opened and code_o will be dm_error_$file_already_exists. If the file already exists and is already open, the opening identifier will be returned and code_o will be dm_error_$file_already_open. Usage dcl file_manager_$create_open entry (char (*), char (*), ptr, bit (36) aligned, fixed bin (35)); call file_manager_$create_open (dir_path, entry_name, file_create_info_ptr, oid, code); where: dir_path (Input) is the absolute pathname of a directory. The file will be added to this directory. entry_name (Input) will be the name of the file. file_create_info_ptr (Input) is described under the create entry point. oid (Output) is the opening identifier assigned to the file. If it is not zero, the oid is valid and can be used, regardless of the value of code_o. If the transaction aborts and the file is deleted, it still needs to be closed, since openings are not undone by rollback. code (Output) is a standard status code. If it is dm_error_$file_already_exists or dm_error_$file_already_open, the operation is considered successful and oid_o is usable. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$delentry_file | This entry deletes a file specified by its pathname. The user | must have the proper access to delete an entry in the containing | directory and have write access to the file itself. | The deletion of the file is protected. If the deletion is | requested outside of a transaction, a transaction is begun, and | committed after the deletion. | Usage | dcl file_manager_$delentry_file entry (char(*), char(*), | fixed bin(35)); | call file_manager_$delentry_file (dir_name, entryname, | code); | where: | dir_name (Input) | is the name of the directory containing the Data | Management (DM) file to be deleted. | entryname (Input) | is the entryname of the DM file. | code (Output) | is the standard system status code. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$delete_acl_entries | This entry point deletes specified entries from an access control | list (ACL) for a data management (DM) file. | Usage | dcl file_manager_$delete_acl_entries entry (char(*), | char(*), ptr, fixed bin, fixed bin(35)); | call file_manager_$delete_acl_entries (dir_name, entryname, | acl_ptr, acl_count, code); | where: | dir_name (Input) | is the pathname of the directory containing the Data | Management (DM) file. | entryname (Input) | is the entryname of the DM file. | acl_ptr (Input) | points to a user-supplied delete_acl structure (see | "notes" below). | acl_count (Input) | is the number of ACL entries in the delete_acl | structure (see "notes" below). | code (Output) | is the standard system status code. | Notes | The delete_acl structure should be declared in the following way: | dcl 1 delete_acl (acl_count) aligned based (acl_ptr), | 2 access_name char(32) unaligned, | 2 status_code fixed bin(35); | where: | access_name (Input) | is the access name (in the form of Person_id.Project_id.tag) | that identifies the ACL entry to be deleted. _____________ _____________ file_manager_ file_manager_ _____________ _____________ status_code (Output) | is the storage system status code for this entry only. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$delete_close Calling this entry point is like calling delete and then close, but it is more efficient. It is for deleting a file that is already open. Usage dcl file_manager_$delete_close entry (bit (36) aligned, fixed bin (35)); call file_manager_$delete_close (oid, code); where: oid (Input/Output) is the file opening identifier of the file to be deleted and closed. It is set to zero by this entry point in order to indicate that it is no longer valid. The file remains closed even if the transaction aborts and the deletion does not remain in effect. code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$end_of_crash_recovery This entry is called by dm_recovery as an inner ring entry point. This entry must be called after calls to file_manager_$open_by_uid_after_crash have ceased. It terminates the old uid/pathname table. Usage dcl file_manager_$end_of_crash_recovery entry (fixed bin (35)); call file_manager_$end_of_crash_recovery (code); where: code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$find_old_uid_pn_table This entry is a priviledged inner ring entry point. The entry must be called to prepare the file manager for calls to file_manager_$open_by_uid_after_crash. It initiates the old uid/pathname table that it finds in the old bootload directory, the pathname of which is provided by the caller. Usage dcl file_manager_$find_old_uid_pn_table entry (char (*), fixed bin (35)); call file_manager_$find_old_uid_pn_table (old_boot_dir_path, code); where: old_boot_dir_path (Input) is the absolute pathname of the old bootload directory. code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$flush_consecutive_ci This entry point provides a service needed by the before journal manager, in response to a request it gets at commit time from the transaction manager, to flush the before images produced by the committing transaction. It is not intended to be used on protected files, because it makes no provision for pages that may be held in memory awaiting before journal writes. It flushes a set of consecutive control intervals. The caller specifies the number of the first control interval to be flushed, and the number of control intervals to be flushed, starting at the first one. It does not return until all control intervals have been written to disk. Usage dcl file_manager_$flush_consecutive_ci entry (bit (36) aligned, fixed bin (27), fixed bin (27), fixed bin (35)); call file_manager_$flush_consecutive_ci (oid, first_ci, n_ci, code); where: oid (Input) is a file opening identifier. first_ci (Input) is the control interval number of the first control interval to be flushed. n_ci (Input) is the number of control intervals to be flushed. code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$flush_modified_ci This entry provides a service needed by the transaction manager only. It writes to disk all modified control intervals of protected files for the specified transaction that have not been written to disk yet. It does not return to its caller until all modified control intervals have been flushed to disk. The put, allocate, and free primitives maintain, for each transaction, a list of all control intervals that have been modified by the transaction and that are part of a protected file. It is legitimate for a transaction to modify both protected and unprotected files, but only control intervals of protected files are entered in the list and flushed by this primitive. Usage dcl file_manager_$flush_modified_ci entry (bit (36) aligned, fixed bin, fixed bin (35)); call file_manager_$flush_modified_ci (txn_id, txn_idx, code); where: txn_id (Input) is a transaction identifier. txn_idx (Input) is the corresponding transaction index. code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$free This entry frees disk space allocated to control intervals. The set of consecutive control intervals is specified by the number of the first control interval and the number of consecutive control intervals starting at the first one. After the disk space for a control interval has been freed, its content is effectively zero. This operation is has a high fixed overhead, so it should not be called for one control interval at a time. If any or all of the control intervals are already free, code_o is set to dm_error_$ci_already_free. The operation is, nevertheless, successful. Usage dcl file_manager_$free entry (bit (36) aligned, fixed bin (27), fixed bin (27), fixed bin (35)); call file_manager_$free (oid, first_ci, n_ci, code); where: oid (Input) is a file opening identifier. first_ci (Input) is the control interval number of the first control interval of the set whose physical space is to be freed. n_ci (Input) is the number of consecutive control intervals whose physical space is to be freed. code (Output) is a standard status code. If it is dm_error_$ci_already_free, the operation can still be considered a success. Notes The user must have write access to the file. If the file is protected, the caller must be in transaction mode and the free operation is done under the auspices of the integrity services. If the transaction aborts, the control intervals are reallocated and their contents restored. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$get This entry reads data from a control interval. The caller may specify one or several parts. Each part is described by its byte offset relative to the beginning of the addressable portion of the control interval and its length in bytes. Each part has a pointer to a buffer provided by the caller. If the control interval does not exist, the buffers provided by the caller are filled with zeros and code_o is set to zero. Usage dcl file_manager_$get entry (bit (36) aligned, fixed bin (27), ptr, fixed bin (35)); call file_manager_$get (oid, ci_num, ci_parts_ptr, code); where: oid (Input) is a file opening identifier. ci_num (Input) is a control interval number. ci_parts_ptr (Input) points to the structure described under "ci_parts structure" below. code (Output) is a standard status code. Notes If the file is protected, the process must be in a transaction, and unless no_concurrency is specified, get locks the control interval in share mode. It is kept locked until the end of the transaction. This assures that no other transaction will put anything into the control interval, free it, or delete the file during the current transaction. If the control interval is locked in exclusive mode by another transaction, get will wait until it finishes. If waiting is pointless because the current transaction is deadlocked with another transaction, the transaction_deadlock condition is signaled (see txn_deadlock_info.incl.pl1). The calling process must have read access in order to do a get. _____________ _____________ file_manager_ file_manager_ _____________ _____________ ci_parts structure The structure is in dm_ci_parts.incl.pl1. The constants are in dm_ci_lengths.incl.pl1. dcl 1 ci_parts aligned based (ci_parts_ptr), 2 number_of_parts fixed bin, 2 part (cip_number_of_parts refer (ci_parts.number_of_parts)), 3 offset_in_bytes fixed bin, 3 length_in_bytes fixed bin, 3 local_ptr ptr; dcl ci_parts_ptr ptr; dcl cip_number_of_parts fixed bin; dcl CI_ADDRESSABLE_LENGTH fixed bin init (4072) static options (constant); dcl CI_0_ADDRESSABLE_LENGTH fixed bin init (3176) static options (constant); where: number_of_parts is the number of parts. Zero is legal and there is currently no limit on the number of parts. offset_in_bytes is the offset of the part within the addressable portion of the control interval. It is the zero relative index of the first byte of the part. It is the number of bytes that are to be skipped, starting at the beginning of the addressable portion. The addressable portion of a control interval begins with the first byte after the four word header and ends with the last byte before the two word trailer. The only exception is control interval zero. It has a smaller addressable portion, because the file attributes are stored in it. The length of the addressable portion is 4072 bytes. Control interval zero has 3176 bytes. length_in_bytes is the number of bytes in the part. If it is zero, the part is ignored. local_ptr _____________ _____________ file_manager_ file_manager_ _____________ _____________ is a pointer to the buffer provided by the caller for the part. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$get_ci_header This entry reads the 4 word control interval header. Its structure is given below. It tells the unique identifier of a data management file, whether a control interval is allocated, and the time it was last modified. Protection and access are the same as the get entry. If the control interval does not exist, this entry returns the header that it would have had, with zero in the time_modified field and code_o set to zero. It does not create the control interval. Usage dcl file_manager_$get_ci_header entry (bit (36) aligned, fixed bin (27), 1 like ci_header aligned, fixed bin (35)); call file_manager_$get_ci_header (oid, ci_num, ci_header, code); where: oid (Input) is a file opening identifier. ci_num (Input) is a control interval number. ci_header (Input/Output) is the structure described under "ci_header structure" below. code (Output) is a standard status code. ci_header structure The ci_header structure is in dm_ci_header.incl.pl1. dcl 1 ci_header_o like ci_header aligned; dcl ci_header_ptr ptr; dcl 1 ci_header aligned based (ci_header_ptr), 2 stamp, 3 version bit (9) unal, _____________ _____________ file_manager_ file_manager_ _____________ _____________ 3 bj_idx fixed bin (9) uns unal, 3 time_modified fixed bin (53) unal, 2 id, 3 uid bit (36) unal, 3 size_code 4 exponent fixed bin (6) uns, 4 addon fixed bin (3) uns, 3 num fixed bin (27) uns unal; dcl CI_HEADER_STAMP_VERSION_1 bit (9) aligned static options (constant) init ("641"b3); where: version must be set to CI_HEADER_STAMP_VERSION_1 by the caller. bj_idx is used to synchronize control interval writes with before journal writes. time_modified is the Multics clock time when this control interval was last modified. If the control interval does not exist, this item is zero. uid is the unique identifier of the data management file. It is not the Multics file system uid. size_code gives the physical size of the control interval which includes the header and trailer. The size in bytes = (64 + 8 * addon) * 2**exponent. num is the control interval number. The number of the first control interval is zero. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$get_ci_ptr This entry returns a pointer to the addressable portion of a control interval. Pointers to control intervals should be used only in well defined and contained situations to enhance the performance of accessing data in a control interval for retrieval purposes. This entry is helpful when it is known beforehand that several pieces of data are to be read from the same control interval, but they cannot be read by specifying several parts to the get entry (e.g., the offset of one is dependent on the value of another). Unlike other entries which get data, it is not valid to get a control interval pointer to a control interval that is not allocated. Usage dcl file_manager_$get_ci_ptr entry (bit (36) aligned, fixed bin (27), ptr, fixed bin (35)); call file_manager_$get_ci_ptr (oid, ci_num, ci_ptr, code); where: oid (Input) is a file opening identifier. ci_num (Input) is a control interval number. ci_ptr (Input) points to the addressable portion of the control interval. The addressable portion begins immediately after the control interval header. A null value is returned for this pointer if there is a error and the returned code is not zero. code (Output) is a standard status code. One possible value is: dm_error_$ci_not_allocated - The specified control interval has not been allocated. ci_ptr_o is set to null. Notes In order to make it possible to look at control intervals via a pointer, the create primitive sets the ring brackets on file components to <DM-ring>,<validation-level>,<validation-level>. _____________ _____________ file_manager_ file_manager_ _____________ _____________ If the file is protected, the process must be in a transaction, and unless no_concurrency is specified, get_ci_ptr locks the control interval in share mode. It is kept locked until the end of the transaction. This assures that no other transaction will put anything into the control interval, free it, or delete the file during the current transaction. If the control interval is locked in exclusive mode by another transaction, get_ci_ptr will wait until it finishes. If waiting is pointless because the current transaction is deadlocked with another transaction, an appropriate status code is returned. If the control interval does not exist, an error code of value dm_error_$ci_not_allocated. The calling process must have read access in order to do a get_ci_ptr. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$get_exclusive This entry is just like the get entry point except that it locks the control interval exclusively. It prevents other transactions from even obtaining the share lock necessary to do a get. It is for application that usually do a put into the same control interval. Since it reduces concurrency, it should not be used unless it can be established that it gains more than it loses. Usage dcl file_manager_$get_exclusive entry (bit (36) aligned, fixed bin (27), ptr, fixed bin (35)); call file_manager_$get_exclusive (oid, ci_num, ci_parts_ptr, code); where: oid (Input) is a file opening identifier. ci_num (Input) is a control interval number. ci_parts_ptr_ (Input) points to a ci_parts structure which is described under the get entry. code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$get_max_length | This entry point, given a directory name and a entry name, | returns the maximum length in words of a Data Management (DM) | file. This entry point is currently not implemented in the Data | Management system. | Usage | dcl file_manager_$get_max_length entry (char(*), char(*), | fixed bin(19), fixed bin(35)); | call file_manager_$get_max_length (dir_name, entryname, | max_length, code); | where: | dir_name (Input) | is the pathname of the containing directory. | entryname (Input) | is the entry name of the DM file. | max_length (Output) | is the maximum length in words of the DM file. | Notes | The user must have status permission on the directory containing | the segment or nonnull access to the segment. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$get_ring_brackets | This entry point returns the extended ring brackets of a Data | Management (DM) file. | Usage | dcl file_manager_$get_ring_brackets entry (char (*), char | (*), (2) fixed bin (3), fixed bin (35)); | call file_manager_$get_ring_brackets (dir_name, entry_name, | ring_brackets, code); | where: | dir_name (Input) | is the pathname of the containing directory. | entryname (Input) | is the entry name of the DM file. | ring_brackets (Output) | are the ring brackets of the DM file. This is a two | element array, allocated by the caller, with the | first bracket being the file's write bracket and the | second being the file's read bracket. | code (Output) | is the standard status code. | Notes | The user must have status permission on the containing directory | or nonnull access to the file. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$get_stream | This entry point will return a specified number of bytes from a | Data Management (DM) file given an opening id, a file offset, and | a buffer in which to place the bytes. This entry treats the DM | file as a stream of bytes made up of the concatenation of the | addressable portion of all control intervals in the DM file. | Usage | dcl file_manager_$get_stream entry (bit(36) aligned, fixed | bin(48), ptr, fixed bin(21)); | call file_manager_$get_stream (oid, file_offset_in_bytes, | buf_ptr, buf_length_in_bytes); | where: | oid (Input) | is the opening id of the DM file to be read from. | file_offset_in_bytes (Input) | is the offset given in bytes from the beginning of | the logical address space of the DM file given in | bytes with an offset of zero representing the | beginning of the file. | buf_ptr (Input) | is a pointer to a buffer where the bytes read from | the DM file may be placed. | buf_length_in_bytes (Input) | is the number of bytes that are to be read from the | DM file. Notes If the DM file is protected, the process must be in a transaction, and unless concurrency is specified, get_stream locks in share mode the control intervals in which the specified stream of bytes resides. The calling process must have read access to the DM file in order to do a get_stream. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$get_switch | This entry point, given a directory name, an entry name, and a | switch name, returns the value, "0"b or "1"b, of that switch. | Currently the only valid switch name is "safety". | Usage | dcl file_manager_$get_switch entry (char(*), char(*), | char(*), bit(1), fixed bin(35)); | call file_manager_$get_switch (dir_name, entryname, | switch_name, switch_value, code); | where: | dir_name (Input) | is the pathname of the containing directory. | entryname (Input) | is the entry name of the DM file. | switch_name (Input) | is the name of the switch. | switch_value (Output) | is the value of the specified switch. | code (Output) | is the standard system status code. | Notes | The calling process must have read access to the DM file. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$get_user_access_modes | This entry point returns the effective access mode and extended | access mode of a user to a Data Management (DM) file given a | directory name, an entry name, a user_id, and the validation | level (ring number) of the user. (For a description of effective | access see "Effective Access" in the Reference Manual.) | Usage | dcl file_manager_$get_user_access_modes entry (char(*), | char(*), char(*), fixed bin, bit(36) aligned, bit(36) | aligned, fixed bin(35)); | call file_manager_$get_user_access_modes (dir_name, | entryname, user_id, ring, modes, ex_modes, code); | where: | dir_name (Input) | is the pathname of the containing directory. | entryname (Input) | is the entry name of the DM file. | user_id (Input) | is the access name of the user (in the form | Person_id.Project_id_.tag). The user id is limited | to 32 characters. If null, the access name of the | calling process is used. | ring (Input) | is the validation level that is to be used in | computing effective access. It must be a value | between 0 and 7 inclusive, or -1. If the ring value | is -1, a default value of the validation level of | the calling process is used. This default should be | used in all cases except those in which a different | ring's access is explicitly required. | mode (Output) | is the effective access mode of the user to the DM | file (see "Notes" below). | ex_mode (Output) | is the extended access mode of the user to the DM | file. _____________ _____________ file_manager_ file_manager_ _____________ _____________ code (Output) | is the standard system status code. | Notes | The user must have status permission on the containing directory, | unless the access name supplied is that of the calling process or | null. | The include file access_modes_values.incl.pl1 defines mnemonics | for the different values of mode (see "Notes" at | add_acl_entries). | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$list_acl | This entry point returns either the entire access control list | (ACL) of a Data Management (DM) file or it returns the access | modes of specified ACL entries. | Usage | dcl file_manager_$list_acl entry (char(*), char(*), ptr, | ptr, ptr, fixed bin, fixed bin(35)); | call file_manager_$list_acl (dir_name, entryname, area_ptr, | area_ret_ptr, acl_ptr, acl_count, code); | where: | dir_name (Input) | is the pathname of the containing directory. | entryname (Input) | is the entryname of the segment. | area_ptr (Input) | is a pointer to an area where the list of ACL | entries is to be allocated. If this pointer is | null, then the modes of the ACL entries specified in | the structure pointed to by acl_ptr will be filled | in instead. | area_ret_ptr (Output) | points to the start of the allocated list of ACL | entries. | acl_ptr (Input) | If area pointer is null, then acl_ptr should point | to an ACL structure, segment_acl, (described at the | add_acl_entries entry point above) into which mode | information is placed for the access names specified | in that same structure. | acl_count (Input/Output) | is the number of entries supplied in the ACL | structure identified by acl_ptr when area_ptr is | null, or if area_ptr is not null, then acl_count is | the number of entries returned in the ACL structure | allocated in the area that area_ptr points to. | code (Output) | is the standard system status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$list_switches | This entry point returns the names of nonstandard switches on | Data Management (DM) files. | Usage | dcl file_manager_$list_switches entry (ptr, ptr); | call file_manager_$list_switches (area_ptr, | switch_list_ptr); | where: | area_ptr (Input) | is a pointer to an area that the entry point may | allocate the switch list in. | switch_list_ptr (Output) | is a pointer to the beginning of the switch list | allocated in the user area provided. The | switch_list structure is defined in the include file | suffix_info.incl.pl1 (see "notes" below for a | description of the switch_list structure). | Notes | The switch_list structure has the following form: | dcl 1 switch_list aligned based (switch_list_ptr), | 2 version char(8), | 2 switch_count fixed bin, | 2 switch_name_count fixed bin, | 2 switches (alloc_switch_count refer | (switch_list.switch_count)), | 3 name_index fixed bin, | 3 name_count fixed bin, | 3 default_value bit (1) aligned, | 3 mbz1 bit (36) aligned, | 2 names (alloc_switch_name_count refer | (switch_list.switch_name_count)) | char (32); | where: | version | is the version string of his structure. Currently | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | SWITCH_LIST_VERSION_1. | switch_count | is the number of switches in this structure. | switch_name_count | is the number of switch names in this structure. There can be | more than one name for each switch. | switches.name_index | is the index into the names array of the first name for this | switch. | switches.name_count | is the count of the number of names in the name array for this | switch. | switches.default_value | is the default switch setting for this switch. | names | is an array of names of switches that are referenced in the | switches array. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$lock_advice This entry permits applications to give the file manager advice about locking granularity. For example, if the application knows that it is going to modify every control interval in a file, it can tell the file manager to lock the entire file and save the overhead of locking individual control intervals. Usage dcl file_manager_$lock_advice entry (bit (36) aligned, fixed bin, fixed bin (35)); call file_manager_$lock_advice (oid, lock_mode, code); where: oid (Input) is a file opening identifier. lock_mode (Input) is the finest and weakest lock mode to use on this file for the remainder of the opening. It must be one of the five following modes: 4 (LOCK_MODE_IS), 5 (LOCK_MODE_IX), 6 (LOCK_MODE_SIX), 2 (LOCK_MODE_S), or 3 (LOCK_MODE_X) which are declared in dm_lock_modes.incl.pl1. code (Output) is a standard status code. Notes Lock advice never abridges protection against concurrent file access by other processes. If no lock advice is given, file manager uses the weakest lock necessary to provide concurrency protection, and the finest granularity available, which is the control interval. Lock advice always causes file manager to use a stronger lock or coarser granularity than absolutely necessary. This reduces concurrency in order to reduce locking overhead. Lock advice applies to protected files unless the no_concurrency attribute is present. It can be given to any open file, regardless of whether a transaction is in progress. It is an attribute of the opening and not of the file. It is used the first time the file is referenced in each transaction. It tells the file manager what kind of a global file lock to acquire. If the Lock advice is given after the first time the file is _____________ _____________ file_manager_ file_manager_ _____________ _____________ referenced, it probably won't be used until the next transaction. The lock advice is retained until it is changed, or the file is closed. The advice concerns the type of lock to use at the file level. The only way to control the type of lock used on a control interval is to call get_exclusive instead of get. If no advice is given, IS (intention shared) is presumed. IS is strong enough for get and get_ci_header which lock control intervals in S (shared) mode. Put, allocate, and free require that the file lock be upgraded to the stronger IX (intention exclusive) mode, because they lock control intervals in X (exclusive) mode. Create and delete lock the file in X mode, regardless. If advice is given, then all operations lock the file in the advised mode unless it is too weak for the operation. The SIX (shared and intention exclusive) mode means only lock the control intervals that are modified. SIX saves the overhead of locking individual control intervals for get operations because it prevents other transactions from getting anything but an IS lock on the file. A full explanation of locking is in MTB-514, "Data Management: Concurrency Management - Overview". _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$open This entry makes a data management file accessible within a process. The file is specified by its pathname. The file manager assigns an opening identifier to the file in the current process. It is used to designate the file in subsequent calls to the file manager. Usage dcl file_manager_$open entry (char (*), char (*), bit (36) aligned, fixed bin (35)); call file_manager_$open (dir_path, entry_name, oid, code); where: dir_path (Input) is the absolute pathname of the directory which contains the file. entry_name (Input) is the entry name of the file. oid (Output) is the file opening identifier assigned to the file and returned to the caller. If it is not zero, it is usable, regardless of code_o. code (Output) is a standard status code. If it is dm_error_$file_already_open, the operation is considered successful and oid_o is usable. Notes If the file was already opened in the current process, the open primitive does not assign a new opening identifier, instead it returns the opening identifier that was already assigned and sets code_o to dm_error_$file_already_open. The file manager keeps track of the number of opens and closes. The opening identifier remains valid as long as there have been more opens than closes. If all subsystems within a process close a file the same number of times they opens it, they will not invalidate each others openings. There is no requirement for the process to be in a transaction when opening a file, protected or not. Aborting a transaction _____________ _____________ file_manager_ file_manager_ _____________ _____________ has no effect on file openings, even if create_open was called and the create is rolled back. Attempts to use such an opening will result in dm_error_$file_doesnt_exist. The same thing happens if a file is opened and then deleted. Close is the only legal operation on a file which has been deleted. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$open_by_uid This entry point serves the before journal manager, which keeps the file unique identifier in each before image. When a transaction is rolled back by another process, before journal manager converts the unique identifier into an opening identifier by calling this entry point. File manager maintains a conversion table in which it keeps the unique identifiers and pathnames of all protected files that are open in any process. This entry point uses that table to get the pathname of the file and open it. The opening is ordinary in every other way. Usage dcl file_manager_$open_by_uid entry (bit (36) aligned, bit (36) aligned, fixed bin (35)); call file_manager_$open_by_uid (uid, oid, code); where: uid (Input) is the unique identifier of the file to be opened. oid (Output) is the file opening identifier assigned to the file and returned to the caller. If it is not zero, it is usable, regardless of code_o. code (Output) is a standard status code. If it is dm_error_$file_already_open, the operation is considered successful and oid_o is usable. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$open_by_uid_after_crash This entry is a priviledged inner ring entry point. The entry works like open_by_uid, except it uses the uid/pathname table from the previous bootload and does not lock it. The opening produced is standard in every way. Before this entry can be called, file_manager_$find_old_uid_pn_table must be called so that file manager can initiate the old uid/pathname table. After crash recovery is finished, file_manager_$end_of_crash_recovery should be called so that file manager can terminate the old uid/pathname table prior to its impending deletion with the old bootload directory. Usage dcl file_manager_$open_by_uid_after_crash entry (bit (36) aligned, bit (36) aligned, fixed bin (35)); call file_manager_$open_by_uid_after_crash (uid, oid, code); where: uid (Input) is the unique identifier of the file to be opened. oid (Output) is the file opening identifier assigned to the file and returned to the caller. If it is not zero, it is usable, regardless of code_o. code (Output) is a standard status code. If it is dm_error_$file_already_open, the operation is considered successful and oid_o is usable. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$per_system_init This entry is called during per system initialization. It creates and initializes file manager's per system tables. Usage dcl file_manager_$per_system_init entry (fixed bin (35)); call file_manager_$per_system_init (code); where: code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$post_commit This entry is called by the transaction manager after a transaction has committed. The File Manager keeps a list of post commit actions associated with each transaction. Post commit actions close protected files whose closing was postponed until the end of the transaction, delete protected files whose deletion was postponed, and remove shriek names that were used to create protected files during the transaction. Usage dcl file_manager_$post_commit entry (bit (36) aligned, fixed bin, fixed bin (35)); call file_manager_$post_commit (txn_id, txn_idx, code); where: txn_id (Input) is a transaction identifier. txn_idx (Input) is the corresponding transaction index. code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$prepare_to_copy | This entry point is called prior to copying a Data Management | (DM) file. It locks the file, gets its attributes, and | determines is length. | Usage | dcl file_manager_$prepare_to_copy entry (bit(36) aligned, | ptr, fixed bin(27), fixed bin(35)); | call file_manager_$prepare_to_copy (oid, | file_create_info_ptr, last_ci_num, code); | where: | oid (Input) | is the opening id of the DM file. | file_create_info_ptr (Input) | is a pointer to a file_create_info structure that | the file attributes are to be placed in. This | structure may in turn be used to create a new DM | file to copy the old DM file into. The | file_create_info structure is defined in the | dm_fm_create_info.incl.pl1 include file. (see | "notes" under "create" for a description of this | include file). | last_ci_num (Output) | is the number of the last control interval in the DM | file. | code (Output) | is the standard system status code. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$put This entry writes data into a control interval. The caller may specify one or several parts of the control interval to be written. The parts are described under the get entry point. If the control interval does not exist, it is automatically allocated and the content of its addressable portion is initialized to zero. Usage dcl file_manager_$put entry (bit (36) aligned, fixed bin (27), ptr, fixed bin (35)); call file_manager_$put (oid, ci_num, ci_parts_ptr, code); where: oid (Input) is a file opening identifier. ci_num (Input) is a control interval number. ci_parts_ptr (Input) points to the structure described under the get primitive. code (Output) is a standard status code. Notes If the file is protected, the process must be in a transaction, and unless no_concurrency is specified, put locks the control interval in exclusive mode. It is kept locked until the end of the transaction. This assures that no other transaction will put anything into the control interval, get anything from it, free it, or delete the file during the current transaction. If the control interval is locked by another transaction, put will wait until it finishes. If waiting is pointless because the current transaction is deadlocked with another transaction, an appropriate status code is returned. Unless the file is unprotected or has the no_rollback attribute, put journals a before image of the data already in the control interval before actually modifying it. If the transaction should _____________ _____________ file_manager_ file_manager_ _____________ _____________ abort, the before journal manager will undo its modifications by restoring the before images. The modified control interval can not be written to disk until its before image is on disk, because there must be enough information on disk to roll back the transaction even if main memory fails. If the modified control interval were written first and the system failed before the transaction finished and the content of main memory could not be flushed to disk, the modification could not be undone and rollback of the transaction would be incomplete. The data management system holds modified control intervals in main memory until the associated before images are written to disk. The Multics clock value in the control interval header is used for this purpose. More details are in MTB-564, "Phasing Page Control and Before Journal". The put request is rejected if: - The user does not have write permission on the file. - The file is protected but the process is not in a transaction. in any file (ie. "never_write" mode). _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$put_journal | This entry point writes data into a control interval of a before | journal. This entry operates exactly as the entry put does, but | this entry is only called by the before journal and is maintained | separately so that the Before Journal manager's use of puts may | be monitored. The caller may specify one or several parts of the | control interval to be written. The parts structure is described | under the get entry point. | Usage | dcl file_manager_$put_journal entry (bit(36) aligned, fixed | bin(27), ptr, fixed bin(35)); | call file_manager_$put_journal (oid, ci_num, ci_parts_ptr, | code); | where: | oid (Input) | is the opening id of the Data Management (DM) file. | ci_num (Input) | is the control interval number. | ci_parts_ptr (Input) | is a pointer to a ci_parts structure (described | under the get entry point). | code (Output) | is a standard system status code. | Notes | See the notes at the put entry point. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$put_stream | This entry point will write a number of bytes into a DM file at a | given offset into the logical address space. This entry treats | the DM file as a stream of bytes made up of the concatenation of | the addressable portion of all control intervals in the DM file. | Usage | dcl file_manager_$put_stream entry (bit(36) aligned, fixed | bin(48), ptr, fixed bin(21), fixed bin(35)); | call file_manager_$put_stream (oid, file_offset_in_bytes, | buf_ptr, buf_length_in_bytes, code); | where: | oid (Input) | is the opening id of the of the DM file. | file_offset_in_bytes (Input) | is the offset in bytes into the logical address | space of the DM file where the supplied bytes will | be placed. | buf_ptr (Input) | is a pointer to the buffer containing the bytes to | be written to the DM file. | buf_length_in_bytes (Input) | is the number of bytes to be written into the DM | file from the buffer. | code (Input) | is the standard system status code. | Notes | If the DM file is protected, the process must be in a | transaction, and unless concurrency is specified, put_stream | locks the control intervals in which the specified stream of | bytes resides. | The calling process must have write access to the DM file in | order to do a put_stream operation | _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$raw_get This entry is like the get entry, except that it treats the file as if it were unprotected. It does not require that the process be in a transaction. Usage dcl file_manager_$raw_get entry (bit (36) aligned, fixed bin (27), ptr, fixed bin (35)); call file_manager_$raw_get (oid, ci_num, ci_parts_ptr, code); where: oid (Input) is a file opening identifier. ci_num (Input) is a control interval number. ci_parts_ptr (Input) points to a ci_parts structure which is described under the get entry. code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$raw_put This entry point is like put, except that it treats the file as if it were unprotected. Furthermore, the time_modified stamp in the control interval header is not updated. It is intended for applications that need to update protected files in an unprotected manner. It does not require that the process be in a transaction. Usage dcl file_manager_$raw_put entry (bit (36) aligned, fixed bin (27), ptr, fixed bin (35)); call file_manager_$raw_put (oid, ci_num, ci_parts_ptr, code); where: oid (Input) is a file opening identifier. ci_num (Input) is a control interval number. ci_parts_ptr (Input) points to the structure described under the get primitive. code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$replace_acl | This entry point replaces an entire access control list (ACL) for | a Data Management (DM) file with a user-supplied ACL, and can | optionally add an entry for *.SysDaemon.* with mode rw to the new | ACL. The segment_acl structure described at the add_acl_entries | entry point is used by this entry. | Usage | dcl file_manager_$replace_acl entry (dir_name, entryname, | acl_ptr, acl_count, no_sysdaemon, code); | call file_manager_$replace_acl (char(*), char(*), ptr, fixed | bin, bit(1), fixed bin(35)); | where: | dir_name (Input) | is the pathname of the directory containing the DM | file. | entryname (Input) | is the entry name of the DM file. | acl_ptr (Input) | is a pointer to the user-supplied segment_acl | structure that is to replace the current ACL. | acl_count (Input) | is the number of ACL entries in the segment_acl | structure. | no_sysdaemon (Input) | is a switch that indicates whether an rw | *.SysDaemon.* entry is to be put on the ACL of the | DM file after the existing ACL has been deleted and | before the user supplied ACL is added. | code (Output) | is the standard system status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$set_ring_brackets | This entry point, given the pathname of a Data Management (DM) | file, sets the file's ring brackets. This entry is unimplemented | in the current Data Management system. | Usage | dcl file_manager_$set_ring_brackets entry (char (*), char | (*), (2) fixed bin (3), fixed bin (35)); | call file_manager_$set_ring_brackets (dir_name, entry_name, | ring_brackets, code); | where: | dir_name (Input) | is the pathname of the containing directory. | entryname (Input) | is the entry name of the DM file. | ring_brackets (Input) | are the ring brackets of the DM file. This is a two | element array with the first bracket being the | file's write bracket and the second being the file's | read bracket. | code (Output) | is the standard status code. | Notes | The user must have modify permission on the containing directory. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$set_switch | This entry point sets the value of a named switch associated with | a given Data Management (DM) file. | Usage | dcl file_manager_$set_switch entry (char(*), char(*), | char(*), bit(1), fixed bin(35)); | call file_manager_$set_switch (dir_name, entryname, | switch_name, switch_value, code); | where: | dir_name (Input) | is the pathname of the directory containing the DM | file. | entryname (Input) | is the entry name of the DM file. | switch_name (Input) | is the name of the switch whose value is to be set. | switch_value (Input) | is the value the named switch is to be set to. | code (Output) | is the standard system status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$simple_get | This entry is used to get a sequence of bytes from a Data | Management (DM) file, given an opening id (OID), a control | interval (CI), and control interval offset. The sequence is | placed in a caller supplied buffer. This entry point differs | from the get entry point in that it can only get bytes from one | location within a control interval, and a ci_parts structure does | not have to prepared to make the call. | Usage | dcl file_manager_$simple_get entry (bit(36) aligned, fixed | bin(27), fixed bin(21), ptr, fixed bin(21)); | call file_manager_$simple_get (oid, ci_num, | ci_offset_in_bytes, buf_ptr, buf_length_in_bytes); | where: | oid (Input) | is the opening id of the Data Management (DM) file. | ci_num (Input) | is the control interval in the DM file that contains | the data to be gotten. | ci_offset_in_bytes (Input) | is the offset from the beginning of the control | interval to the beginning of the data, expressed in | bytes. | buf_ptr (Input) | is a pointer to a caller supplied buffer where the | data is to be placed. | buf_length_in_bytes (Input) | is the length expressed in bytes of the caller | supplied buffer. This also specifies the number of | bytes to be fetched. The sum of ci_offset_in_bytes | and buf_length_in_bytes must not exceed the length | of a control interval. | code (Output) | is the standard system status code. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$simple_put | This entry places a given sequence of bytes into a Data | Management (DM) file, given an open id (OID), a control interval | (CI), and a control interval offset. This entry differs from the | put entry point in that it will only place bytes at one given | location within a control interval, so a ci_parts structure is | not needed. | Usage | dcl file_manager_$simple_put entry (bit(36) aligned, fixed | bin(27), fixed bin(21), ptr, fixed bin(21)); | call file_manager_$simple_put (oid, ci_num, | ci_offset_in_bytes, buf_ptr, buf_length_in_bytes); | where: | oid (Input) | is the opening id of the Data Management (DM) file. | ci_num (Input) | is the control interval in the DM file where the | data is to be placed. | ci_offset_in_bytes (Input) | is the offset from the beginning of the control | interval to the beginning of where the data is to be | placed. | buf_ptr (Input) | is a pointer to the buffer containing the data. | buf_length_in_bytes (Input) | is the number of bytes that are to be placed into | the DM file. | code (Output) | is the standard system status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$status | This entry point returns status information on a Data Management | (DM) file. This entry is currently not implemented. | Usage | dcl file_manager_$status entry (bit(36), ptr, fixed | bin(35)); | call file_manager_$status (oid, file_status_ptr, code); | where: | oid (Input) | is the opening id of the DM file. | file_status_ptr (Input) | is a pointer to a file_status structure to be filled | in by this entry. Currently the file_status | structure has not been defined. | code (Output) | is the standard system status code. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$suffix_info | This entry point is for support of extended object software. It | returns a suffix_info structure describing what can be done with | Data Management (DM) files. The suffix_info structure is | described under the notes section below. | Usage | dcl file_manager_$suffix_info entry (ptr); | call file_manager_$suffix_info (suffix_info_ptr); | where: | suffix_info_ptr (Input) | is a pointer to a user-supplied suffix_info | structure. | Notes | The suffix_info include file is suffix_info.incl.pl1. The form | of the structure is as follows: | dcl 1 suffix_info aligned based (suffix_info_ptr), | 2 version char(8), | 2 type char(32) unaligned, | 2 type_name char(32) unaligned, | 2 plural_name char(32) unaligned, | 2 flags unaligned, | 3 standard_object bit(1) unaligned, | 3 extended_acl bit(1) unaligned, | 3 has_switches bit(1) unaligned, | 3 mbz1 bit(33) unaligned, | 2 modes char(36), | 2 max_mode_len fixed bin, | 2 num_ring_brackets fixed bin, | 2 copy_flags like copy_flags, | 2 info_pathname char(168) unaligned; | where: | version | is the version mark of this structure. Currently | SUFFIX_INFO_VERSION_1. | type _____________ _____________ file_manager_ file_manager_ _____________ _____________ is the type of this object. For example: DM file. | type_name | is the singular name of the object type. | plural_name | is the plural name of the object type. | flags.standard_object | This flag is on if this is not an extended object. | flags.extended_acl | This flag is on if this object uses extended ACLs. | flags.has_switches | This flag is on if switches are supported for the object. | modes | is a string containing the characters that represent the modes | of the object. For example, modes = "rew" | max_mode_len | The maximum number of modes on an object. | num_ring_brackets | is the number of ring brackets on the object. | copy_flags | is the copy_flags structure which contains a list of flags | that describe which attributes may be copied by copy_. This | structure is defined in the include file: copy_flags.incl.pl1 | (see below). | info_pathname | is the pathname of the info segment containing more | information. | copy_flags | The form of the include file copy_flags is as follows: | dcl 1 copy_flags aligned based, | 2 names bit (1) unaligned, | 2 acl bit (1) unaligned, | 2 ring_brackets bit (1) unaligned, | 2 max_length bit (1) unaligned, | 2 copy_switch bit (1) unaligned, | 2 safety_switch bit (1) unaligned, | 2 dumper_switches bit (1) unaligned, | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | 2 entry_bound bit (1) unaligned, | 2 extend bit (1) unaligned, | 2 update bit (1) unaligned, | 2 mbz bit (26) unaligned; | where: | names | is on if all the object names may be copied by copy_. | acl | is on if the access control list (ACL) may be copied by copy_. | ring_brackets | is on if the ring_brackets may be copied by copy_. | max_length | is on if the max_length may be copied by copy_. | copy_switch | is on if the value of the copy switch may be copied by copy_. | safety_switch | is on if the value of the safety switch may be copied by | copy_. | dumper_switches | is on if the value of the dumper switches may be copied by | copy_. | entry_bound | is on if the entry bound attribute may be copied by copy_. | This is only used for object segments. | extend | is on if copy may append to the end of the existing object. | update | is on if copy_ may replace the contents of the existing | object. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$terminate_ci_ptr | This entry point releases a control interval pointer to a | specific control interval (CI) of a Data Management (DM) file | that has been gotten through the get_ci_ptr entry point. | Currently this entry point is not implemented, and get_ci_ptr | does not remember which ci_ptr it has handed out. | Usage | dcl file_manager_$terminate_ci_ptr entry (bit(36) aligned, | fixed bin(27), ptr, fixed bin(35)); | call file_manager_$terminate_ci_ptr (oid, ci_num, ci_ptr, | code); | where: | oid (Input) | is the opening id of the DM file. | ci_num (Input) | is the control interval that the control interval | pointer points to. | ci_ptr (Input) | is the control interval pointer to be terminated. | code (Output) | is the standard system status code. | _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$undo | This entry point has not been implemented. It is supposed to be | used for rolling back any of several different kinds of actions | that may be performed in the Data Management (DM) system, such as | undeleting, uncreating, and unmodifying DM files. _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$unput This entry point is used exclusively by the before journal manager for rolling back transactions. It is just like put, except that it does not lock the control interval or journal a before image. Also, it does not update the time_modified stamp in the control interval header. Usage dcl file_manager_$unput entry (bit (36) aligned, fixed bin (27), ptr, fixed bin (35)); call file_manager_$unput (oid, ci_num, ci_parts_ptr, code); where: oid (Input) is a file opening identifier. ci_num (Input) is a control interval number. ci_parts_ptr (Input) points to the structure described under the get primitive. code (Output) is a standard status code. _____________ _____________ file_manager_ file_manager_ _____________ _____________ | Entry: file_manager_$user_shutdown | This entry is called during the user shutdown period. Its | function has not been defined for the File Manager. This entry | currently is just a no-op. | Usage | dcl file_manager_$user_shutdown entry (); | call file_manager_$user_shutdown (); _____________ _____________ file_manager_ file_manager_ _____________ _____________ Entry: file_manager_$validate | This entry point validates whether an entry is a Data Management | (DM) file or not. | Usage | dcl file_manager_$validate entry (char(*), char(*), fixed | bin(35)); | call file_manager_$validate (dir_name, entryname, code); | where: | dir_name (Input) | is the pathname of the directory containing the DM | file. | entryname (Input) | is the entryname of the DM file. | code (Output) | is the standard system status code. Zero is | returned if the entry is a valid DM file. If the | entry is a DM file, then a zero status code is | returned, otherwise one of the following is | returned: | error_table$noentry - File does not exist and user has "s" access to the file's containing directory; | error_table_$no_info - User does not have "s" access to the file's containing directory and does not have "r" access to the file's first component; | error_table_$not_seg_type - File does not have the canonical add-name on the first component which identifies it as a DM file, or, the write-ring-bracket on the first component is not the DM ring (here defined as the ring of execution of this module). |