?? NEWTITLE := '  NOS/VE Set Management ' ??
MODULE stm$ring2_remove_member;
?? RIGHT := 110 ??

{ PURPOSE:
{   This module contains the ring 2 processing for removing  a  member  volume
{   from a set.
{
{ DESIGN:

?? NEWTITLE := 'Global Declarations Referenced by This Module', EJECT ??
?? PUSH (LISTEXT := ON) ??
*copyc ste$error_condition_codes
*copyc stt$active_set_entry
*copyc gft$system_file_identifier
*copyc ost$status
?? POP ??
*copyc osp$append_status_parameter
*copyc osp$set_status_abnormal
*copyc stp$destroy_vst
*copyc stp$obtain_vst_header
*copyc stp$open_vst
*copyc stp$remove_member_from_master
*copyc stp$remove_member_from_mel
*copyc stp$remove_set_from_vst
*copyc stp$return_opened_vst
?? OLDTITLE ??
?? NEWTITLE := '   [XDCL, #GATE] stp$r2_remove_inactive_member', EJECT ??

  PROCEDURE [XDCL, #GATE] stp$r2_remove_inactive_member
    (    ast_index: stt$ast_index;
         member_vol: rmt$recorded_vsn;
         master_vol: rmt$recorded_vsn;
     VAR status: ost$status);

    VAR
      local_status: ost$status,
      masters_sfid: gft$system_file_identifier,
      master_vst_segment_pointer: mmt$segment_pointer,
      p_master_vst: ^stt$vol_set_table;

    stp$open_vst (master_vol, TRUE, masters_sfid, master_vst_segment_pointer, status);
    IF status.normal THEN
      p_master_vst := master_vst_segment_pointer.cell_pointer;
      stp$remove_member_from_master (member_vol, p_master_vst, status);
      IF status.normal THEN
        stp$remove_member_from_mel (member_vol, ast_index, status);
      IFEND;
      stp$return_opened_vst (masters_sfid, master_vst_segment_pointer, local_status);
    IFEND;

  PROCEND stp$r2_remove_inactive_member;
?? OLDTITLE ??
?? NEWTITLE := '  [XDCL, #GATE] stp$ring2_remove_member', EJECT ??
*copyc sth$ring2_remove_member

  PROCEDURE [XDCL, #GATE] stp$ring2_remove_member
    (    set_name: stt$set_name;
         member_vol: rmt$recorded_vsn;
         master_vol: rmt$recorded_vsn;
         ast_entry: stt$active_set_entry;
         ast_index: stt$ast_index;
     VAR remove_member_status: ost$status);


    VAR
      local_status: ost$status,
      master_vst_segment_pointer: mmt$segment_pointer,
      masters_sfid: gft$system_file_identifier,
      member_internal_vsn: dmt$internal_vsn,
      member_vst_segment_pointer: mmt$segment_pointer,
      member_vst_vsn: rmt$recorded_vsn,
      members_set_name: stt$set_name,
      members_sfid: gft$system_file_identifier,
      members_unique_set_name: stt$unique_set_name,
      p_master_vst: ^stt$vol_set_table,
      p_member_vst: ^stt$vol_set_table,
      possible_to_mount_master: boolean,
      possible_to_mount_member: boolean,
      vol_belongs_to_set: boolean,
      vol_status_in_set: stt$vol_status_in_set;

    { get the member vst open }
    stp$open_vst (member_vol, TRUE, members_sfid, member_vst_segment_pointer, remove_member_status);
    IF NOT remove_member_status.normal THEN
      RETURN; {----->
    IFEND;
    p_member_vst := member_vst_segment_pointer.cell_pointer;
    {verify this is the correct member.
    stp$obtain_vst_header (p_member_vst, member_vst_vsn, member_internal_vsn, vol_belongs_to_set,
          members_set_name, members_unique_set_name, vol_status_in_set);
    IF vol_belongs_to_set THEN
      IF set_name <> members_set_name THEN
        osp$set_status_abnormal (stc$set_management_id, ste$wrong_set_given, member_vol,
              remove_member_status);
        osp$append_status_parameter (osc$status_parameter_delimiter, members_set_name, remove_member_status);
        osp$append_status_parameter (osc$status_parameter_delimiter, set_name, remove_member_status);
      ELSE
        IF ast_entry.unique_set_name <> members_unique_set_name THEN
          osp$set_status_abnormal (stc$set_management_id, ste$bad_unique_member, member_vol,
                remove_member_status);
        IFEND;
      IFEND;
    ELSE
      osp$set_status_abnormal (stc$set_management_id, ste$vol_not_in_set, member_vol, remove_member_status);
      osp$append_status_parameter (osc$status_parameter_delimiter, set_name, remove_member_status);
    IFEND;

    IF remove_member_status.normal THEN
{     get the master vst open
      stp$open_vst (master_vol, TRUE, masters_sfid, master_vst_segment_pointer, remove_member_status);
      IF remove_member_status.normal THEN
        p_master_vst := master_vst_segment_pointer.cell_pointer;
{
{       REMOVE ALL TRACE OF THE MEMBER VOLUME
        stp$remove_set_from_vst (p_member_vst, remove_member_status);
        stp$remove_member_from_mel (member_vol, ast_index, remove_member_status);
        stp$remove_member_from_master (member_vol, p_master_vst, remove_member_status);
        stp$return_opened_vst (masters_sfid, master_vst_segment_pointer, local_status);
      IFEND;

    IFEND;
    stp$return_opened_vst (members_sfid, member_vst_segment_pointer, local_status);
    IF remove_member_status.normal THEN
      stp$destroy_vst (member_vol, local_status);
    IFEND;

  PROCEND stp$ring2_remove_member;
?? OLDTITLE ??
MODEND stm$ring2_remove_member;
