?? NEWTITLE := '  NOS/VE Set Management ' ??
MODULE stm$ring2_create_set;
?? RIGHT := 110 ??
{
{  PURPOSE:
{    This module is the ring 2 processor for the create set operations.
{
?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc pft$root
*copyc ste$error_condition_codes
*copyc dmt$active_volume_table_index
*copyc dmt$internal_vsn
*copyc gft$system_file_identifier
*copyc ost$status
*copyc ost$user_identification
*copyc stt$dm_packet_storage
?? POP ??
*copyc dmp$change_set_name
*copyc osp$generate_unique_binary_name
*copyc osp$set_status_abnormal
*copyc stp$attach_vst
*copyc stp$create_ast_entry
*copyc stp$create_vst
*copyc stp$destroy_vst
*copyc stp$detach_vst
*copyc stp$fill_master_vst
*copyc stp$remove_set_from_vst
*copyc stp$return_opened_vst
?? OLDTITLE ??
?? NEWTITLE := '  [XDCL, #GATE] stp$ring2_create_set', EJECT ??
*copyc sth$ring2_create_set

  PROCEDURE [XDCL, #GATE] stp$ring2_create_set (requested_set: stt$set_name;
        requested_master_vol: rmt$recorded_vsn;
        master_internal_vsn: dmt$internal_vsn;
        requested_set_owner: ost$user_identification;
        access_status: stt$access_status;
        active_volume_table_index: dmt$active_volume_table_index;
        root_recreated: boolean;
    VAR create_set_status: ost$status);

    VAR
      ast_index: stt$ast_index,
      dm_packet_storage: stt$dm_packet_storage,
      master_vst_segment_pointer: mmt$segment_pointer,
      masters_sfid: gft$system_file_identifier,
      p_master_vst: ^stt$vol_set_table,
      temporary_status: ost$status,
      unique_set_name: stt$unique_set_name;

    create_set_status.normal := TRUE;

    {check if the master volume set table already exists
    stp$attach_vst (requested_master_vol, masters_sfid, create_set_status);
    IF create_set_status.normal THEN {this implies that the volume is already in a set.
      stp$detach_vst (masters_sfid, temporary_status);
      osp$set_status_abnormal (stc$set_management_id, ste$master_belongs_to_set, requested_master_vol,
            create_set_status);
      RETURN;
    IFEND;

{   create and open the master volume set table.
    stp$create_vst (requested_master_vol, masters_sfid, master_vst_segment_pointer, create_set_status);
    IF NOT create_set_status.normal THEN
      RETURN;
    IFEND;
    p_master_vst := master_vst_segment_pointer.cell_pointer;


{   then the master volume set
{   table is set up, and finally an entry is created in the active set table
    dm_packet_storage.dm_packet_ever_stored := FALSE;
    osp$generate_unique_binary_name (unique_set_name, create_set_status);
    stp$fill_master_vst (p_master_vst, requested_master_vol, master_internal_vsn, requested_set,
          unique_set_name, requested_set_owner, dm_packet_storage, root_recreated,
          create_set_status);
    IF create_set_status.normal THEN
      stp$create_ast_entry (requested_set, unique_set_name, requested_master_vol, master_internal_vsn,
            active_volume_table_index, requested_set_owner, access_status, dm_packet_storage, ast_index,
            create_set_status);
      IF create_set_status.normal THEN
{         If all went well, device manager is notified, and stores the set
{         name.
        dmp$change_set_name (requested_master_vol, requested_set, create_set_status);
      ELSE
{
{         This is the case where something went wrong in creating the
{         ast entry, so all previously established tables must be
{         'erased'.
{
        stp$remove_set_from_vst (p_master_vst, temporary_status);
      IFEND;
    IFEND;

    {close master vol set table}
    stp$return_opened_vst (masters_sfid, master_vst_segment_pointer, temporary_status);
    IF NOT create_set_status.normal THEN
      stp$destroy_vst (requested_master_vol, temporary_status);
    IFEND;
  PROCEND stp$ring2_create_set;
?? OLDTITLE ??
MODEND stm$ring2_create_set;
