MULTICS TECHNICAL BULLETIN                             MTB-731-01

  To:       MTB Distribution

  From:     Rich Fawcett

  Date:     03/26/86

  Subject:  FIPS Disk Support

  This MTB describes the plans  for supporting the FIPS disk drives
  on  the  Multics  File  System.   The  FIPS  disk are MSU3380 and
  MSU3390,  these are  IBM  devices  3380D and  3380E respectively.
  This plan will  allow support of any large disk  with the correct
  format and  PSIA hardware interface.  The  two problems addressed
  are:  disk size too large for  volume map, and the performance of
  the hardware read-alter-rewrite (RAR).  These problems are solved
  by dividing  the large disk into "subvolumes"  and eliminating 64
  word IO to these drives.

  This  is the  first revision,   and reflects  the results  of the |
  proto-type  code testing.   Also  minor  problems were  found and |
  corrected.  This revision has change bars to indicate the changes |
  from the original MTB.                                            |

  Comments on this  MTB should be placed in  the Disk_Support forum
  on System M:

      >udd>m>mtgs>Disk_Support (disks) or  directed by Multics mail
  to:

      System M:  Fawcett.Multics

  or by phone to:

      Rich Fawcett
      HVN:  249-6777
      DDD:  602-249-6777

  _________________________________________________________________

  Multics  Project  internal  working  documentation.   Not  to  be
  reproduced or distributed outside the Multics Project.


  MTB-731-01                                     FIPS Disk Support

                               CONTENTS

                                                           Page

      Introduction  . . . . . . . . . . . . . . . . . . .   1
         Problems . . . . . . . . . . . . . . . . . . . .   1
         Solutions  . . . . . . . . . . . . . . . . . . .   2
      Seek_512 Implementation . . . . . . . . . . . . . .   3
|     Subvolume Implementation  . . . . . . . . . . . . .   4
|        Naming convention  . . . . . . . . . . . . . . .   5
         Configuration cards and device types . . . . . .   6
      IOI and RCP . . . . . . . . . . . . . . . . . . . .   7
      Volume Reloader and Rdisk_  . . . . . . . . . . . .   7
      Prototype software results  . . . . . . . . . . . .   9
      Detail software changes . . . . . . . . . . . . . .   10
         New include file . . . . . . . . . . . . . . . .   10
|        Include file changes . . . . . . . . . . . . . .   10
|        Hardcore code changes  . . . . . . . . . . . . .   12
|           bound_bce_dump_ . . . . . . . . . . . . . . .   12
|           bound_bce_paged . . . . . . . . . . . . . . .   12
            bound_bce_wired . . . . . . . . . . . . . . .   12
            bound_bootload_0  . . . . . . . . . . . . . .   13
|           bound_bce_probe_  . . . . . . . . . . . . . .   13
|           bound_disk_util_1 . . . . . . . . . . . . . .   13
|           bound_disk_util_2 . . . . . . . . . . . . . .   13
|           bound_hc_backup . . . . . . . . . . . . . . .   14
            bound_library_1_  . . . . . . . . . . . . . .   14
            bound_mdxhdx_ . . . . . . . . . . . . . . . .   14
            bound_multics_bce_  . . . . . . . . . . . . .   14
            bound_page_control  . . . . . . . . . . . . .   15
            bound_rcp_  . . . . . . . . . . . . . . . . .   15
            bound_salvager  . . . . . . . . . . . . . . .   15
            bound_scavenger . . . . . . . . . . . . . . .   15
            bound_segment_control . . . . . . . . . . . .   16
            bound_temp_1  . . . . . . . . . . . . . . . .   16
            bound_temp_2  . . . . . . . . . . . . . . . .   17
            bound_volume_rldr_ut_ . . . . . . . . . . . .   17
            bound_volume_reloader_  . . . . . . . . . . .   17
            bound_vtoc_man  . . . . . . . . . . . . . . .   18
|        Tools code changes . . . . . . . . . . . . . . .   18
            bound_admin_rtnes_  . . . . . . . . . . . . .   18
            bound_hc_display_ . . . . . . . . . . . . . .   18
            bound_io_tools_ . . . . . . . . . . . . . . .   18
|           bound_meter_util_ . . . . . . . . . . . . . .   18


  FIPS Disk Support                                      MTB-731-01

                           CONTENTS (cont)

                                                           Page

            bound_metering_cmds_  . . . . . . . . . . . .   19      |
            bound_priv_ss_  . . . . . . . . . . . . . . .   19


  FIPS Disk Support                                      MTB-731-01

  INTRODUCTION

  When the dipper (IMU) support  effort started it was assumed that
  it would be a  simple task to use a device number  0 for the FIPS
  devices.  This turned  out to be true.  It was  also assumed that
  the  3380A model drive  would be the  device to support  and some
  time in the  distant future a 3390 model would  be announced.  It
  was assumed that the size of the 3380A would not be a big problem
  and it would  be some time before the 3390  was announced.  These
  last two assumptions  turned out to be false.   IBM has announced
  3380D and  3380E models.  The  size problem is  larger than first
  considered.  Also, a performance problem was discovered.

  First a view of the new disks.   One IBM 3380D cabinet is made up
  of  two   physical  rotating  spindles,  each   spindle  has  two
  independent actuator  arms.  Each arm  has its own  device number
  and surface area.  The surface  area for recording is not shared.
  For the rest of  this MTB a device will be referred  to as one of
  the independent  arms.  Each cylinder  has 15 recording  heads or
  tracks.  The  device can appear  to the software  to be formatted
  with 64  word sectors or 512  word sectors.  Due to  the required
  size of sector gaps the 64 word format has 50% less capacity than
  the 512  word format, therefore the  64 word format is  not being
  considered for Multics.   With the 512 word format  there are 255
  sectors per cylinder (127 usable  records).  Each device (arm) of
  a  3380  accesses  885  cylinders  (112395  usable records), Each
  device  (arm) of  a 3390  accesses 1770  cylinders (224790 usable
  records).

  Problems

  The current implementation of the  Multics disk modules treat all
  devices  as having  a 64  word format.   As is  the case with the
  MSU501  drive,  the  hardware  will  perform a read-alter-rewrite
  (RAR) cycle to insert 64 or 192 words of a VTOC into the 512 word
  sector.  The FIPS  channel performs the RAR for  IBM devices, for
  MSU501s this is done by the controller.  The hardware will accept
  two types of seek commands,  seek_64 and seek_512.  If the device
  is  formatted  with  512  word  sectors  and  the seek command is
  seek_64  the RAR  function is   done when  needed (less  than 512
  words).  This  will be the case  with every VTOC write.   The RAR
  cycle reads  the 512 word sector  into a buffer, inserts  the new
  data and  rewrites the sector back  to the disk.  This  of course
  cannot be done on one revolution  of the spindle, it will take at
  least two.  If the VTOC spans two sectors, as does the third VTOC
  in  a  record,  this  must  be  done  twice  and  could go over 4
  revolutions.   The RAR  function is  not needed  for page writes.
  The channel  time measured by  disk_meters for this  cycle on the
  IBM  drives is  much greater   than for  the MSU501  drives.  The
  longer channel time for  read-alter-rewrites (RAR) of VTOCS alone
  is not a major problem, however this has an undesirable effect on


  MTB-731-01                                     FIPS Disk Support

  the paging IO.  While the channel  is busy with the RAR all other
  IO is  held up, this increases  the channel time for  page reads,
  and decreases total system performance.

  The second  problem is that  the storage system  defines the free
  and used records  of a disk volume by use of  the volume map, one
  bit per  record.  The volume map  is 3 pages -  64 words in size,
  only 32 bits of each word are used.  Each bit defines a record as
  being  used or free,  96256 paging records  can be defined.   The
  file  map array elements  that define the  record numbers on  the
  disk volume  for a segment are  18 bits in length,  with the high
  order bit indicating a null page address.  These two entities are
  too small  to define a 3380E  and the volume map  will not define
  the entire 3380D.

  Solutions

  The solution to the performance problem will be to replace the 64
  word  IO with  512 word  IO, thus  eliminating the  need for  the
  hardware read-alter-rewrite.   To implement the 512  word IO only
  one 192  word VTOC will be  stored per one 512  word sector.  The
  seek command for  these devices is seek_512 and the  DCW tally is
  192.   This requires making  the disk dim  and vtoc manager  more
  device dependent.  It  also requires software read-alter-rewrites
  when less than all of the VTOC is to be written.

  The  volume map  and file  map size  problem can  be resolved  by
  increasing  the  size  of  the  data  bases  used.   That  is, by
  rewriting  the  entire  file  system  to  understand these larger
  sizes.  It then  is a matter of converting labels  on 451s, 500s,
  and 501s at  each site and reloading the data.   If a larger disk
  needs to  be supported, we  can do it  all again.  This  is not a
  small task, and would take many man years to implement.

  This same problem could be  solved by using the hardware function
  that  divides the  3380D arm   into two  devices.  The  device is
  divided such that the first half  of the cylinders are for device
  0 and the next  half is for device 32.  If the  seek is issued to
  device 32 the channel adds to the seek address.  However there is
  no upper bound protection for seeks  to device 0.  There would be
  no hope for seek optimization or user security.  The 3380E may be
  divided into  four devices but as  yet this support has  not been
  defined.

  The  most reasonable  solution is  to have  the Multics  software
  divide  this  large  disk  into  subvolumes.   The  disk  will be
  subdivided  into smaller  parts called  physical subvolumes, each
  subvolume  would have a  label and VTOC  area and logically  look
  much like the physical volume.  In the past a physical volume has
  defined an entire physical  device.  With this implementation the
  old definition is device dependent.  If  the device is a 451 then


  FIPS Disk Support                                      MTB-731-01

  the physical  volume defines the entire physical  device.  If the
  device is  subdivided then a physical volume  defines a subvolume
  of the  physical device.  The subvolumes would  be interleaved by
  cylinder.  The  subvolume logical addresses are  converted to the
  real device  addresses and placed  in the queue  per device.  The
  seek optimization for a device would work the same as for the 451
  drives with no need to keep track of a "buddy" device as with the
  501 drives.

  This implementation will  not take many man years.   It should be
  viewed  as a better  choice than changing  the world, and  may be
  expanded  in the  future.  Prototype  software that  includes the
  seek_512 and subvolumes has been tested.

  SEEK_512 IMPLEMENTATION

  There  are two basic  considerations to use  512 word IO  for the
  3380 drives.  The first is the seek command used by disk_control,
  dctl  and rdisk_.  The  second is the  conversions of record  and
  sector offset to a real device seek address, and the calculations
  of VTOC and  page record numbers.  The disk_dim  uses a hardcoded
  16  (sixteen sectors  per record)   to convert  devadd to  sector
  number.  This changes  to look at the device type,  and use 16 or
  2.

  The  programs that  calculate VTOC  IO record  and sector numbers
  will   change.   The   512  word    IO  will   not  do   hardware
  read-alter-rewrites.  Therefore  on this type of  device a sector
  will  contain only one  VTOCE, starting at  the beginning of  the
  sector for 192 valid words.  The  DCW tally of 192 will take care
  of the extra words, both reading and writing.  These calculations
  are currently made by referencing  two constants in the disk_pack
  include file, SECTORS_PER_VTOCE and VTOCES_PER_RECORD.  These two
  constants change to array constants  indexed by device type.  The
  elements  of these  arrays contain   the correct  value for  that
  device.   There are  a few  programs that  use hardcoded numbers.
  For      these     programs       a     new      include     file
  fs_dev_types_sector.incl.pl1 has  been created.  There  are other
  programs that  use hardcoded numbers and  also uses fs_dev_types,
  therefore the new include file  is included in fs_dev_types as an
  include statement.

  There are times when the  Multics storage system writes less than
  all  three parts  of a  VTOCE.  This  will cause  a software  RAR
  controlled  by  vtoc_man.   This   involves  a  small  change  in
  philosophy  as well  as the   calculation of  the correct  record
  number and sector offset.  Vtoc_man must look for a write of less
  than a complete  VTOCE to a FIPS device.  When  this condition is
  true a check is  made to see if the VTOCE is  in the vtoc buffer,
  if not  it is read.   The parts to  be written are  copied to the
  VTOCE in  the buffer and then  the VTOC is written.   This RAR is


  MTB-731-01                                     FIPS Disk Support

| metered by vtoc_buffer_meters.

| SUBVOLUME IMPLEMENTATION

  The   disk  is  logically   subdivided  into  smaller   parts  or
  subvolumes.   Each  subvolume  has  a  label  and  VTOC  area and
  logically  look  much  like  a  physical  volume.   The  physical
  subdivision  of the  device will  a fixed  number of  interleaved
  cylinders,  as opposed  to dividing   the device  into groups  of
  contiguous cylinders.  The term interleaved cylinders implies:

     o 3380D  will be  divided into  two subvolumes,  A and B.
       The A subvolume  will use cylinders 0, 2, 4,  6, and so
       on.  While the B subvolume  will use cylinders 1, 3, 5,
       7, and so on.

     o 3380E will be divided into  three subvolumes, A, B, and
       C.  The A subvolume will use  cylinders 0, 3, 6, 9, and
       so  on.  B will  be 1, 4,  7,...  and C  will be 2,  5,
       8,...

  The number of  cylinders per subvolume will be  determined by the
  device type.

  This will cause the seek distance  of a non-full drive to be less
  than they would  be for the contiguous cylinder  concept.  On the
  3380D the last  cylinder will not be usable,  wasting 127 records
  or .11% of  the total.  The entire 3380E will  be usable.  If the
  3380D was  divided into thirds it  would all be usable,  but each
  subvolume  would be  smaller that  a 451.   Such small subvolumes
  would  not be   large enough  for use  as an   RPV drive  and are
  therefore not considered.

  The  system treats these  subvolumes in much  the same way  as it
  treats a physical volume.  A  subvolume is a physical volume that
  resides on a device that has been subdivided.  The primary change
  is to  the PVTE.  When  the PVTE is  built by init_pvt  for these
  subdivided devices, there will be a PVTE made for each subvolume.
  The  PVTE will  contain the  primary device  index (pdi),  a flag
  indicating  that this defines  a device divided  into subvolumes,
  this  subvolume's  number,  the  number  of  subvolumes  for this
  device,  and a record_factor  to be used  in the conversion  from
  logical seek address to real seek address.  If the PVTE defines a
  device that is not divided  into subvolumes the subvolume flag is
  reset, the number of subvolumes is zero and only one PVTE will be
  generated.

  At the  point that disk_init  gets invoked for  this device, only
  the PVTE  for the first subvolume  will be passed.  This  will be
  the  PVTX stored in  disk_data.  This allows  other parts of  the
  system  to convert   a path  name to  a PVTX   and a  VTOCX.  The


  FIPS Disk Support                                      MTB-731-01

  difference is  when the disk dim  is called the PVTX  will be for
  the  subvolume, and  the device   address is  a relative  address
  rather than  a real one.  It  is the job of  dctl to convert this
  relative device address to a real device sector address using the
  data in the PVTE.  The algorithm, stated in pl1 expressions, is:

      record_offset = mod (devadd, pvte.records_per_cyl);
      devadd = ((devadd - record_offset) * pvte.num_of_svs) +
                pvte.record_factor + record_offset;

  This  is done  with 7  alm instructions  in dctl.   With the real
  devadd (record  number), the real  seek address is  calculated as
  before.  Using the  real device number and seek  address the seek
  optimization,  device  metering,  and  io-queuing  are unchanged.
  This will not degrade the system any more than if all the bit map
  changes were made and the same  amount of data were stored on one
  very large physical device.                                       |

  The device is metered as one entity, however disk_meters displays |
  the volume info for each of  the physical volumes that are on the |
  device.   No meters  are reported   or kept  on each  subvolume's |
  activity.                                                         |

  Naming convention                                                 |

  Until these changes, a physical  volume could be related directly
  to a physical device even though they are two different entities.
  The subvolume implementation allows  multiple physical volumes on
  one physical device.  There is no restriction that these physical
  volumes be for  the same logical volume, or related  in any other
  way.  When physical disk space  is assigned for a logical entity,
  physical volumes or partitions, the correct subvolume of the disk
  must be indicated.  This is  done by appending the subvolume name
  to the disk drive name.  For 3380D the valid subvolume names are:
  a and b; for 3380Es they are:  a, b and c.

      subsys_name||_||device_number{subvol_name}

  Examples:

      The  second subvolume  of 3380D  device number  3 in disk
      subsystem a is dska_03b.

      The  third subvolume  of 3380E  device number  00 in disk
      subsystem b is dskb_00c.

  For  devices supported  before these  changes, or  future devices
  that are not divided into subvolumes, the subvol_name must not be
  given.  Programs that parse the  device number and subsystem also
  check for the  need of a subvolume name and  the validity of that
  name.  Most of  these programs are part of  the volume management


  MTB-731-01                                     FIPS Disk Support

  subsystem.  There are  declarations in fs_dev_types.incl.pl1 that
  define  the number  of subvolumes  per device  type (number_of_sv
  array), and the valid names for subvolumes, (valid_sv_name array,
  valid_sv_string).  The device type can be found in the disk_table
  (dte) or in physical_volume_table_entry (pvte), the full name can
  be found in the dte.

  The init_vol command looks like this

      init_vol pub04 dska_03a

  The add_volume command looks like this

      add_volume pub04 dska_03a

  Configuration cards and device types

  The  two  IBM  drive  models  are  3380D  and  3380E.  Before IBM
  announced the 3380E it was rumored that the model would be called
  a 3390.  The model field on the disk peripheral card is a numeric
  field as it  is on the tape peripheral card.   Many programs look
  at  these cards  in the   same way.   The alpha  character causes
  problems,  so the  3380D model  number is  3380 and  the 3380E is
  3390.  These  match the Honeywell designation of  MSU3380 and MSU
  3390.  Then it follows that device  type names are d338 and d339.
  These device types are compatible with d451 and d501.

  The peripheral cards are:

      prph dska a 20.  4 3380.  8.
      prph dskb a 16.  4 3390.  8.

  Now that some device numbers may  have an alpha character in them
  the definition of the drive number on the part and root cards has
  changed from numeric to string.  This has an impact on the config
  deck and is an incompatible change.

  Example:

      part dump dskb 3c
      part log dskc 1
      root dska 0a dskb 3c dskc 1

  In  the  above  example  disk  subsystem  "a"  has  3380D drives,
  subsystem "b" has 3380E drives and subsystem "c" has 451 drives.

  This implementation of subvolumes also impacts BCE.  The response
  to find_rpv_substem_ at boot time is:

|     [cold | rpv] a16 ipc [3380 | 3390] 0{a b c}


  FIPS Disk Support                                      MTB-731-01

  A new module, disk_name_pvtx, can  be used by hardcore modules to |
  parse  the disk_name  and obtain  the PVT  index for  this device |
  name.                                                             |

  IOI AND RCP

  The user  IO interface to these  FIPS devices will be  similar to
  the MSU501 device,  and will still have the  similar problem that
  is  encountered with the  MSU501.  The problem  on MSU501 is  the
  device that the  user requests has a "buddy"  device.  This buddy
  device usage must  also be set for IO, if not  the file system IO
  will conflict with the user IO.  With the IBM devices there is no
  hardware  protection  of  subvolumes  boundaries.   When  a  user
  requests an  IBM drive RCP will  attach the entire device  to the
  user as is done with any  other disk device.  This requires there
  be no mounted physical volumes  on the requested device.  RCP and
  IOI  data bases  will only  know about  the device  as a complete
  entity.

  The  exception to  this rule  is device  authentication.  If  the
  device  is divided  into subvolumes  it may  contain up  to three
  physical volumes.  There is no  restriction that all the physical
  volumes be part of the same  logical volume.  They may have never
  been  registered nor  initialized by  the init_vol  command.  The
  authentication requirements  of the subvolume labels  on a device
  may not  be the same.  The  procedure rcp_disk_ must try  to read
  all the labels on the device.   The number of labels can be found
  by device type.   The authentication of the device  must be based
  on what  type of labels were  found.  That is, if  any one of the
  labels read  indicated a system  storage pack then  "ss" would be
  the required  authentication code.  There  will be a  priority to
  the  authentication,  SS  first,   Unregistered  next,  then  IO,
  followed  by  Unreadable.   This  priority  is  enforced  by  the
  procedure rcp_disk_.

  Other  alternatives  were  considered  unacceptable.   One is IOI
  checking  the users  DCW list  to verify  that the  addresses are
  correct  and then  make the  logical conversion.   The difficulty
  lies  in chasing  the transfer  DCWS and  in the  user ability to
  modify the  list after the IO  is started.  This still  would not
  eliminate the  conflict with the file system  IO.  Another method
  would be to rewrite IOI to interface with the disk dims to do the
  IO.  This would be a major  undertaking, increase the size of the
  ring_0 code, and would place  major restrictions on what the user
  may do.  The end result would be less than cost effective for the
  amount of user IO done to disk.


  MTB-731-01                                     FIPS Disk Support

  VOLUME RELOADER AND RDISK_

  Volume  reloading is  probably the  largest use  of "user  IO" to
  disk.  The same types of IO are done as for the file system, page
  and VTOC  reads and writes.   The volume reloader  data bases are
  related to physical volumes.  The device interface module used is
  rdisk_.  The module rdisk_ attaches the entire device by calls to
  RCP  and  issues  IO  through  IOI.   With  the  introduction  of
  subvolumes, a physical volume no longer defines an entire device,
  but  rather  a  portion  of  the  device.   This new relationship
  between physical  volumes and devices require  address conversion
  best performed by  rdisk_.  The change for the  seek command will
  also be placed in rdisk_.

  The   volume   reloader   uses   the   undocumented   opening  of
  stream_input_output.   Volume  reloader   calculates  the  sector
  address and then converts to  character position for the position
  call,  the  volume  reloader  must  know  that  the  device to be
  reloaded is an  IBM device.  The calculations must  be made based
  on  the values  defined by   the include  files fs_dev_types  and
  disk_pack.  This will allow the 512 word seeks to work correctly.

  With more devices having  non-removable media, the desired device
  must be  assigned before the  physical volume is  reloaded.  With
  the addition  of subvolumes, the correct portion  of the assigned
  device  must be  indicated.  There  is an  undocumented option in
  rdisk_  that  allows  the  selection  of  a  device.  This is the
  -device attachment argument, the format is:  -device device_name.
  The device_name may include the subvolume, which will trigger the
  subvolume  address  conversion  function  within  rdisk_.  If the
  subvolume  name  is  not  given  then  the  entire  device can be
  accessed.   In either  case the  entire device  will be attached.
  The -device attachment argument will be documented.

  The volume reloader can reload more that one physical volume at a
  time.  In the  case where two of the physical  volumes are on the
  same device, rdisk_ will keep track of the devices and subvolumes
  attached.   Rdisk_ will  maintain a  perprocess table  of devices
  attached.  This table will contain the device name and IO control
  block pointer for the attachment.   Rdisk_ will attach the device
  via RCP, if the device is not  found in the table, and detach via
  RCP when it  is the only device found.   This multiple attachment
  will only  be allowed for  subvolumes.  It will  be considered an
  error  if the  device is  attached without  a subvolume  name and
  another is requested with a subvolume name.

  These changes make the volume reloader more device dependent than
  it has previously  been.  This requires not only  the "pvname" be
  specified  by the  user but  also the  device name  that is to be
  reloaded.   This will  change the  user interface  to the  volume
  reloader.  A new argument to volume reloader will be added.  This


  FIPS Disk Support                                      MTB-731-01

  will be  -pvname_device (-pvdv) whose  parameters will be  a list
  ordered pairs, first the pvname and then the device name.

  Example:
      -pvdv pub01 dska_17c pub02 dskb_00a

  As with  most other changes  there is always  another design that
  may work.   Because the Volume  Reloader only issues  file system
  type IO, a ring_0 interface to the disk dim could be built.  This
  would  require  the  expansion  of  ring_0,  another  wired space
  manager, additional gates to verify, and more.  This expansion of
  ring_0 makes this alternative undesirable.

  PROTOTYPE SOFTWARE RESULTS

  The prototype software  was written for the 512  word seek change
  first.  The base software was the dipper modified MR11 code using
  the 3380s without subvolumes at  85% capacity.  This software was
  debugged  and tested  on system  MD running  an all  root system.
  Tests were  run using a subset  of MHAT to load  the system and a
  modified disk_meters to measure the  impact of the change.  These
  tests  showed  a  decrease  in  the  average  page read and write
  channel time  of about 15% from  test runs using 64  word IO.  It
  was observed that the average  channel time for the hardware VTOC
  read-alter-rewrite was 5% longer than the sum of the average VTOC
  write and VTOC read with the  new software.  However it does cost
  in cpu time to do the one extra IO.

  The  second step  was to  change the  512 word  IO system  to use
  subvolumes.  Tests were run on  an all root system.  These tested
  verified that the scavenger, sweep_pv  and salvager all worked as
  well as the MHAT subset.

  The  next step was  to build a  three logical volume  system that
  included  451 drives.  The  3380s contained two  logical volumes.
  The root  logical volume was placed  on all the B  subvolumes and
  the A subvolumes  made up the logical volume IBM1.   The four 451
  drives made  up the DSU logical volume.   Master directories were
  created  on  each  one  of  the  logical  volumes.   These  three
  directories  were at  the project  level, and  were identical  in
  content (a subset of MHAT).  The  MHAT tests were run to show the
  functionality of the subvolume concept.

  Comprehensive tests  were run to  compare the performance  of the |
  "dipper software" to the subvolume software.  The dipper software |
  issues  64 word  IO and  does  not  divide the  IBM devices  into |
  subvolumes.  The standard measurement scripts  were run on an all |
  root MSU3380 system with and without subvolumes.  These test were |
  run on the same physical  devices.  While there was no difference |
  in  elapsed  time  the  disk  meters  showed  the  difference  in |
  performance.                                                      |


  MTB-731-01                                     FIPS Disk Support

| The average seek  distance for the subvolume set  was 30% greater
| than  the non-subvolume  set.  However  the channel  time for the
| subvolume set was  4% less than the non-subvolume  set.  This set
| of scripts favored the non-subvolume set, due to a low percentage
| of vtoc writes, less that 3%.

| The functions of the salvager, scavenger, and sweep_pv where also
| tested  and showed  that they  performed correctly.   During this
| test it was noticed that init_scavenger data made calculations on
| the  largest device  size in  fs_dev_types.  This  was changed to
| look at the pvt to find the largest configured device.

| The IOI and RCP functions were  tested by using the volume dumper
| and  volume reloader.   This showed  that rcp_disk_  was a better
| place  to enforce  the authentication   of a  device rather  than
| rcp_authenticate_device_.

  DETAIL SOFTWARE CHANGES

  Multics  Design Document changes  and functional testing  will be
  planned in the future.

  New include file

  fs_dev_types_sector
     Add  the per  device array   constants for  the new  sector
     related data.   This will be  used by programs  that do not
     use disk_pack.incl.pl1 and fs_dev_types.

| Include file changes

  config_deck_cards
     This changes the -drive field  from OCTAL to STRING for the
     root and part cards.  This  will allow the subvolume on the
     end of the device name.

  config_part_card
     Changes the drive field to char (4) from fixed bin.

  config_root_card
     Changes the drive field to char (4) from fixed bin.

  disk_pack
     Change     the      constants     SECTORS_PER_VTOCE     and
     VTOCES_PER_RECORD to device dependent array constants.


  FIPS Disk Support                                      MTB-731-01

  disk_table
     Add to the dte the same things as the pvte (See pvte below)
     except for the record  information.  The drive_name will be
     8 characters long for a drive that has subvolumes.

  fs_dev_types
   o Add the values for the  3380D (device_type 8) and the 3380E
     (device_type 9) to the current arrays.
   o Add    new    arrays    rec_per_sv,    number_of_sv,    and
     valid_sv_array.
   o Include fs_dev_types_sector.

  fs_vol_label
     Add  data to  the label  indicating that  this volume  is a
     subvolume  and which  subvolume it  is, as  well as  of the
     number of subvolumes on this device.  This information will
     be used mainly for displaying the label.

  get_vol_list                                                      |
     Add  the subvolume  information for  the physical  volumes.    |
     This info is displayed by disk_meters.                         |

  pvte
   o Add  is_sv, a  bit to   indicate that  this pvte  defines a
     subvolume of a device.
   o Add sv_num, indicating what  subvolume this.  The value may
     be 0 or 1 for a 3380D, and 0 to 2 for a 3380E.
   o Add number_of_sv, the number  of subvolumes for the device.
     If the  device is a 3380D it  will be 2 and for  a 3380E it
     will be 3.
   o Add  record_per_cyl, used in  the conversion of  logical to
     real device addresses.
   o Add  record_factor, a  factor used  to convert  the logical
     record  number for  this  subvolume  to real  device record
     number and is calculated by rec_per_cyl * sv_num.
   o Add  sv_name,  the  alpha   character  for  this  subvolume
     appended to the device name for use in error messages.

  vtoc_buffer


  MTB-731-01                                     FIPS Disk Support

|    Add the meter for the read-alter-rewrite.

| Hardcore code changes

| error_table_
|    Add :
|       auth_incorrect "Incorrect authentication code."
|       auth_unknown "Unknown authentication code."
|       subvol_needed "Subvolume needed for this type device."
|       subvol_invalid "Subvolume is invalid for this device."

| BOUND_BCE_DUMP_

| bce_create_sstnt
|    Change to  use the pvte  device type for  indexing into the
|    VTOCES_PER_RECORD array for  calculation of vtoc_record_num
|    and vtoc_offset.

| bce_dump
|    Changes      to      support       the      calling      of
|    find_partition$given_drive.

| BOUND_BCE_PAGED

  bce_appending_simulation
     Change   to  check   the  record   number  for   subvolumes
|    (rec_per_sv) instead of device (rec_per_dev).

| bce_display_disk_label
|    Change  to  display  the  label  correctly  for drives with
|    subvolumes.  Also call disk_name_pvtx to find the pvtx from
|    the disk name.

| bce_test_disk_.pl1
|    Change  to  find  the  pvtx  for  the  disk name by calling
|    disk_name_pvtx

  BOUND_BCE_WIRED

  bootload_disk_io
     Change to use the  new include file fs_dev_types_sector and
     the pvte device type to calculate the number of sectors.


  FIPS Disk Support                                      MTB-731-01

  BOUND_BOOTLOAD_0

  bootload_info (sys_boot_info)
     Change to indicate that the RPV  is on a subvolume and what
     subvolume it is on.                                            |

  BOUND_BCE_PROBE_                                                  |

  bce_probe                                                         |
     Change  to  find  the  pvtx  for  the  disk name by calling    |
     disk_name_pvtx.                                                |

  BOUND_DISK_UTIL_1                                                 |

  bound_disk_util_.bind                                             |
     Add disk_name_pvtx                                             |

  disk_name_pvtx                                                    |
     This  is a new  routine that will  parse the disk  name and    |
     return the pvtx index.  It  knows about subvolumes and will    |
     return the new error codes.                                    |

  find_partition
     Change  to  uses  the  new  part  card.   The  entry  point
     given_drive changes the drive number  from a fixed bin to a
     char   (4),  allowing    subvolume  support.    Also  calls    |
     disk_name_pvtx to find the pvtx for the disk name.             |

  BOUND_DISK_UTIL_2                                                 |

  accept_fs_disk
     Change to  print the correct device name  with subvolume in
     messages.                                                      |

  demount_pv                                                        |
     Changed to display the subvolume name.                         |


  MTB-731-01                                     FIPS Disk Support

| BOUND_HC_BACKUP

| hc_dmpr_primitives
|    Change  to  read  the  correct  number  of  vtocs per page,
|    depending on the device type.

  BOUND_LIBRARY_1_

  cv_config_card_
     Change to special case the  conversion of the root and part
     cards for the new format.

  fill_vol_extents_
     The  calculations of  the number  of pages  and vtoces will
     change to use  the per device values.  A  new argument must
     be  added to  the  entry  fill_vol_extents_ for  the device
     type.

  init_vol_header_
     Change to  add the device  type argument used  in vtoc_size
     calculations.

  BOUND_MDXHDX_

  disk_table_
     This  program  will  need   minor  changes  to  handle  the
     subvolume entries correctly.

  disk_rebuild_caller, init_disk_pack_
     Change    the    calling     of    fill_vol_extents_    and
     init_vol_header_ to  include the device type  obtained from
     the disk_table or pvte.  This program will correctly set up
     the new label.

  mdx
     Change to fill in the new information into the dte from the
     pvte.

  BOUND_MULTICS_BCE_

  display_disk_label_
     Change  to  display  the  label  correctly  for drives with
     subvolumes.


  FIPS Disk Support                                      MTB-731-01

  BOUND_PAGE_CONTROL

  dctl, disk_control
     These programs use the record number and sector offset into
     the record.  The record number passed to them is considered
     a  subvolume  record  number  or  logical  devadd.  This is
     converted  to  a  real  devadd  or  record  number  by  the
     algorithm.  The  sector address is calculated  depending on
     the seek type found in the channel table of disk_seg.

  page_error
     Change to  print the subvolume  name along with  the device
     number.

  BOUND_RCP_

  rcp_authenticate_device_
     Changed to check that  the correct authentication was given
     for  the  disk  device.   If  not  the  new  error codes of
     auth_incorrect or auth_unknown may be returned.

  rcp_disk_
     Change the seek command to be based on the device type.  If
     the device has subvolumes, all the labels must be read.

  BOUND_SALVAGER

  disk_rebuild
     Change  to  use  the  pvte  device  type  to index into the
     VTOCES_PER_RECORD array to calculate n_vtoce.

  salvage_pv
     Change to display the subvolume name.

  vm_vio
     Change use the the device type from the pvte to index to to
     the  new arrays  in fs_dev_types  to calculate  the correct
     vtoc address.

  BOUND_SCAVENGER

  scavenger
     Change to print the device  name including the subvolume if
     required.


  MTB-731-01                                     FIPS Disk Support

  BOUND_SEGMENT_CONTROL

  activate, alm_syserr_caller
     Changes  in  the  module  are  to  print  the  device  name
     including the subvolume if required.

  BOUND_TEMP_1

  create_rpv_partition
     Change need to use the pvte to find the device type for the
     calculations for VTOCES_PER_RECORD.

  disk_init
     Change to set chantab.scdcw.command  in disk_seg to seek_64
     or  seek_512,  depending  on  the  device  type the channel
     supports.  This is extracted from fs_dev_types seek_command
     (device_type).

  find_rpv_subsystem
     Change to handle an RPV on a subvolume.

  get_io_segs
     Change  to use  the disk  device type  when setting  up the
     various  hardcore data  base segment  sizes for  subvolumes
     support.

  init_early_config
     Change to support the new style root and part cards.

  init_empty_root
     Change    the    calling     of    fill_vol_extents_    and
     init_vol_header_ to pass the the device type taken from the
     pvte.

  init_partitions
     Change  to use  the new  format of  the part  card for  the
     support of subvolumes.

  init_pvt
     Change to fill  in the new values for  subvolume support in
     the  pvte.   If  the  pvte  is  for  a device that contains
     subvolumes, page$init is call only for the primary pvte.

  init_root_vols
     Change to support root physical volumes on subvolumes.

  init_toehold
     seek_512 depending on  the RPV device type.  If  the RPV is
     on  a device divided  into subvolumes the  correct cylinder


  FIPS Disk Support                                      MTB-731-01

     addresses  for the RPV  are calculated.  This  is extracted
     from fs_dev_types seek_command (device_type).

  BOUND_TEMP_2

  accept_rpv
     Changes to print the device name including the subvolume if
     required.

  init_scavenger_data
     Change  to  calculate  the   number  of  records  based  on
     rec_per_sv instead of rec_per_dev.   This also changes form
     the max size in fs_dev_types to the max size for the device
     configured.

  BOUND_VOLUME_RLDR_UT_

  rdisk_
     Change to  issue 512_word seeks  to 3380 nad  3390 devices,
     and allow multiple attachments for subvolumes.

  BOUND_VOLUME_RELOADER_

  reloader
     Change to uses the sector values in fs_dev_types_sector.

  rldr_arg_reader_
     Change to parse the  new argument -pvname_device, and place
     the information in rldr_data_.

  rldr_output_
     Change to use the new  values in fs_dev_types and disk_pack
     to calculate the sector addresses.

  rldr_vtoc_header_
     Change to use the new  values in fs_dev_types and disk_pack
     to calculate the sector addresses.

  rldr_label_
     Change to use the new  values in fs_dev_types and disk_pack
     to calculate the sector addresses.

  rldr_volume_map_
     Change to use the new  values in fs_dev_types and disk_pack
     to calculate the sector addresses.


  MTB-731-01                                     FIPS Disk Support

  BOUND_VTOC_MAN

  vtoc_man
     Change involves a small philosophical difference as well as
     the  calculation of  the correct  record number  and sector
     offset.  A  software RAR must  be performed when  writing a
     partial vtocs to a 3380 or 3390 device.  When this is found
     a check should be made to see  if the vtoce is in a buffer,
     if not then it must be  read.  The parts to be written will
|    be copied to the vtoce in the buffer and written.

| Tools code changes

  BOUND_ADMIN_RTNES_

  authenticate_device
     Change   to   handle   the   two   new   error  codes  from
     rcp_authenticate_device_.

  BOUND_HC_DISPLAY_

  display_disk_label
     Change  to  display  the  label  correctly  for drives with
     subvolumes.

  BOUND_IO_TOOLS_

  exercise_disk
|    Change to issue 512 word seeks for subvolume devices.

| BOUND_METER_UTIL_

| get_vol_list_
|    Change to obtain the  subvolume information from disk_table
|    for display by disk_meters.


  FIPS Disk Support                                      MTB-731-01

  BOUND_METERING_CMDS_                                              |

  disk_meters                                                       |
     Change  to  display  the  volume  information  for  all the    |
     physical   volumes  on   devices  that   are  divided  into    |
     subvolumes.                                                    |

  vtoc_buffer_meters
     Change to print the software read-alter-rewrite meter.

  BOUND_PRIV_SS_

  record_to_vtocx
     Change  to  use  the  new  values  in  fs_dev_types for the
     sectors per record instead of the value 16.

  vtocx_to_record
     Change to  use the new  values in fs_dev_types  and the new
     arrays in disk_pack.incl.pl1.