Ar$ DISKM010.AP DISKM010.ABACKUP/NOASSIST/NODISMOUNT/COMMENT=VAX/VMS SPKITBLD Procedure/INTER/LOG/VERIFY $1$DIA2:[DISK.A]*.*; $1$DIA2:[DISK]DISKM010.A/LABEL=(DISKM)/SAVE/BLOCK=9000/GROUP=25VAX/VMS SPKITBLD Procedure BUCKLEY QE(<^V6.1 _DEWEY::  _$1$DIA2: V6.1 $I*[DISK.A]DISKM010_IG.PS;5+, .</ 4<7- 0123KPWO=5/6X 76'<^89GHJ %!PS-Adobe-2.1 %%Creator: DECwrite V1.1 %%+Copyright (c) 1990 DIGITAL EQUIPMENT CORPORATION. %%+All Rights Reserved. %%DocumentFonts: (atend) %%EndComments %%BeginProcSet DEC_WRITE 1.06 /DEC_WRITE_dict 150 dict def DEC_WRITE_dict begin/$D save def/$I 0 def/$S 0 def/$C matrix def/$R matrix def/$L matrix def/$E matrix def/pat1{/px exch def/pa 8 array def 0 1 7{/py exch def/pw 4 string def 0 1 3{pw exch px py 1 getinterval putinterval}for pa py pw put}for}def/pat2{/pi exch def/cflag exch def save cflag 1 eq{eoclip}{clip}ifelse newpath{clippath pathbbox}stopped not{/ph exch def/pw exch def/py exch def/px exch def/px px 3072 div floor 3072 mul def/py py 3072 div floor 3072 mul def px py translate/pw pw px sub 3072 div floor 1 add cvi def/ph ph py sub 3072 div floor 1 add cvi def pw 3072 mul ph 3072 mul scale/pw pw 32 mul def/ph ph 32 mul def/px 0 def/py 0 def pw ph pi[pw 0 0 ph 0 0]{pa py get/px px 32 add def px pw ge{/px 0 def/py py 1 add 8 mod def}if}pi type/booleantype eq{imagemask}{image}ifelse}if restore}def/PS{/_op exch def/_np 8 string def 0 1 7{/_ii exch def/num _op _ii get def _np 7 _ii sub num -4 bitshift PX num 15 and 4 bitshift -4 bitshift PX 4 bitshift or put}for _np}def/PX{[15 7 11 3 13 5 9 1 14 6 10 2 12 4 8 0]exch get}def/FR{0.7200 0 $E defaultmatrix dtransform/yres exch def/xres exch def xres dup mul yres dup mul add sqrt}def/SU{/_sf exch def/_sa exch def/_cs exch def/_mm $C currentmatrix def/rm _sa $R rotate def/sm _cs dup $L scale def sm rm _mm _mm concatmatrix _mm concatmatrix pop 1 0 _mm dtransform/y1 exch def/x1 exch def/_vl x1 dup mul y1 dup mul add sqrt def/_fq FR _vl div def/_na y1 x1 atan def _mm 2 get _mm 1 get mul _mm 0 get _mm 3 get mul sub 0 gt{{neg}/_sf load concatprocs/_sf exch def}if _fq _na/_sf load setscreen}def/BO{/_yb exch def/_xb exch def/_bv _bs _yb _bw mul _xb 8 idiv add get def/_mk 1 7 _xb 8 mod sub bitshift def _bv _mk and 0 ne $I 1 eq xor}def/BF{DEC_WRITE_dict begin/_yy exch def/_xx exch def/_xi _xx 1 add 2 div _bp mul cvi def/_yi _yy 1 add 2 div _bp mul cvi def _xi _yi BO{/_nb _nb 1 add def 1}{/_fb _fb 1 add def 0}ifelse end}def/setpattern{/_cz exch def/_bw exch def/_bp exch def/_bs exch PS def/_nb 0 def/_fb 0 def _cz 0/BF load SU{}settransfer _fb _fb _nb add div setgray/$S 1 def}def/invertpattern{$S 0 eq{{1 exch sub}currenttransfer concatprocs settransfer}if}def/invertscreen{/$I 1 def/$S 0 def}def/revertscreen{/$I 0 def}def/setrect{/$h exch def/$w exch def/$y exch def/$x exch def newpath $x $y moveto $w $x add $y lineto $w $x add $h $y add lineto $x $h $y add lineto closepath}def/concatprocs{/_p2 exch cvlit def/_p1 exch cvlit def/_pn _p1 length _p2 length add array def _pn 0 _p1 putinterval _pn _p1 length _p2 putinterval _pn cvx}def/OF/findfont load def/findfont{dup DEC_WRITE_dict exch known{DEC_WRITE_dict exch get}if DEC_WRITE_dict/OF get exec}def mark/ISOLatin1Encoding 8#000 1 8#001{StandardEncoding exch get}for /emdash/endash 8#004 1 8#025{StandardEncoding exch get}for /quotedblleft/quotedblright 8#030 1 8#054{StandardEncoding exch get}for /minus 8#056 1 8#217 {StandardEncoding exch get}for/dotlessi 8#301 1 8#317{StandardEncoding exch get}for/space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered /macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph /periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter /onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde /Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave /Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde /Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave /uacute/ucircumflex/udieresis/yacute/thorn/ydieresis 256 array astore def cleartomark /encodefont{findfont dup maxlength dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding exch def dup/FontName exch def currentdict definefont end}def/loads{/$/ISOLatin1Encoding load def/&/encodefont load def/*/invertpattern load def/+/revertscreen load def/-/invertscreen load def/:/concatprocs load def/^/setpattern load def/~/pat1 load def/_/pat2 load def/@/setrect load def/A/arcn load def/B/ashow load def/C/curveto load def/D/def load def/E/eofill load def/F/findfont load def/G/setgray load def/H/closepath load def/I/clip load def/K/kshow load def/L/lineto load def/M/moveto load def/N/newpath load def/O/rotate load def/P/pop load def/R/grestore load def/S/gsave load def/T/translate load def/U/sub load def/V/div load def/W/widthshow load def/X/exch load def/Y/awidthshow load def/a/save load def/c/setlinecap load def/d/setdash load def/e/restore load def/f/setfont load def/g/initclip load def/h/show load def/i/setmiterlimit load def/j/setlinejoin load def/k/stroke load def/l/rlineto load def/m/rmoveto load def/n/currentfont load def/o/scalefont load def/p/currentpoint load def/r/currenttransfer load def/s/scale load def/t/setmatrix load def/u/settransfer load def/w/setlinewidth load def/x/matrix load def/y/currentmatrix load def}def end %%EndProcSet %%EndProlog %%BeginSetup DEC_WRITE_dict begin loads version cvi 23.0 gt { currentdict {dup type /arraytype eq {bind def} {pop pop} ifelse} forall} if 0.0100 0.0100 s %%EndSetup %%Page: 1 1 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide Page ) h (1) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1200 M 300 -3200 M 300 -5200 M 23400 -7200 M 9518 -8600 M /Times-Roman-ISOLatin1 F 1200 o f (PACKAGED APPLICATION SOFTWARE SOLUTION) h 23400 -11050 M 300 -13050 M 15500 -15650 M n 1.500 o f (DECdiskmanagement) h 300 -18250 M 300 -20850 M 13075 -23450 M (Disk and File Fragmentation) h 300 -25450 M ( ) h 12276 -28050 M (Detection and Reporting Tools) h 300 -30050 M 300 -32650 M 6060 -32650 M 11820 -32650 M 17580 -32650 M (Installation Guide) h 34860 -32650 M 300 -34800 M 23400 -36200 M 12832 -37600 M n 0.667 o f (VERSION 1.0 ) h (SEPTEMBER, 1992) h 300 -39000 M -7200 7200 T R showpage $P e %%Page: 2 2 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide Page ) h (2) h -7200 74700 T R R S 7200 -7200 T N 0 G 15799 -1650 M /Helvetica-Bold-ISOLatin1 $ /Helvetica-Bold & P /Helvetica-Bold-ISOLatin1 F 1800 o f (Table of Contents) h 300 -6200 M 1308 -6200 M /Times-Roman-ISOLatin1 F 1200 o f (Preface) h 5306 -6200 M 5700 -6200 M (..............................................................................................................................) h 43692 -6200 M (3) h 300 -9800 M 1308 -9800 M (Preparing for Installation) h 13773 -9800 M 14100 -9800 M (..................................................................................................) h 43692 -9800 M (5) h 300 -13400 M 1308 -13400 M (Performing the Install) h 12240 -13400 M 12600 -13400 M (.......................................................................................................) h 43692 -13400 M (6) h 300 -17000 M 1308 -17000 M (Post Installation Tasks) h 12575 -17000 M 12900 -17000 M (......................................................................................................) h 43692 -17000 M (8) h 300 -20600 M 1308 -20600 M (Sample Product Install) h 12641 -20600 M 12900 -20600 M (......................................................................................................) h 43692 -20600 M (9) h 300 -24650 M -7200 7200 T R showpage $P e %%Page: 3 3 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide $ DISKM010.A  [DISK.A]DISKM010_IG.PS;5<j;" Page ) h (3) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1650 M /Times-Roman-ISOLatin1 F 1800 o f (Preface) h 5696 -1650 M 300 -4400 M n 0.667 o f (DECdiskmanagement is designed to help System Managers determine the amount of disk and) h 300 -6400 M (file fragmentation on their systems. Excessive disk and file fragmentation can cause severe) h 300 -8400 M (performance problems but in many cases the slow response time and long run times have built) h 300 -10400 M (up over a long period of time so the application users and data center personnel have come to) h 300 -12400 M (expect the poor performance. In many cases a faster CPU is purchased to speed up the ) h 300 -14400 M (application but the performance improvement gained by the CPU investment is minor because) h 300 -16400 M (that was not where the problem was. ) h 300 -18400 M (A recent case involved a file that held the biweekly pay information for a state agency. Each) h 300 -20400 M (week, hours for each employee were added to the indexed file and every two weeks the records) h 300 -22400 M (were read, a paycheck was produced and the record was deleted. Because a deleted RMS record) h 300 -24400 M (is only marked as deleted and not actually removed from the file, this file had grown to 40,000) h 300 -26400 M (blocks over a two year period. Running DECdiskmanagement reports on the disk pointed out) h 300 -28400 M (this file as being badly fragmented so a convert of the file was suggested. ) h 300 -30400 M (In an effort to determine how much the convert would help, a quick benchmark was performed) h 300 -32400 M (prior to the convert and repeated after the convert. The convert reduced the file from 40,000) h 300 -34400 M (blocks to under 400 blocks and the benchmark went from over 11 minutes to under ) h 300 -36400 M (8 SECONDS. Bear in mind that this disk had been defragmented in the previous month so that) h 300 -38400 M (it was not a disk fragmentation problem but a file fragmentation problem. ) h 300 -40400 M (While we can't promise every application this kind of improvement, we can say if SEVERE file) h 300 -42400 M (fragmentation DOES exist on your system the application performance gains realized by ) h 300 -44400 M (correcting the problem can be huge.) h 300 -46400 M 300 -47950 M n 1.167 o f (Intended Audience) h 300 -49550 M 300 -51000 M n 0.857 o f (This manual is directed at the DECdiskmanagement system manager or other individual) h 300 -53000 M (responsible for installing applications on the system\(s\).) h 300 -55000 M 300 -56400 M -7200 7200 T R showpage $P e %%Page: 4 4 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide Page ) h (4) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1350 M /Times-Roman-ISOLatin1 F 1400 o f (Purpose of this Guide) h 300 -3400 M 300 -4800 M n 0.857 o f (This guide describes how to install DECdiskmanagement and consists of the following sections:) h 300 -6200 M 300 -7600 M 6060 -7600 M (Preparing for Installation describes the prerequisites of the software and other tasks) h 300 -9600 M 6060 -9600 M (required prior to the installation.) h 300 -11600 M 300 -13000 M 6060 -13000 M (Performing the install describes the questions specific to DECdiskmanagement) h 300 -15000 M 6060 -15000 M (during the VMSinstal procedure and the valid responses to these questions.) h 300 -17000 M 300 -19000 M 6060 -19000 M (Post Installation Tasks describes tasks required after the Installation is complete.) h 300 -21000 M 300 -23000 M (Refer to the User Guide for detailed information on generating reports and the meaning of ) h 300 -25000 M (report data.) h 300 -27000 M 300 -28550 M n 1.167 o f (Related Documents) h 300 -30150 M 300 -31600 M n 0.857 o f (As the installer, you should be familiar with the following VMS manuals:) h 300 -33600 M 6060 -33600 M (VMS System Manager's Manual) h 300 -35600 M 6060 -35600 M (VMS Authorize Utility Manual) h 300 -39250 M -7200 7200 T R showpage $P e %%Page: 5 5 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide Page ) h (5) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1650 M /Times-Roman-ISOLatin1 F 1800 o f (Preparing for Installation) h 18397 -1650 M 300 -4400 M n 0.667 o f (This section discusses those topics and tasks you need to be aware of prior to installing) h 300 -6400 M (DECdiskmanagement.) h 300 -8400 M 300 -9950 M n 1.167 o f (Software and Hardware Requirements) h 300 -12000 M 300 -13400 M n 0.857 o f (Your computer system must satisfy certain minimum requirements before you can install and) h 300 -15400 M (use DECdiskmanagement. The installer must make sure that these requirements are met.) h 300 -17400 M 300 -18800 M (The Hardware must consist of the following:) h 300 -20200 M 300 -21600 M 6060 -21600 M (Any valid VAX configuration) h 300 -23600 M 300 -25000 M (DECdiskmanagement will function properly only if the following Digital software is installed:) h 300 -27000 M 6060 -27000 M (VAX VMS Version 5.0 to 5.n) h 300 -29000 M 6060 -29000 M (Privileges SYSPRV and/or BYPASS are required to run this software) h 300 -31000 M 300 -32400 M (If DECps or VPA is installed on the system, additional DECdiskmanagement functionality is) h 300 -34400 M (provided. This functionality requires the FORTRAN language interface in SYS$LIBRARY) h 300 -36400 M (for the product installed. If this language library is not found in SYS$LIBRARY, a copy ) h 300 -38400 M (corresponding to the version of DECps/VPA that was used to write DECdiskmanagement will) h 300 -40400 M (be copied to SYS$LIBRARY. This file is only used when using the DECps/VPA callable ) h 300 -42400 M (interface from Fortran.) h 300 -44400 M 300 -45950 M n 1.167 o f (Disk Space Requirements for the Installation Procedure) h 300 -47550 M 300 -49000 M n 0.857 o f (DECdiskmanagement requires under 3000 blocks during the installation. Once the product is) h 300 -51000 M (installed, the application will require a variable amount of space for reports and data files in) h 300 -53000 M (the DISK$MANAGEMENT directory \(normally under 5000 blocks\) and space for programs) h 300 -55000 M (and documentation as follows:) h 300 -57000 M 6060 -57000 M (programs in DISK$MANAGEMENT) h 29100 -57000 M 34860 -57000 M (Under 200 blocks) h 300 -59000 M 6060 -59000 M (Documentation and procedure in SYS$MANAGER) h 34860 -59000 M (Under 1000 blocks) h 300 -61000 M 6060 -61000 M (DECps/VPA definition file if needed in SYS$LIBRARY) h 34860 -61000 M (Under 200 blocks) h 300 -63000 M -7200 7200 T R showpage $P e %%Page: 6 6 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide Page ) h (6) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1200 M 300 -4850 M /Times-Roman-ISOLatin1 F 1800 o f (Performing the Install) h 16099 -4850 M 300 -7600 M n 0.667 o f (To install DECdiskmanagement, you will need this Installation Guide and the DISKM010) h 300 -9600 M (savesets \(A,B,C and D\). These savesets can be on tape or in a directory on one of your disks.) h 300 -11600 M 300 -13000 M (Login to the SYSTEM or a similarly privileged account.) h 300 -15000 M 300 -16400 M (Startup VMSINSTAL using the command $@SYS$UPDATE:VMSINSTAL) h 300 -18400 M 300 -19800 M (Answer YES or to the "are you satisfied with the backup" question.) h 300 -21800 M 300 -23200 M (The distribution volumes question should be answered with either the tape drive unit) h 300 -25200 M (\(MKA500:\) or the disk and directory \($1$DIA0:[SOFTWARE]\) of where the) h 300 -27200 M ( DECdiskmanagement savesets are located.) h 300 -29200 M 300 -30600 M (The products question should be answered DISKM.) h 300 -32600 M (The installation options question should be answered with a .) h 300 -34600 M (After the first saveset \(A\) is restored, the following text is displayed:) h 300 -36600 M 300 -38000 M 157.2 0 32 (This procedure installs the Digital Equipment Corporation Disk Management Asset package.) W 300 -39400 M (This procedure does not do a system\255wide install of the ASSET, but provides a command ) h 300 -40800 M 364.4 0 32 (procedure to allow individual users to use the tools. Executing the command procedure) W 300 -42200 M (\($@SYS$MANAGER:DISK_MANAGEMENT_LOGICALS\) will allow iK$ DISKM010.A  [DISK.A]DISKM010_IG.PS;5<""you to issue the ) h 300 -43600 M 8.8 0 32 (REVIEW_DISK command. See the documentation provided with The Asset or print the on\255line) W 300 -45000 M 971.7 0 32 (postscript file SYS$MANAGER:DISKM010_UG.PS for more information on the) W 300 -46400 M (disk_management tool.) h 300 -48400 M 300 -49800 M (The first DECdiskmanagement specific question is:) h 300 -51200 M 300 -52600 M (* Where do you want to install the kit [VMI$ROOT:[DISK$MANAGEMENT]]: ) h 300 -54000 M 300 -55400 M (This question is asking for a disk and directory to be used to hold the DECdiskmanagement) h 300 -57400 M (programs, files and command procedures. This directory is also the default area for all reports) h 300 -59400 M (and requires between 1000 and 10000 blocks of space depending on the number of disks on) h 300 -61400 M (your system. The default is the system disk but any disk that is mounted system\255wide during) h 300 -63400 M (system startup can be used. If the directory does not exist, it will be created.) h 300 -65400 M -7200 7200 T R showpage $P e %%Page: 7 7 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide Page ) h (7) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 F 1200 o f (The next question is:) h 300 -2600 M 300 -4000 M (* Do you have \(D\)ECps, \(V\)pa or \(N\)either on this system [N]: ) h 300 -6000 M (This question is trying to determine which flavor of the DECdiskmanagement software to) h 300 -8000 M (install. Answering D will install the DECps files, answering V will install the VPA files and) h 300 -10000 M (Answering N or will install the files that do not require DECps or VPA to be installed) h 300 -12000 M (on your system.) h 300 -14000 M 300 -15400 M (The last two questions should be answered YES to verify the installation and to cleanup any) h 300 -17400 M (files replaced by the install.) h 300 -19400 M 300 -20800 M (* Do you want to run the IVP after the installation [YES]? ) h 300 -22200 M (* Do you want to purge files replaced by this installation [YES]? ) h 300 -24200 M 300 -26200 M (At this point all of the questions required for the install have been asked and the install should) h 300 -28200 M (complete within 10 minutes. If you answered YES to the IVP question, the IVP will be) h 300 -30200 M (automatically run after the installation is complete and may require up to 15 minutes depending) h 300 -32200 M (on the size, number of files and the amount of fragmentation on your system disk.) h 300 -34200 M 300 -35600 M (When you see the following message, the installation has completed successfully and you) h 300 -37600 M (should type a ^Z to exit from VMSINSTAL:) h 300 -39600 M 300 -41600 M 6000 -41600 M (Installation of DISKM V1.0 completed at 20:40) h 300 -43600 M 300 -45000 M 300 -48650 M -7200 7200 T R showpage $P e %%Page: 8 8 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide Page ) h (8) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1650 M /Times-Roman-ISOLatin1 F 1800 o f (Post Installation Tasks) h 16601 -1650 M 300 -4400 M 300 -5800 M n 0.667 o f (After the installation of DECdiskmanagement has successfully completed you should add the) h 300 -7800 M (command $@SYS$MANAGER:DISK_MANAGEMENT_LOGICALS to the login.com of ) h 300 -9800 M (users that will be running the DECdiskmanagement reports either interactively or from batch.) h 300 -11800 M 300 -13200 M (If you want reports to run automatically every week, determine a time when a short period of) h 300 -15200 M (heavy disk usage will not impact the system users. If 2am is not a good time, edit the file) h 300 -17200 M (DISK$MANAGEMENT:REVIEW_ALL_DISKS.COM and change the time on the submit) h 300 -19200 M (command from "today+7\25502:00" to the 24 hour time that is best for your system \(if 7pm is ) h 300 -21200 M (better change the command to $SUBMIT/after="today+7\25519:00"\). Submit the command ) h 300 -23200 M (procedure DISK$MANAGEMENT:REVIEW_ALL_DISKS \(from an account having bypass or) h 300 -25200 M (sysprv privilege that also has the command $@DISK_MANAGEMENT_LOGICALS defined) h 300 -27200 M (in its login.com\) to a queue without cpu limits with the qualifier /after=dd\255mmm\255yyyy:hh:mm) h 300 -29200 M (where dd\255mmm\255yyyy:hh:mm describes the date and time that you want the reports to run.) h 300 -31200 M (The day specified will be the day that all future reports will run on unless you change the) h 300 -33200 M ( /after qualifier on the batch job. ) h 300 -35200 M 300 -36600 M (Automatic reports mail to the users listed in the file DISK$MANAGEMENT:DM_MAIL.DIS.) h 300 -38600 M (This file is shipped with just the user SYSTEM. If you want other users to receive the reports ) h 300 -40600 M (or don't want mail sent to the system account, edit this file to add the users one per line.) h 300 -42000 M 300 -43400 M 300 -47050 M -7200 7200 T R showpage $P e %%Page: 9 9 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide Page ) h (9) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1650 M /Times-Roman-ISOLatin1 F 1800 o f (Sample Product Install) h 16700 -1650 M 300 -4400 M n 0.667 o f ( ) h 6060 -4400 M (Welcome to VAX/VMS V5.5\2551 ) h 300 -6400 M (Username: SYSTEM) h 300 -7800 M (Password: ) h 300 -9200 M 6000 -9200 M (Welcome to VAX/VMS V5.5) h 300 -11200 M (Last interactive login on Wednesday, 9\255SEP\2551992 20:03 ) h 300 -12600 M (Last non\255interactive login on Wednesday, 15\255JUL\2551992 19:20 ) h 300 -14600 M ($ @sys$update:vmsinstal) h 300 -16600 M 6000 -16600 M (VAX/VMS Software Product Installation Procedure V5.5\2551) h 300 -18600 M 6000 -18600 M (It is 9\255SEP\2551992 at 20:34.) h 300 -20600 M (Enter a question mark \(?\) at any time for help.) h 300 -22600 M ( * Are you satisfied with the backup of your system disk [YES]? ) h 300 -24000 M ( * Where will the distribution volumes be mounted: $1$DIA0:[DISK]) h 300 -26000 M (Enter the products to be processed from the first distribution volume set.) h 300 -28000 M ( * Products: DISKM ) h 300 -29400 M ( * Enter installation options you wish to use \(none\): ) h 300 -31400 M ( The following products will be processed:) h 300 -33400 M ( DISKM V1.0) h 300 -35400 M 6000 -35400 M (Beginning installation of DISKM V1.0 at 20:35) h 300 -37400 M (%VMSINSTAL\255I\255RESTORE, Restoring product save set A ...) h 300 -39400 M (\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255) h (\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255) h 300 -40800 M 157.2 0 32 (This procedure installs the Digital Equipment Corporation Disk Management Asset package.) W 300 -42200 M (This procedure does not do a system\255wide install of the Asset, but provides a command ) h 300 -43600 M 364.4 0 32 (procedure to allow individual users to use the tools. Executing the command procedure) W 300 -45000 M 304.0 0 32 (\($@sys$manager:disk_management_logicals\) will allow you to issue the REVIEW_DISK) W 300 -46400 M 123.4 0 32 (command. See the documentation provided with The Asset or print the on\255line postscript file) W 300 -47800 M (sys$manager:diskm010_ug.ps for more information on the disk_management tool.) h 300 -49800 M (\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255) h (\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255) h 300 -51800 M (* Where do you want to install the kit [VMI$ROOT:[DISK$MANAGEMENT]]: dia2:[disk]) h 300 -53200 M (* Do you have \(D\)ECps, \(V\)pa or \(N\)either on this system [N]: d ) h 300 -54600 M (* Do you want to run the IVP after the installation [YES]? ) h 300 -56000 M (* Do you want to purge files replaced by this installation [YES]? ) h 300 -58000 M 6000 -58000 M (No more questions will be asked and the install should complete within) h 300 -59400 M 6000 -59400 M (10 minutes.) h 300 -61400 M (%VMwn$ DISKM010.A  [DISK.A]DISKM010_IG.PS;5<! 3SINSTAL\255I\255RESTORE, Restoring product save set B ... ) h 300 -62800 M (%VMSINSTAL\255I\255MOVEFILES, Files will now be moved to their target directories...) h -7200 7200 T R showpage $P e %%Page: 10 10 /$P a D g N 0 79200 T S S 7200 -74700 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Installation Guide Page ) h (10) h -7200 74700 T R R S 7200 -7200 T N 0 G 300 -1200 M /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide ) h 300 -3200 M 6000 -3200 M (Starting the Installation Verification Procedure \(IVP\)) h 300 -5200 M (No node specified, DECPS data will not be included ) h 300 -6600 M (Disk analysis for) h 11700 -6600 M (_$1$DIA0: Logical name VAXVMSRL05 from node ) h 300 -8000 M (Bitmap holes 790 Largest hole 2733 Pct busy 0.00 ) h 300 -9400 M (Disk size 781440 Free space 140637 Pct used 82% ) h 300 -10800 M (# Files) h 6000 -10800 M (7909 Tot # Extent 8403 Blks/file 81) h 300 -12200 M (Error cnt) h 6000 -12200 M (0 Cluster size) h 17400 -12200 M (3 Windows 7) h 300 -13600 M (Ave I/O /sec 0.00 Thruput /sec) h 17400 -13600 M (0 Ave Que 0.00) h 300 -15000 M (1 Files > 1 header 3 Files > 7 extents) h 300 -17000 M 6000 -17000 M (FILE HOTFILES FILE) h 300 -18400 M ([DIRECTORY]FILENAME.EXT) h 17400 -18400 M ( HEADERS NUM I/O EXTENTS SIZE) h 300 -20400 M ([USER]PSPRINT$5431625960716070628.SIX;1) h 28800 -20400 M (2 0 0.0 80 3210) h 300 -21800 M ([SYS0.SYSERR]ERRLOG.SYS;1) h 17400 -21800 M ( 1 0 0.0 42 1581) h 300 -23200 M ([SYSCOMMON.SYSLIB]DCLTABLES.EXE;89) h 28800 -23200 M (1 0 0.0 42 624) h 300 -24600 M 300 -26000 M 6000 -26000 M (Installation of DISKM V1.0 completed at 20:40) h 300 -28000 M (Enter the products to be processed from the next distribution volume set. ) h 300 -29400 M (* Products:) h 300 -30800 M ( ) h 6000 -30800 M (VMSINSTAL procedure done at 20:40) h 300 -32200 M 300 -33638 M -7200 7200 T R showpage $P e $D restore %%Trailer end % DEC_WRITE_dict %%Pages: 10 %%DocumentFonts: Times-Roman-ISOLatin1 %%+ Helvetica-Bold-ISOLatin1 *[DISK.A]DISKM010_UG.PS;8+,./ 4- 0123KPWO567 y'<^89GHJ%!PS-Adobe-2.1 %%Creator: DECwrite V2.1 %%+Copyright (c) 1990 DIGITAL EQUIPMENT CORPORATION. %%+All Rights Reserved. %%DocumentFonts: (atend) %%EndComments %%BeginProcSet DEC_WRITE 1.07 /DEC_WRITE_dict 150 dict def DEC_WRITE_dict begin/$D save def/$I 0 def/$S 0 def/$C matrix def/$R matrix def/$L matrix def/$E matrix def/pat1{/px exch def/pa 8 array def 0 1 7{/py exch def/pw 4 string def 0 1 3{pw exch px py 1 getinterval putinterval}for pa py pw put}for}def/pat2{/pi exch def/cflag exch def save cflag 1 eq{eoclip}{clip}ifelse newpath{clippath pathbbox}stopped not{/ph exch def/pw exch def/py exch def/px exch def/px px 3072 div floor 3072 mul def/py py 3072 div floor 3072 mul def px py translate/pw pw px sub 3072 div floor 1 add cvi def/ph ph py sub 3072 div floor 1 add cvi def pw 3072 mul ph 3072 mul scale/pw pw 32 mul def/ph ph 32 mul def/px 0 def/py 0 def pw ph pi[pw 0 0 ph 0 0]{pa py get/px px 32 add def px pw ge{/px 0 def/py py 1 add 8 mod def}if}pi type/booleantype eq{imagemask}{image}ifelse}if restore}def/PS{/_op exch def/_np 8 string def 0 1 7{/_ii exch def/num _op _ii get def _np 7 _ii sub num -4 bitshift PX num 15 and 4 bitshift -4 bitshift PX 4 bitshift or put}for _np}def/PX{[15 7 11 3 13 5 9 1 14 6 10 2 12 4 8 0]exch get}def/FR{0.7200 0 $E defaultmatrix dtransform/yres exch def/xres exch def xres dup mul yres dup mul add sqrt}def/SU{/_sf exch def/_sa exch def/_cs exch def/_mm $C currentmatrix def/rm _sa $R rotate def/sm _cs dup $L scale def sm rm _mm _mm concatmatrix _mm concatmatrix pop 1 0 _mm dtransform/y1 exch def/x1 exch def/_vl x1 dup mul y1 dup mul add sqrt def/_fq FR _vl div def/_na y1 x1 atan def _mm 2 get _mm 1 get mul _mm 0 get _mm 3 get mul sub 0 gt{{neg}/_sf load concatprocs/_sf exch def}if _fq _na/_sf load setscreen}def/BO{/_yb exch def/_xb exch def/_bv _bs _yb _bw mul _xb 8 idiv add get def/_mk 1 7 _xb 8 mod sub bitshift def _bv _mk and 0 ne $I 1 eq xor}def/BF{DEC_WRITE_dict begin/_yy exch def/_xx exch def/_xi _xx 1 add 2 div _bp mul cvi def/_yi _yy 1 add 2 div _bp mul cvi def _xi _yi BO{/_nb _nb 1 add def 1}{/_fb _fb 1 add def 0}ifelse end}def/setpattern{/_cz exch def/_bw exch def/_bp exch def/_bs exch PS def/_nb 0 def/_fb 0 def _cz 0/BF load SU{}settransfer _fb _fb _nb add div setgray/$S 1 def}def/invertpattern{$S 0 eq{{1 exch sub}currenttransfer concatprocs settransfer}if}def/invertscreen{/$I 1 def/$S 0 def}def/revertscreen{/$I 0 def}def/setrect{/$h exch def/$w exch def/$y exch def/$x exch def newpath $x $y moveto $w $x add $y lineto $w $x add $h $y add lineto $x $h $y add lineto closepath}def/concatprocs{/_p2 exch cvlit def/_p1 exch cvlit def/_pn _p1 length _p2 length add array def _pn 0 _p1 putinterval _pn _p1 length _p2 putinterval _pn cvx}def/OF/findfont load def/findfont{dup DEC_WRITE_dict exch known{DEC_WRITE_dict exch get}if DEC_WRITE_dict/OF get exec}def mark/ISOLatin1Encoding 8#000 1 8#001{StandardEncoding exch get}for /emdash/endash 8#004 1 8#025{StandardEncoding exch get}for /quotedblleft/quotedblright 8#030 1 8#054{StandardEncoding exch get}for /minus 8#056 1 8#217 {StandardEncoding exch get}for/dotlessi 8#301 1 8#317{StandardEncoding exch get}for/space/exclamdown/cent/sterling/currency/yen/brokenbar/section /dieresis/copyright/ordfeminine/guillemotleft/logicalnot/hyphen/registered /macron/degree/plusminus/twosuperior/threesuperior/acute/mu/paragraph /periodcentered/cedilla/onesuperior/ordmasculine/guillemotright/onequarter /onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde /Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave /Iacute/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde /Odieresis/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn /germandbls/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla /egrave/eacute/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis /eth/ntilde/ograve/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave /uacute/ucircumflex/udieresis/yacute/thorn/ydieresis 256 array astore def cleartomark /encodefont{findfont dup maxlength dict begin{1 index/FID ne{def}{pop pop}ifelse}forall/Encoding exch def dup/FontName exch def currentdict definefont end}def/loads{/$/ISOLatin1Encoding load def/&/encodefont load def/*/invertpattern load def/+/revertscreen load def/-/invertscreen load def/:/concatprocs load def/^/setpattern load def/~/pat1 load def/_/pat2 load def/@/setrect load def/A/arcn load def/B/ashow load def/C/curveto load def/D/def load def/E/eofill load def/F/findfont load def/G/setgray load def/H/closepath load def/I/clip load def/J/fill load def/K/kshow load def/L/lineto load def/M/moveto load def/N/newpath load def/O/rotate load def/P/pop load def/R/grestore load def/S/gsave load def/T/translate load def/U/sub load def/V/div load def/W/widthshow load def/X/exch load def/Y/awidthshow load def/a/save load def/c/setlinecap load def/d/setdash load def/e/restore load def/f/setfont load def/g/initclip load def/h/show load def/i/setmiterlimit load def/j/setlinejoin load def/k/stroke load def/l/rlineto load def/m/rmoveto load def/n/currentfont load def/o/scalefont load def/p/currentpoint load def/q/setrgbcolor load def/r/currenttransfer load def/s/scale load def/t/setmatrix load def/u/settransfer load def/w/setlinewidth load def/x/matrix load def/y/currentmatrix load def}def end %%EndProcSet %%EndProlog %%BeginSetup DEC_WRITE_dict begin loads version cvi 23.0 gt { currentdict {dup type /arraytype eq {bind def} {pop pop} ifelse} forall} if 0.0100 0.0100 s %%EndSetup %%Page: 1 1 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M 288 -3188 M 288 -5188 M 23400 -7188 M 9518 +MJ$ DISKM010.A [DISK.A]DISKM010_UG.PS;8O" -8588 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (PACKAGED APPLICATION SOFTWARE SOLUTION) h 23400 -11038 M 288 -13038 M 15500 -15638 M n 1.500 o f (DECdiskmanagement) h 288 -18238 M 288 -20838 M 13075 -23438 M (Disk and File Fragmentation) h 288 -25438 M ( ) h 12276 -28038 M (Detection and Reporting Tools) h 288 -30038 M 288 -32638 M 6048 -32638 M 11808 -32638 M 17568 -32638 M (Users Guide) h 29088 -32638 M 288 -34788 M 23400 -36188 M 12833 -37588 M n 0.667 o f (VERSION 1.0 SEPTEMBER, 1992) h 288 -38988 M 288 -40988 M ( ) h -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M 288 -4026 M -7095 73629 T showpage $P e %%Page: 2 2 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 15799 -1638 M /Helvetica-Bold-ISOLatin1 $ /Helvetica-Bold & P /Helvetica-Bold-ISOLatin1 F 1800 o f (Table of Contents) h 288 -6188 M 1296 -6188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (Introduction) h 7629 -6188 M 7800 -6188 M (.......................................................................................................................) h 43680 -6188 M (3) h 288 -9788 M 1296 -9788 M (What are Disk and File Fragmentation?) h 20660 -9788 M 21000 -9788 M (...........................................................................) h 43680 -9788 M (4) h 288 -13388 M 1296 -13388 M (How to remove Disk and File Fragmentation.) h 23528 -13388 M 23700 -13388 M (..................................................................) h 43680 -13388 M (7) h 288 -16988 M 1296 -16988 M (Producing Reports.) h 10962 -16988 M 11100 -16988 M (............................................................................................................) h 43680 -16988 M (9) h 288 -20588 M 1296 -20588 M (Customizing Reports.) h 12164 -20588 M 12300 -20588 M (......................................................................................................) h 43080 -20588 M (11) h 288 -24188 M 1296 -24188 M (History File Descriptions.) h 14129 -24188 M 14400 -24188 M (...............................................................................................) h 43080 -24188 M (13) h 288 -27788 M 1296 -27788 M (.FRAG Reports) h 9230 -27788 M 9600 -27788 M (...............................................................................................................) h 43080 -27788 M (15) h 288 -31388 M 1296 -31388 M (Frag_summary.rpt Example) h 15161 -31388 M 15300 -31388 M (............................................................................................) h 43080 -31388 M (17) h 288 -34988 M 1296 -34988 M (Frag_summary.sum Example) h 15828 -34988 M 16200 -34988 M (.........................................................................................) h 43080 -34988 M (19) h 288 -38588 M 1296 -38588 M (Weekly_hot_files.rpt Example) h 16427 -38588 M 16800 -38588 M (.......................................................................................) h 43080 -38588 M (20) h -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 3 3 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (Introduction) h 9187 -1638 M 288 -4388 M n 0.667 o f (Many production Data Centers experience processing delays due to disk and file fragmentation.) h 288 -6388 M (Disk fragmentation is the breaking up of the free space on a disk into small pieces due to) h 288 -8388 M (many file creations and deletions. It is accelerated when the total free space on a disk is) h 288 -10388 M (small. File fragmentation exists when files are not physically or logically contiguous) h 288 -12388 M (and can be accelerated when files are created or extended on a fragmented disk. ) h 288 -14388 M 288 -16388 M (In most cases, fine tuning a VAX\255VMS computer will result in at most a 5 \255 10% performance) h 288 -18388 M (gain unless system parameters were seriously in error. Removing serious file fragmentation) h 288 -20388 M (can improve application performance by orders of magnitude while consuming less CPU time.) h 288 -22388 M 288 -24388 M (The disk and file fragmentation detection tools in this package are designed to show the degree) h 288 -26388 M (of fragmentation for disks and files on your system so that you can concentrate your efforts) h 288 -28388 M (where it will do the most good. Of special importance are badly fragmented files that are ) h 288 -30388 M (heavily used. The effects of file fragmentation impact performance and the removal of the) h 288 -32388 M (fragmentation will give the most noticeable improvement. ) h 288 -34388 M 288 -35788 M (If the VAXcluster Performance Advisor \(VPA\) or DEC performance solution \(DECps\) is ) h 288 -37788 M (installed on your system, hot file information is included in the disk fragmentation reports plus) h 288 -39788 M (an additional report on weekly hot files and their fragmentation is produced. Also included in) h 288 -41788 M (the report is a list of files larger than the logical BIGFILE_SIZE \(default = 50,000\) as an aid in) h 288 -43788 M (finding large files that can be deleted to save disk space.) h 288 -45188 M 288 -47188 M (These tools do not remove disk or file fragmentation, but are designed to work in a production) h 288 -49188 M (Data Center environment to monitor and report on fragmentation so that standardized) h 288 -51188 M (Data Center procedures can be used to remove the fragmentation.) h 288 -54838 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide Page ) h (3 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 4 4 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (What are Disk and File Fragmentation?) h 28733 -1638 M 288 -4388 M n 0.667 o f (Disk fragmentation is the deterioration of a few large blocks of free space on a newly initialized) h 288 -6388 M (disk into many small pieces of free space. Disk fragmentation is normal, expected behavior on) h 288 -8388 M (VMS disks and only presents a problem when it becomes extreme and there are no single) h 288 -10388 M (chunks of free space left on the disk large enough to satisfy a request for space. Disk ) h 288 -12388 M (fragmentation can be eliminated through the use of BACKUP/IMAGE or an on\255line disk) h 288 -14388 M (defragmenter \(Both methods make the free space contiguous\). ) h 288 -16388 M 288 -17788 M (Disk fragmentation adds seek time and rotational latency to I/O requests because blocks of data) h 288 -19788 M (are spread across the disk instead of immediately following data on the same track. Major ) h 288 -21788 M (improvements were made to backup in VMS version 5.2 to reduce the amount of time required) h 288 -23788 M (to backup a fragmented disk by minimizing the seek time required to read the disk. This ) h 288 -25788 M (improvement was made by buffering all of the data required for the backup to allow the disk) h 288 -27788 M (reads to be performed in an order that minimizes the disk head movements.) h 288 -29788 M 288 -31788 M (A file is fragmented when its data is contained in noncontiguous extents on the disk. This) h 288 -33788 M (fragmentation can be caused by the way that additional disk space is requested when the file) h 288 -35788 M (needs to grow, by the inability of the file system to provide the space as requested due to) h 288 -37788 M (disk fragmentation or by truncation of growing sequential files to the end of file block when) h 288 -39788 M (closing the file. ) h 288 -41788 M 288 -43188 M (Sequential files are fragmented when the data is not contained in one file extent. When ) h 288 -45188 M (sequential files are fragmented, a refresh of the disk via a BACKUP/IMAGE will make all of) h 288 -47188 M (files on the disk contiguous. In addition,on\255line defragmenters work very well on sequential) h 288 -49188 M (files if the files are closed,) h 288 -51188 M 288 -52588 M (Relative files are created at a fixed length but may require additional I/Os to chain through ) h 288 -54588 M (records or to find a free slot if the records are not evenly distributed. If the space in a relative) h 288 -56588 M (file is not contiguous on the disk, additional seeks will be required when searching through ) h 288 -58588 M (the recordtbV$ DISKM010.A [DISK.A]DISKM010_UG.PS;8"s. ) h 288 -60588 M 288 -61988 M (Indexed files can suffer from fragmented data, bucket splits and additional levels of indexes to) h 288 -63988 M (varying degrees depending on how the files are created and how records are added. Fragmented) h -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide Page ) h (4 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 5 5 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (data creates effects which are similar to the fragmentation seen in sequential files. Bucket splits) h 288 -3188 M (occur when a data or index bucket becomes full; so an additional bucket is created and the ) h 288 -5188 M (original buckets contents are split between the original and new buckets. Indexes are a tree) h 288 -7188 M (structure which require that the top level of the tree can fit in one bucket. If the top level bucket) h 288 -9188 M (becomes full, a new level of index must be created to hold the buckets split out of the original) h 288 -11188 M (top level. Additional index levels require more I/Os to locate the desired data or index record.) h 288 -13188 M 288 -15188 M (Database files can also suffer from fragmentation. This tool will report on database files that) h 288 -17188 M (have many extents but the user should use tools/methods provided by the database ) h 288 -19188 M (manufacturer to correct the problem.) h 288 -21188 M 288 -23188 M (In order to understand the performance effects of fragmented disks and files, a brief ) h 288 -25188 M (understanding of the VMS Record Management System \(RMS\), the VMS File System and) h 288 -27188 M (their interaction with the disk hardware is very useful.) h 288 -29188 M 288 -30588 M (RMS is a file/record system where the smallest entity is the record. Files are made up of either) h 288 -32588 M (fixed or variable length records and can be organized as sequential, relative or indexed files.) h 288 -34588 M (Within the limitations of the file organization, records can be accessed sequentially, by position) h 288 -36588 M (or by key. Applications and programs read/write/update/delete records and manipulate the) h 288 -38588 M (data within the records. When RMS wants to manipulate files or records, it uses the VMS File) h 288 -40588 M (System to interact with the storage medium \(disk,tape,cd etc.\).) h 288 -42588 M 288 -43988 M (The VMS File System is a block \(512 Bytes\) oriented I/O subsystem that handles the ) h 288 -45988 M (interaction between the operating system and storage devices. When a user requests a file open,) h 288 -47988 M (the File System performs the required actions to locate the file on disk and return information) h 288 -49988 M (to the user requesting the work. When a user wants to read a record out of the file using RMS,) h 288 -51988 M (RMS translates the record into block number\(s\) and sends a request for the block\(s\) to the File) h 288 -53988 M (System. The File System interacts with the hardware to retrieve the requested blocks and passes) h 288 -55988 M (these blocks to RMS which parses the block\(s\) to return the record to the user. It does not) h 288 -57988 M (matter to the user or to RMS where this data is actually located on the disk because the File) h 288 -59988 M (System will locate the block of data requested and return it to an I/O buffer. ) h 288 -61988 M 288 -63388 M (Because magnetic disks \(as opposed to solid state or memory disks\) are mechanical in nature) h -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide Page ) h (5 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 6 6 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (and subject to start, stop and rotate delays, the best performance is obtained when the disk is) h 288 -3188 M (performing spiral transfers. A spiral transfer occurs when the next block follows the current) h 288 -5188 M (block on the same track and the first block of the next track follows the last block of the current) h 288 -7188 M (track. The locality of reference theory states that the next data required is most likely to be the) h 288 -9188 M (logical block immediately following the current block \(sequential access\). If this block is not) h 288 -11188 M (physically following the current block on the disk, seek and rotation latency delays will occur) h 288 -13188 M (that could have been avoided if the data was contiguous. A badly fragmented disk/file will give) h 288 -15188 M (worse performance than a non\255fragmented disk/file because of these delays. ) h 288 -17188 M 288 -18588 M (Fragmented Files can cause additional work for the File System and disk because of the way) h 288 -20588 M (that the File System keeps track of where the blocks that make up the file are located on the) h 288 -22588 M (disk. Each file has a file header that contains information about the file and a list of ) h 288 -24588 M (locations/block counts where the file is located. If the file is contiguous, only one location is) h 288 -26588 M (needed and the count is equal to the number of blocks in the file. As a file becomes fragmented,) h 288 -28588 M (more location/count information needs to be stored and overhead is required to get the) h 288 -30588 M (next "window" of locations. This is called a window\255turn. ) h 288 -32588 M 288 -33988 M (If the number of locations will not fit in the space reserved in the file header, a chain of file) h 288 -35988 M (headers is required and significant overhead will be required to locate file blocks on the disk. ) h 288 -37988 M (If a request for several logically contiguous blocks crosses between two file extents, the request) h 288 -39988 M (must be split into 2 or more I/O's by the File System. This is called a split I/O. ) h 288 -41988 M 288 -43388 M (Extents within a file can be caused by a lack of contiguous space available at creation time,) h 288 -45388 M (not making the data needs clear to the File System \(asking for 1 block when you really need) h 288 -47388 M (100\) and poor file design that results in large numbers of small extents.) h 288 -49388 M 288 -51388 M (Although File System extents and RMS file fragmentation can be independent, poorly designed) h 288 -53388 M (files will normally suffer from both problems. This software uses the existence of extents as an) h 288 -55388 M (indication of files that need attention and in almost all cases this will be true. \(An RMS file) h 288 -57388 M (with a large allocation and small bucket size will have RMS file fragmentation but no extents,) h 288 -59388 M (while an RMS file extended in key order can have extents but no RMS file fragmentation.\)) h 288 -63038 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide Page ) h (6 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 7 7 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (How to remove Disk and File Fragmentation.) h 33035 -1638 M 288 -4388 M n 0.667 o f (Disk fragmentation can be removed using BACKUP/IMAGE or by the use of an on\255line disk) h 288 -6388 M 71.8 0 32 (defragmenter. BACKUP/IMAGE is fully supported by Digital as the method to make contigu\255) W 288 -7788 M (ous) h 288 -9788 M (files and free space on a disk. Many on\255line defragmenters will not work on open files so that) h 288 -11788 M 17.9 0 32 (if your badly fragmented files are always open , BACKUP/IMAGE during non\255peak usage may) W 288 -13188 M (be) h 288 -15188 M (your best option. Any file that is always open and has many additions and deletions should) h 288 -17188 M (be carefully designed \(reasonable allocation and extent sizes, record purges and converts\) to) h 288 -19188 M (keep file fragmentation to a minimum. On\255line Defragmenters avoid the application downtime) h 288 -21188 M (that is required for BACKUP/IMAGE but add I/O's to the disks. It is not this writers intent to) h 288 -23188 M (recommend or discourage on\255line disk defragmenters, but to ask what method of refreshing) h 288 -25188 M (disks is the best for your Data Center. ) h 288 -27188 M 288 -29188 M (The best way to reduce file fragmentation is to avoid it altogether through good file design.) h 288 -31188 M (Since Data Center personnel seldom write applications and ar7$ DISKM010.A [DISK.A]DISKM010_UG.PS;8<".e "stuck" with previously) h 288 -33188 M (written applications, they have little input into file design. The best that can be done is to) h 288 -35188 M (recommend that all major files on the system should be designed not defaulted and work to) h 288 -37188 M (change the definitions of habitual offending files.) h 288 -39188 M 288 -40588 M (When a new application is brought on\255line little thought is given to file design if it runs well.) h 288 -42588 M (As the application grows and performance slowly degrades, the change is normally very ) h 288 -44588 M (gradual and the users don't really notice. Over time, the application becomes a "dog" and users) h 288 -46588 M (start to scream. One of the most rewarding times in a performance tuner's life is when they can) h 288 -48588 M (improve application response time from minutes to seconds by cleaning up the files. After this) h 288 -50588 M (happens a few times, word gets out that file fragmentation can cause major problems and ) h 288 -52588 M (programmers start to think about designing better files.) h 288 -54588 M 288 -56588 M (Whenever a file becomes a candidate for cleanup, the current and expected usage of the file) h 288 -58588 M (should be examined to determine the best way to keep the file from fragmenting again. Some) h 288 -60588 M (files will constantly fragment because of the way they are being used and the only option is) h 288 -62588 M (to clean them up on a regular basis. Other files will stay clean for years if properly designed.) h -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide Page ) h (7 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 8 8 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (Sequential files are the easiest to cleanup. A disk refresh will make the file contiguous with no) h 288 -3188 M (other work but the file may start to fragment again right away. COPY/CONTIGUOUS will also) h 288 -5188 M (make the file contiguous but changes the file structure so that the file must remain contiguous.) h 288 -7188 M (This may not be a good idea if data is being added to the file because the extent will fail if the) h 288 -9188 M (next block is not available. Converting the file allows changes to the allocation and extent sizes) h 288 -11188 M (and specification of Best_Try_Contiguous to slow the rate of fragmentation.) h 288 -13188 M 288 -15188 M (Relative files are fixed in size and must be recreated to add space to the file. A larger problem) h 288 -17188 M (is the effect of chaining caused by groups of records that map to the same slot which requires) h 288 -19188 M (the new record to be put in the next free slot. This slot could be many slots away requiring a ) h 288 -21188 M (lot of overhead on reads and writes. This problem may require more slots in the file, a smaller) h 288 -23188 M (fill ratio of slots or a change in the hashing algorithm to correct and should be worked closely) h 288 -25188 M (with the file designer. ) h 288 -27188 M 288 -29188 M (Indexed files can take advantage of RMS tools to look at the current state of the file ) h 288 -31188 M (\(ANALYZE/RMS/STAT\), create a file definition language definition of the file ) h 288 -33188 M (\(ANALYZE/RMS/FDL\), modify the FDL to better reflect the files usage) h 288 -35188 M (\(EDIT/FDL/ANALYSIS=FDLNAME/NOINTERACTIVE\) and create a new optimized file) h 288 -37188 M ( \(CONVERT/FDL=FDL_NAME OLD_FILENAME NEW_FILENAME\). These commands) h 288 -39188 M ( \(except EDIT/FDL\) require exclusive access to the file that is being defragmented.) h 288 -40588 M 288 -44238 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide Page ) h (8 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 9 9 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (Producing Reports.) h 14188 -1638 M 288 -4388 M n 0.667 o f (The command procedure SYS$MANAGER:DISK_MANAGEMENT_LOGICALS.COM must) h 288 -6388 M (be executed prior to producing any reports and should be added to the login.com of users that) h 288 -8388 M (frequently run reports. Reports can be produced automatically for all disks each week or for ) h 288 -10388 M (individual disks as needed.) h 288 -12388 M 288 -14388 M (To automatically produce weekly disk fragmentation reports, submit the command procedure) h 288 -16388 M (DISK$MANAGEMENT:REVIEW_ALL_DISKS.COM from a privileged account that ) h 288 -18388 M (executes the DISK_MANAGEMENT_LOGICALS command procedure in its LOGIN.COM.) h 288 -20388 M (This procedure will resubmit itself to run at 2AM in the morning seven days in the future and) h 288 -22388 M (will produce .FRAG reports in the DISK$MANAGEMENT directory for all of the disks) h 288 -24388 M (mounted on the system when it was run.) h 288 -26388 M 288 -27788 M (After all of the disk fragmentation reports have been created, the procedure) h 288 -29788 M (FRAG_SUMMARY.COM will run to analyze each of the disk fragmentation reports to ) h 288 -31788 M (determine which disks require action. FRAG_SUMMARY.COM produces two reports;) h 288 -33788 M (FRAG_SUMMARY.RPT and FRAG_SUMMARY.SUM located in DISK$MANAGEMENT:.) h 288 -35188 M 288 -36588 M (FRAG_SUMMARY.RPT is a detailed report listing each disk that exceeded thresholds, the ) h 288 -38588 M (actions recommended and the reasons that the actions are recommended. ) h 288 -40588 M (FRAG_SUMMARY.SUM contains just the actions recommended and is mailed to) h 288 -42588 M (each of the user accounts listed in the file DISK$MANAGEMENT:DM_MAIL.DIS If VPA or) h 288 -44588 M (DECps is installed on the system, the procedure Weekly_hot_files.com is run to produce the ) h 288 -46588 M (report DISK$MANAGEMENT:WEEKLY_HOT_FILES.RPT which is mailed to the accounts) h 288 -48588 M (listed in DM_MAIL.DIS.) h 288 -50588 M 288 -52588 M (The command procedure REVIEW_DISK.COM can be used to produce detailed disk ) h 288 -54588 M (fragmentation \(.FRAG\) reports for a specific disk. This procedure can be passed the device) h 288 -56588 M (name as a \(P1\) parameter or will ask for the device if the parameter is not supplied. The report) h 288 -58588 M (will be named DISK$MANAGEMENT:devicename.FRAG. If VPA or DECps is installed on) h 288 -60588 M (the system, the previous day's data from the current node will be used to determine hotfile and) h 288 -62588 M (disk utilization data.) h 288 -64588 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide Page ) h (9 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 10 10 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (Frag reports can be produced manually using the REVIEW_DISK command in the form:) h 288 -3188 M 288 -4588 M ($REVIEW_DISK/NODE=NODENAME/BEG=12\255SEP\2551992:00:00/END=14\255SEP\2551992:23:59) h 288 -5988 M 6048 -5988 M ( /WINDOW=X/HISTWINDOW=Y/OUT=FILENAME.EXT DEVICENAME) h 288 -7988 M 288 -9388 M (DEVICENAME is the only required parameter \(REVIEW_DISK SYS$SYSDEVICE: will) h 288 -11388 M (work\).) h 288 -13388 M 288 -14788 M (NODE, BEG and END are used to define the VPA/DECps data used to produce reports and are) h 288 -16788 M (not allowed if neither VPA or DECps are on the system. NODE is the nodename of the node) h 288 -18788 M (whose VPA/DECps data should be used, BEG is the starting time of the data \(defaults to ) h 288 -20788 M (yesterday at 8AM\) and END is the ending time of the data \(defaults to yesterday at 5PM\). If ) h 288 -22788 M (NODE is not specified on a VPA/DECps system, a warning message is displayed during the) h 288 -24788 M (REVIEW_DISK program run \(as shown during the installation IVP\).) h 288 -26788 M 288 -28188 M (WINDOW is the number of extents cutoff point for files to be shown in the report. If a file has) h 288 -30188 M (fewer than WINDOW extents, it will not be in the report. WINDOW defaults to the window) h 288 -32188 M (size of the disk be analyzed.) h 288 -34188 M 288 -35588 M (HISTWINDOW determines if file data is written to the FILE_HISTORY.DAT file. The file) h 288 -37588 M (data is saved if the file has more than extents.) h 288 -41588 M 288 -42988 M (OUTPUT is the name of the disk fragmentation report produced by REVIEd$ DISKM010.A [DISK.A]DISKM010_UG.PS;8"?W_DISK and it) h 288 -44988 M (defaults to REVIEW_DISK.RPT.) h 288 -46988 M 288 -48388 M 288 -52038 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide Page ) h (10 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 11 11 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (Customizing Reports.) h 15989 -1638 M 288 -4388 M n 0.667 o f (Three of the command files provided with this package are designed to be customized for) h 288 -6388 M (the environment in which they will be run. All of these command procedures are located in) h 288 -8388 M (the directory DISK$MANAGEMENT. It is strongly suggested the the original command ) h 288 -10388 M (procedures be copied to *.original so that the original procedures will still be around in case) h 288 -12388 M (something goes wrong with the customization.) h 288 -14388 M (REVIEW_ALL_DISKS.COM goes through a list of disks on your system generated by the) h 288 -16388 M (command SHOW DEVICE/MOUNTED and runs the program REVIEW_DISK on each of) h 288 -18388 M (these disks. If you are running a large MI cluster and the disks local to the workstations are ) h 288 -20388 M (being served to the cluster, all of these small workstation disks will be analyzed which could) h 288 -22388 M (take a long time and consume a lot of Ethernet bandwidth. If you want to skip all disks that are) h 288 -24388 M (served by other VAXes to the node where the command procedure is running, remove the ) h 288 -26388 M (! from the line:) h 288 -28388 M 288 -30388 M ($!IF \(F$GETDVI\("''DEVICE'","HOST_TYPE"\) .EQS. "VAX"\) THEN GOTO READREC) h 288 -32388 M 288 -34388 M (The number of file records written to the FILE_HISTORY.DAT file can be controlled through) h 288 -36388 M (the use of the NUM_WINDOWS symbol in REVIEW_ALL_DISKS.COM. Only files with) h 288 -38388 M (more extents than NUM_WINDOWS * the disk window size will be saved in the history file.) h 288 -40388 M 288 -42388 M (The logical name definition of BIGFILE_SIZE controls the size of the smallest file shown in) h 288 -44388 M (the big file list. You can change this logical to any value you want.) h 288 -46388 M 288 -48388 M (WEEKLY_HOT_FILES.COM uses VPA or DECps data to determine what the hot files are on) h 288 -50388 M (your system. The default threshold is that the file was hot for at least 50 two minute periods) h 288 -52388 M (during the previous five days. This can be changed by modifying the line that reads: ) h 288 -54388 M ($HF_CNT = 50) h 288 -56388 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M (DECdiskmanagement v1.0 Users Guide Page ) h (11 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 12 12 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (FRAG_SUMMARY.COM contains disk thresholds for different disks and allows these ) h 288 -3188 M (thresholds to be modified to reduce/increase the number of disk conclusions that will be ) h 288 -5188 M (reported. If a disk being used is not an RA92,RA90,RA82,RA81,RZ23,RF73,RF72 or RF71, it) h 288 -7188 M (should be added to the tables using values similar to a disk of comparable size. If no definition) h 288 -9188 M (exists for a disk, the default RA92 values will be used. The default and RF71 definitions are) h 288 -11188 M (shown below:) h 288 -13038 M 288 -14238 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1000 o f ($!DEFINE LOGICALS FOR MEDIA TYPES THAT HAVE BEEN DEFINED) h 288 -15438 M ($DEFINE/NOLOG DEF_DEFINED "YES") h 288 -16638 M ($DEFINE/NOLOG RF71_DEFINED "YES") h 288 -17838 M ($! PCT. OF DISK TO KEEP FREE [20]) h 288 -19038 M ($DEF_DISK_FREE = 20) h 288 -20238 M ($RF71_DISK_FREE = 20) h 288 -21438 M ($!PCT. OF FREE SPACE REQUIRED IN THE LARGEST BITMAP HOLE [5]) h 288 -22638 M ($DEF_BHOLE_FREE = 5) h 288 -23838 M ($RF71_BHOLE_FREE = 5) h 288 -25038 M ($!FREE SPACE THRESHOLD FOR BITMAP HOLE CONCLUSIONS [300000]) h 288 -26238 M ($DEF_FREE_FRAG = 300000) h 288 -27438 M ($RF71_FREE_FRAG = 50000) h 288 -28638 M ($!LARGEST BITMAP HOLE MUST BE GREATER THAN [50000]) h 288 -29838 M ($DEF_BHOLE = 50000) h 288 -31038 M ($RF71_BHOLE = 10000) h 288 -32238 M ($!NUMBER OF BITMAP HOLES MUST BE LESS THAN [5000]) h 288 -33438 M ($DEF_BHOLE_NUM = 5000) h 288 -34638 M ($RF71_BHOLE_NUM = 1000) h 288 -35838 M ($!NUMBER OF FILES WITH EXTENSION HEADERS MUST BE < [10]) h 288 -37038 M ($DEF_FILE_HEAD = 10) h 288 -38238 M ($RF71_FILE_HEAD = 5) h 288 -39438 M ($!NUMBER OF FILES WITH EXTENTS > DISK WINDOW SIZE MUST BE < [500]) h 288 -40638 M ($DEF_FILE_EXT = 500) h 288 -41838 M ($RF71_FILE_EXT = 100) h 288 -43038 M ($!LARGEST NUMBER OF HEADERS IN ONE FILE < [10]) h 288 -44238 M ($DEF_NUM_HEAD = 10) h 288 -45438 M ($RF71_NUM_HEAD = 10) h 288 -46638 M ($!MAX. NUMBER EXTENTS IN INDEXF.SYS \(ONLY 1 HEADER\) FILE BEFORE REFRESH [40]) h 288 -47838 M ($DEF_INDEXF_EXTENTS = 40) h 288 -49038 M ($RF71_INDEXF_EXTENTS = 40) h 288 -50238 M 288 -51438 M (The command line $media_xxx_xxx = 'media'_xxx_xxx will also need to be added) h 288 -52638 M (if new parameters \(not new types\) are created.) h 288 -55638 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide Page ) h (12 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 13 13 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (History File Descriptions.) h 18938 -1638 M 288 -4388 M n 0.667 o f (Disk, File and Hotfile history files are automatically created and updated when ) h 288 -5788 M 288 -7188 M (FRAG_SUMMARY and WEEKLY_HOT_FILES.COM are run. These files contain historical) h 288 -8588 M 288 -9988 M (data that can be used to determine disk and file fragmentation rates and also save data about file) h 288 -11388 M 288 -12788 M ( headers and extents that is impossible to recreate after the disk is refreshed. These files are) h 288 -14188 M 288 -15588 M ( located in the directory from which the command procedures are run, \(usually ) h 288 -16988 M 288 -18388 M (DISK$MANAGEMENT\) and are created if they do not exist. The record descriptions of each) h 288 -19788 M 288 -21188 M (file is shown below.) h 288 -22588 M 288 -23988 M 288 -25388 M (Disk_history.dat) h 288 -26788 M 288 -28188 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1200 o f (All fields separated by one space. Record length is 177 bytes.) h 288 -29588 M 288 -30988 M (Field) h 6048 -30988 M 11808 -30988 M (Length) h 17568 -30988 M (Type) h 23328 -30988 M (Example) h 288 -32388 M 288 -33788 M (date) h 6048 -33788 M 11808 -33788 M (10) h 17568 -33788 M (string) h 23328 -33788 M (1991\25508\25514) h 288 -35188 M (device) h 6048 -35188 M 11808 -35188 M (20) h 17568 -35188 M (string) h 23328 -35188 M (_$2$dua117:) h 288 -36588 M (volume) h 6048 -36588 M 11808 -36588 M (10) h 17568 -36588 M (string) h 23328 -36588 M (user$disk) h 288 -37988 M (node name) h 11808 -37988 M (6) h 17568 -37988 M (string) h 23328 -37988 M (VAX123) h 288 -39388 M (bitmap holes) h 11808 -39388 M (8) h 17568 -39388 M (integer) h 23328 -39388 M (7539) h 288 -40788 M (biggest hole) h 11808 -40788 M (8) h 17568 -40788 M (integer) h 23328 -40788 M (77234) h 288 -42188 M (pct. busy) h 11808 -42188 M (5) h 17568 -42188 M (float) h 23328 -42188 M (23.34) h 288 -43588 M (disk size) h 11808 -43588 M (8) h 17568 -43588 M (integer) h 23328 -43588 M (2940951) h 288 -44988 M (free space) h 11808 -44988 M (8) h 17568 -44988 M (integer) h 23328 -44988 M (469173) h 288 -46388 M (pct. used) h 11808 -46388 M (3) h 17568 -46388 M (integer) h 23328 -46388 M (84) h 288 -47788 M (errors) h 6048 -47788 M 11808 -47788 M (8) h 17568 -47788 M (integer) h 23328 -47788 M (0) h 288 -49188 M (cluster size) h 11808 -49188 M (8) h 17568 -49188 M (integer) h 23328 -49188 M (3) h 288 -50588 M (window size) h 11808 -50588 M (4) h 17568 -50588 M (integer) h 23328 -50588 M (7) h 288 -51988 M (I/O per sec.) h 11808 -51988 M (8) h 17568 -51988 M (float) h 23328 -51988 M (26.84) h 288 -53388 M (I/O count) h 11808 -53388 M (8) h 17568 -53388 M (integer) h 23328 -53388 M (19434) h 288 -54788 M (queue) h 6048 -54788 M 11808 -54788 M (6) h 17568 -54788 M (float) h 23328 -54788 M (0.43) h 288 -56188 M (files > 1 head) h 11808 -56188 M (4) h 17568 -56188 M (integer) h 23328 -56188 M (32) h 288 -57588 M (files > window) h 11808 - &J$ DISKM010.A [DISK.A]DISKM010_UG.PS;84%"P57588 M (4) h 17568 -57588 M (integer) h 23328 -57588 M (297) h 288 -58988 M (rpt window size) h 11808 -58988 M (4) h 17568 -58988 M (integer) h 23328 -58988 M (7) h 288 -60388 M (file count) h 11808 -60388 M (8) h 17568 -60388 M (integer) h 23328 -60388 M (12354) h 288 -61788 M (total extents) h 11808 -61788 M (8) h 17568 -61788 M (integer) h 23328 -61788 M (22345) h 288 -63038 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide Page ) h (13 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 14 14 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1200 o f (File_history.dat) h 288 -2588 M 288 -3988 M (All fields separated by one space. Record length is 166 bytes.) h 288 -5388 M (Field) h 6048 -5388 M 11808 -5388 M (Length) h 17568 -5388 M (Type) h 23328 -5388 M (Example) h 288 -6788 M 288 -8188 M (date) h 6048 -8188 M 11808 -8188 M (10) h 17568 -8188 M (string) h 23328 -8188 M (1991\25508\25514) h 288 -9588 M (device) h 6048 -9588 M 11808 -9588 M (20) h 17568 -9588 M (string) h 23328 -9588 M (_$2$dua117:) h 288 -10988 M (volume) h 6048 -10988 M 11808 -10988 M (10) h 17568 -10988 M (string) h 23328 -10988 M (user$disk) h 288 -12388 M (filename) h 11808 -12388 M (86) h 17568 -12388 M (string) h 23328 -12388 M ([snarje]rmt74.log;1) h 288 -13788 M (# headers) h 11808 -13788 M (8) h 17568 -13788 M (integer) h 23328 -13788 M (3) h 288 -15188 M (hotfile recs) h 11808 -15188 M (3) h 17568 -15188 M (integer) h 23328 -15188 M (124) h 288 -16588 M (hotfile ave I/O) h 11808 -16588 M (4) h 17568 -16588 M (float) h 23328 -16588 M (10.7) h 288 -17988 M (# file extents) h 11808 -17988 M (8) h 17568 -17988 M (integer) h 23328 -17988 M (39) h 288 -19388 M (file size) h 11808 -19388 M (8) h 17568 -19388 M (integer) h 23328 -19388 M (1171) h 288 -20788 M 288 -22188 M (Hot_files_history.dat \(not created unless VPA is on the system\)) h 288 -23588 M (All fields separated by one space. Record length is 105 bytes.) h 288 -24988 M 288 -26388 M (Field) h 6048 -26388 M 11808 -26388 M (Length) h 17568 -26388 M (Type) h 23328 -26388 M (Example) h 288 -27638 M 288 -28838 M n 0.833 o f (date) h 6048 -28838 M 11808 -28838 M (10) h 17568 -28838 M (string) h 23328 -28838 M (1991\25508\25514) h 288 -30038 M (disk) h 6048 -30038 M 11808 -30038 M (15) h 17568 -30038 M (string) h 23328 -30038 M ($2$dua117) h 288 -31238 M (VPA hotfile rec) h 11808 -31238 M (3) h 17568 -31238 M (integer) h 23328 -31238 M (53) h 288 -32438 M (VPA hot ave I/O 5) h 11808 -32438 M (float) h 17568 -32438 M (18.7) h 288 -33638 M (dir and file) h 11808 -33638 M (68) h 17568 -33638 M (string) h 23328 -33638 M ([snarje]rmt74.log;1) h 288 -34838 M 288 -37838 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide Page ) h (14 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 15 15 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (.FRAG Reports) h 11588 -1638 M 288 -4388 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1200 o f (The following example is the file vaxvmsrl05.frag created by) h 288 -5788 M 288 -7188 M (review_all_disks.com. The numbers used to determine if a disk is) h 288 -8588 M 288 -9988 M (fragmented are variables in the command procedure FRAG_SUMMARY) h 288 -11388 M 288 -12788 M (and have been assigned default values that apply to RA92 disks.) h 288 -14188 M 288 -15438 M n 0.833 o f (Disk analysis for _$1$DIA0:) h /Times-Roman-ISOLatin1 F 1000 o f 0.0 437.0 m (1) h 0 -437.0 m /Courier-ISOLatin1 F 1000 o f ( Logical name VAXVMSRL05) h 0.0 437.0 m (2) h 0 -437.0 m ( from node XXXXXX) h 0.0 437.0 m (3) h 0 -437.0 m 288 -16638 M (Bitmap holes 180) h 0.0 437.0 m (4) h 0 -437.0 m ( Largest hole 10653) h 0.0 437.0 m (5) h 0 -437.0 m ( Pct busy 0.00) h 0.0 437.0 m (6) h 0 -437.0 m 288 -17838 M (Disk size 781440) h 0.0 437.0 m (7) h 0 -437.0 m ( Free space 101742 ) h 0.0 437.0 m (8) h 0 -437.0 m (Pct used 86%) h 0.0 437.0 m (9) h 0 -437.0 m 288 -19038 M (# Files 12354) h 0.0 437.0 m (25) h 0 -437.0 m (Tot Extent 22345) h 0.0 437.0 m (26) h 0 -437.0 m ( Blks/file 55) h 0.0 437.0 m (27) h 0 -437.0 m 288 -20238 M (Error cnt 0) h 0.0 437.0 m (10) h 0 -437.0 m (Cluster size 3) h 0.0 437.0 m (11) h 0 -437.0 m ( Windows 7) h 0.0 437.0 m (12) h 0 -437.0 m 288 -21438 M (Ave I/O /sec 0.00) h 0.0 437.0 m (13) h 0 -437.0 m ( Thruput /sec 0) h 0.0 437.0 m (14) h 0 -437.0 m ( Ave Que 0.00) h 0.0 437.0 m (15) h 0 -437.0 m 288 -22638 M ( 0) h 0.0 437.0 m (16) h 0 -437.0 m ( Files > 1 header 13) h 0.0 437.0 m (17) h 0 -437.0 m ( Files > 7) h 0.0 437.0 m (18) h 0 -437.0 m ( extents) h 288 -23838 M 288 -25038 M ( FILE FILE FILE HOTFILES) h 288 -26238 M ( HEADERS EXTENTS SIZE NUM I/O [DIRECTORY]FILENAME.EXT) h 288 -27438 M 288 -28638 M ( 1) h 0.0 437.0 m (20) h 0 -437.0 m ( 34) h 0.0 437.0 m (23) h 0 -437.0 m ( 20001) h 0.0 437.0 m (24) h 0 -437.0 m ( 0) h 0.0 437.0 m (21) h 0 -437.0 m (0.0) h 0.0 437.0 m (22) h 0 -437.0 m ( [SYSCOMMON.SYSEXE]COPY.EXE;2) h 0.0 437.0 m (19) h 0 -437.0 m 288 -29838 M ( 1 15 51 0 0.0 [SYS11.SYSMGR]ACCOUNTNG.DAT;2 ) h 288 -31038 M ( 1 9 9381 0 0.0 [000000]INDEXF.SYS;1 ) h 288 -32238 M ( 1 9 69 0 0.0 [SYSCOMMON.SYS$LDR]XEDRIVER.EXE;2) h 288 -33438 M ( 1 8 24 0 0.0 [SYS10.SYSERR]ERRLOG.SYS;1 ) h 288 -34638 M 288 -35838 M (Files larger than 50000) h 0.0 437.0 m (28) h 0 -437.0 m ( blocks on this disk are:) h 288 -37038 M (Modified Date Size [Directory]Filename.Ext) h 288 -38238 M 288 -39438 M ( 9\255NOV\2551992) h 0.0 437.0 m (30) h 0 -437.0 m ( 60000) h 0.0 437.0 m (31) h 0 -437.0 m ([SYS0.SYSEXE]PAGEFILE.SYS;2) h 0.0 437.0 m (29) h 0 -437.0 m ( ) h 288 -40638 M 288 -41838 M 288 -43188 M n 1.200 o f (1 Physical device name of the disk being analyzed.) h 288 -44588 M (2 Logical name of the device being analyzed.) h 288 -45988 M (3 Node used for performance data, blank if VPA is not on the) h 288 -47388 M 6048 -47388 M (system or if /node was left off the review_disk command.) h 288 -48788 M (4 Number of bitmap holes on the disk. This is an indication of) h 288 -50188 M 6048 -50188 M (fragmentation of the free space on the disk. A large) h 288 -51588 M 6048 -51588 M (number of holes is an indication that the disk should be) h 288 -52988 M 6048 -52988 M (refreshed.) h 288 -54388 M (5 Largest hole is the largest single piece of contiguous space) h 288 -55788 M 6048 -55788 M (available on the disk.) h 288 -57188 M (6 Percent of the time that the disk was already busy when this) h 288 -58588 M 6048 -58588 M (node tried to do an I/O from VPA.) h 288 -59838 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide Page ) h (15 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 16 16 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1200 o f (7 The total number of blocks available on the disk.) h 288 -2588 M (8 Free space left on the disk.) h 288 -3988 M (9 Percentage of total disk space used.) h 288 -5388 M (10 Number of errors reported on the device.) h 288 -6788 M (11 Cluster size of the disk in blocks.) h 288 -8188 M (12 Current window size of the disk.) h 288 -9588 M (13 Average number of I/O's per second to the disk from VPA.) h 288 -10988 M (14 Disk Throughput in bytes per second from VPA.) h 288 -12388 M (15 Average queue \(number of I/O operations waiting\) from VPA.) h 288 -13788 M (16 Number of files with extension headers) h 288 -15188 M (17 Number of files with more than the specified number of) h 288 -16588 M 6048 -16588 M (extents) h 288 -17988 M (18 The number of extents specified by the /window qualifier.) h 288 -19388 M 6048 -19388 M (This value defaults to the disk window size.) h 288 -20788 M (19 Filename and directory of fragmented files. The files are) h 288 -22188 M 6048 -22188 M (sorted by number of headers, VPA hot files I/O rate and) h 288 -23588 M 6048 -23588 M (number of extents.) h 288 -24988 M (20 Number of file headers for this file.) h 288 -26388 M (21 Number of two minute interv 2$ DISKM010.A [DISK.A]DISKM010_UG.PS;8"aals that this file was a VPA or) h 288 -27788 M ( DECps hotfile. Not shown if VPA or DECps is not installed.) h 288 -29188 M (22 Average I/O rate when this file was a VPA or DECps hotfile.) h 288 -30588 M (23 Number of File System extents on this file. If you do a ) h 288 -31988 M 6048 -31988 M (dump/header/block=count=0 on the file and count the) h 288 -33388 M 6048 -33388 M (number of mapping points, you will get this number.) h 288 -34788 M (24 File size in blocks. Watch out for small files with many) h 288 -36188 M 6048 -36188 M (extents and headers.) h 288 -37588 M (25 Number of files on the disk.) h 288 -38988 M (26 Total number of extents on the disk, a contiguous file has 1) h 288 -40388 M 6048 -40388 M (extent, other files may have many.) h 288 -41788 M (27 Average size file on the disk.) h 288 -43188 M (28 The smallest filesize that will be included in the big file) h 288 -44588 M 6048 -44588 M (list. The default is 50,000 and the value is changed) h 288 -45988 M 6048 -45988 M (using the logical name BIGFILE_SIZE.) h 288 -47388 M (29 The filename and directory of the big files \(not sorted\)) h n 0.833 o f (.) h 288 -48788 M n 1.200 o f (30 The date that the file was last modified.) h 288 -50188 M (31 The size of the file.) h 288 -53238 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide Page ) h (16 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 17 17 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (Frag_summary.rpt Example) h 20486 -1638 M 288 -4388 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1200 o f (The following example is FRAG_SUMMARY.RPT produced by the ) h 288 -5788 M 288 -7188 M (command procedure FRAG_SUMMARY.COM) h 288 -8438 M 288 -9638 M 288 -10838 M n 0.833 o f (THIS DISK SHOULD BE REFRESHED USING BACKUP/IMAGE) h 0.0 437.0 m (1) h 0 -437.0 m 288 -12038 M (DISK CONTAINS MANY BADLY FRAGMENTED FILES WHICH COULD IMPACT PERFORMANCE) h 288 -13238 M (FILES SHOULD BE PURGED, DELETED OR MOVED TO ANOTHER DISK TO FREE UP SPACE) h 0.0 437.0 m (3) h 0 -437.0 m 288 -14438 M ( ) h 288 -15638 M (Warning \255 Disk has less than 20% empty space) h 0.0 437.0 m (4) h 0 -437.0 m 288 -16838 M (Largest chunk of freespace is less than 5% of total freespace) h 0.0 437.0 m (5) h 0 -437.0 m 288 -18038 M (Largest chunk of freespace is less than 10000 Blocks) h 0.0 437.0 m (6) h 0 -437.0 m 288 -19238 M (Disk has 1000 or more bitmap holes \(fragmented free space\)) h 0.0 437.0 m (7) h 0 -437.0 m 288 -20438 M (There are 5 or more files with extension headers on the disk) h 0.0 437.0 m (8) h 0 -437.0 m 288 -21638 M (There are 100 or more files with more extents than the disk window size) h 0.0 437.0 m (9) h 0 -437.0 m 288 -22838 M (There are file\(s\) with 10 or more headers on this disk) h 0.0 437.0 m (10) h 0 -437.0 m 288 -24038 M (The 5 most fragmented files on this disk are heavily used) h 0.0 437.0 m (11) h 0 -437.0 m 288 -25238 M (ERROR \255 DISK IS FULL ) h 0.0 437.0 m (12) h 0 -437.0 m 288 -26438 M (There are more than 40 extents in indexf.sys, 1 header limit ) h 0.0 437.0 m (13) h 0 -437.0 m 288 -27638 M ( ) h 288 -28838 M ( Disk analysis for _$1$DIA0: Logical name VAXVMSRL05 from node VS2 ) h 288 -30038 M ( Bitmap holes 6183 Largest hole 5653 Pct busy 8.30) h 288 -31238 M ( Disk size 781440 Free space 109666 Pct used 87%) h 288 -32438 M ( # Files 12354) h 0.0 437.0 m ( ) h 0 -437.0 m (Tot Extent 22345 Blks/file 55) h 288 -33638 M ( Error cnt 0 Cluster size 3 Windows 7) h 288 -34838 M ( Ave I/O /sec 19.40 Thruput /sec 1254 Ave Que 0.90) h 288 -36038 M ( 70 Files > 1 header 515 Files > 7 extents) h 288 -37238 M ( ) h 288 -38438 M ( The fragmentation summary report shows just the first 5 fragmented files) h 288 -39638 M ( FILE FILE FILE HOTFILES) h 288 -40838 M ( HEADERS EXTENTS SIZE NUM I/O [DIRECTORY]FILENAME.EXT) h 288 -42038 M 288 -43238 M ( 1 34 20001 0 0.0 [SYSCOMMON.SYSEXE]COPY.EXE;2 ) h 288 -44438 M ( 1 15 51 0 0.0 [SYS11.SYSMGR]ACCOUNTNG.DAT;2 ) h 288 -45638 M ( 1 9 9381 0 0.0 [000000]INDEXF.SYS;1 ) h 288 -46838 M ( 1 9 69 0 0.0 [SYSCOMMON.SYS$LDR]XEDRIVER.EXE;2) h 288 -48038 M ( 1 8 24 0 0.0 [SYS10.SYSERR]ERRLOG.SYS;1 ) h 288 -49238 M 288 -50588 M n 1.200 o f (1 Major conclusion which is reported in both the detailed report) h 288 -51988 M 6048 -51988 M (and in the summary report. This conclusion is related to) h 288 -53388 M 6048 -53388 M (the number of bitmap holes and the size of the biggest) h 288 -54788 M 6048 -54788 M (hole but requires that some limit of freespace is) h 288 -56188 M 6048 -56188 M (available to avoid describing a newly refreshed but) h 288 -57588 M 6048 -57588 M (almost full disk as a fragmented disk.) h 288 -58988 M (2 Major conclusion that is only reported in the detailed report.) h 288 -60388 M 6048 -60388 M (This conclusion means that file fragmentation is present) h 288 -61788 M 6048 -61788 M (on your system and further investigation of the files) h 288 -63188 M 6048 -63188 M (involved should be performed.) h 288 -64438 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide Page ) h (17 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 18 18 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1188 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1200 o f (3 Major conclusion that the disk is too full and space needs to) h 46368 -1188 M 288 -2588 M 6048 -2588 M (be made on the disk if the files on the disk will be) h 288 -3988 M 6048 -3988 M (extended or new files will be created on the disk.) h 288 -5388 M (4 Supporting conclusion that the disk has less than) h 288 -6788 M 6048 -6788 M (*_disk_free) h 0.0 524.0 m (14) h 0 -524.0 m ( space free.Triggers major conclusion 3.) h 288 -8188 M (5 Supporting conclusion that the largest contiguous block of) h 288 -9588 M 6048 -9588 M (free space on the disk is less than *_bhole_free) h 0.0 524.0 m (14) h 0 -524.0 m 288 -10988 M 6048 -10988 M n 0.833 o f (percent) h 11808 -10988 M n 1.200 o f (of the total free space.Triggers major) h 288 -12388 M 6048 -12388 M (conclusion 1 if freespace > *_free_frag ) h 0.0 524.0 m (14) h 0 -524.0 m ( blocks free.) h 288 -13788 M (6 Supporting conclusion that the largest contiguous block of) h 288 -15188 M 6048 -15188 M (free space is less than *_bhole blocks) h 0.0 524.0 m (14) h 0 -524.0 m (. Triggers major) h 288 -16588 M 6048 -16588 M (conclusion 1 if freespace > *_free_frag ) h 0.0 524.0 m (14) h 0 -524.0 m ( blocks free.) h 288 -17988 M (7 Supporting conclusion that there are more than *_bhole_num) h 0.0 524.0 m (14) h 0 -524.0 m 288 -19388 M 6048 -19388 M (bitmap holes on the disk.Triggers major conclusion 1.) h 288 -20788 M (8 Supporting conclusion that there are more than *_file_head) h 0.0 524.0 m (14) h 0 -524.0 m ( ) h 288 -22188 M 6048 -22188 M (files with extension headers.Triggers major conclusion 2) h 288 -23588 M (9 Supporting conclusion that there are more than *_file_ext) h 0.0 524.0 m (14) h 0 -524.0 m ( ) h 288 -24988 M 6048 -24988 M (files with more extents than the disk window size.) h 288 -26388 M 6048 -26388 M (Triggers major conclusion 2.) h 288 -27788 M (10 Supporting conclusion that there are files with more than) h 288 -29188 M 6048 -29188 M (*_num_head) h 0.0 524.0 m (14) h 0 -524.0 m ( headers on the disk.Triggers major) h 288 -30588 M 6048 -30588 M (conclusion 2.) h 288 -31988 M (11 Supporting conclusion that the five most fragmented files on) h 288 -33388 M 6048 -33388 M (the disk had some VPA hotfile activity.) h 34848 -33388 M (Triggers major) h 288 -34788 M 6048 -34788 M (conclusion 2.) h 288 -36188 M (12 The disk is full and no file extensions or new file creation) h 288 -37588 M 6048 -37588 M (can be performed. There can be many difficult to analyze) h 288 -38988 M 6048 -38988 M (failures occurring on a system with full disks because) h 288 -40388 M 6048 -40388 M (logs can not be created on the full disk. It may not be) h 288 -41788 M 6048 -41788 M (obvious that the disk is becoming full if a later job) h 288 -43188 M 6048 -43188 M (frees up space on the disk.Triggers major conclusion 3.) h 288 -44588 M (13 The indexf.sys file has been extended more   T$ DISKM010.A [DISK.A]DISKM010_UG.PS;8 Vrthan ) h 288 -45988 M 6048 -45988 M (*_indexf_extents and there is danger that the map area) h 288 -47388 M 6048 -47388 M (of the file header could fill up. This file is limited) h 288 -48788 M 6048 -48788 M (to one header which means that all file creation and) h 288 -50188 M 6048 -50188 M (extending will fail until a header is freed when the) h 288 -51588 M 6048 -51588 M (map area is filled and the free headers are used. ) h 288 -52988 M 6048 -52988 M (Deleting files can buy a little time until the disk) h 288 -54388 M 6048 -54388 M (refresh can be done to compress the indexf.sys extents.) h 288 -55788 M 6048 -55788 M (Triggers major conclusion 1.) h 288 -57188 M (14 All of the references to *_xxx_xxx are referring to the) h 288 -58588 M 6048 -58588 M (variables in frag_summary.com that can be customized to) h 288 -59988 M 6048 -59988 M (your disks and thresholds.) h 288 -63038 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide Page ) h (18 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 19 19 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (Frag_summary.sum Example) h 21487 -1638 M 288 -4388 M 288 -5788 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1200 o f (The following example is FRAG_SUMMARY.SUM produced by the ) h 288 -7188 M (command procedure FRAG_SUMMARY.COM. This report is just a) h 288 -8588 M (listing of the disks requiring actions that could be handled by) h 288 -9988 M (the operations department.) h 288 -11238 M n 0.833 o f ( ) h 288 -12438 M ( Disk analysis for _$1$DIA0:) h 0.0 437.0 m (1) h 0 -437.0 m ( Logical name VAXVMSRL05) h 0.0 437.0 m (2) h 0 -437.0 m ( from node VS2) h 0.0 437.0 m (3) h 0 -437.0 m ( ) h 288 -13638 M (THIS DISK SHOULD BE REFRESHED USING BACKUP/IMAGE) h 0.0 437.0 m (4) h 0 -437.0 m 288 -14838 M (FILES SHOULD BE PURGED, DELETED OR MOVED TO ANOTHER DISK TO FREE UP SPACE) h 0.0 437.0 m (5) h 0 -437.0 m 288 -16038 M ( ) h 288 -17238 M ( Disk analysis for _$1$DIA1: Logical name USERDISK from node VS2 ) h 288 -18438 M (FILES SHOULD BE PURGED, DELETED OR MOVED TO ANOTHER DISK TO FREE UP SPACE) h 288 -19638 M ( ) h 288 -20988 M n 1.200 o f (1 Physical device name) h 288 -22388 M (2 Logical device name) h 288 -23788 M (3 Node on which the report was generated) h 288 -25188 M (4 This disk satisfied fragmentation criteria and should be) h 288 -26588 M 6048 -26588 M (scheduled for a refresh.) h 288 -27988 M (5 This disk has less free space than required and space needs to) h 288 -29388 M 6048 -29388 M (be freed up or the device needs to be replaced with a ) h 288 -30788 M 6048 -30788 M (larger volume \(RA90 to RA92, add a volume set member\).) h 288 -33838 M -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide Page ) h (19 ) h 288 -4026 M -7095 73629 T showpage $P e %%Page: 20 20 /$P a D g N 0 79200 T 7200 -7200 T N 0 G 288 -1638 M /Times-Roman-ISOLatin1 $ /Times-Roman & P /Times-Roman-ISOLatin1 F 1800 o f (Weekly_hot_files.rpt Example) h 22385 -1638 M 288 -4388 M 288 -5788 M /Courier-ISOLatin1 $ /Courier & P /Courier-ISOLatin1 F 1200 o f (The following example is WEEKLY_HOT_FILES.RPT produced by the ) h 288 -7188 M (command procedure WEEKLY_HOT_FILES.COM if VPA or DECps is) h 288 -8588 M (installed on the system.) h 288 -9988 M 288 -11238 M n 0.833 o f (This report summarizes last week's hotfiles by disk and updates a history) h 288 -12438 M (file) h 288 -13638 M ( ) h 288 -14838 M (VPA V2.1 Performance CLUSTER XXXXXX) h 0.0 437.0 m (1) h 0 -437.0 m 288 -16038 M ( Evaluation 19AUG91 00:00 to 23AUG91 23:59) h 0.0 437.0 m (2) h 0 -437.0 m 288 -17238 M 288 -18438 M ( IO Rate % % Peak) h 288 -19638 M ( \255\255\255\255\255\255\255\255\255 Ops Ops Time Rec) h 288 -20838 M (Dev Totl Peak Rds Spl DD\255HH:MM Cnt File spec) h 288 -22038 M (\255\255\255 \255\255\255\255 \255\255\255\255 \255\255\255 \255\255\255 \255\255\255\255\255\255\255\255 \255\255\255 \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255) h (\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255) h 288 -23238 M (Hotfiles on disk XXX158) h 0.0 437.0 m (3) h 0 -437.0 m ( \($2$DUA104\)) h 0.0 437.0 m (4) h 0 -437.0 m 288 -24438 M ( 27.8) h 0.0 437.0 m (5) h 0 -437.0 m (50.9) h 0.0 437.0 m (6) h 0 -437.0 m (100) h 0.0 437.0 m (7) h 0 -437.0 m ( 2) h 0.0 437.0 m (8) h 0 -437.0 m (20\25513:02) h 0.0 437.0 m (9) h 0 -437.0 m (126) h 0.0 437.0 m (10) h 0 -437.0 m ([LABDATA.CP] DB114.SSD;26) h 0.0 437.0 m (11) h 0 -437.0 m 288 -25638 M ( This 83928) h 0.0 437.0 m (12) h 0 -437.0 m ( block file has 4) h 0.0 437.0 m (13) h 0 -437.0 m ( file headers and 302) h 0.0 437.0 m (14) h 0 -437.0 m ( file extents) h 288 -26838 M ( ) h 288 -28038 M ( 25.0 51.3 50 0 22\25509:14 91 [LABDATA.CP] DB113SC.SSD;1) h 288 -29238 M ( This file is not listed as a badly fragmented file) h 0.0 437.0 m (15) h 0 -437.0 m 288 -30438 M ( ) h 288 -31638 M ( 23.9 49.9 100 1 23\25513:30 105 [LABDATA.CP] DB113.SSD;27) h 288 -32838 M ( This 73986 block file has 2 file headers and 137 file extents) h 288 -34038 M ( ) h 288 -35238 M ( 23.9 51.1 100 0 22\25509:20 114 [LABDATA.CP] DB114SC.SSD;1) h 288 -36438 M ( This file is not listed as a badly fragmented file) h 288 -37638 M ( ) h 288 -38988 M 288 -40388 M n 1.200 o f (1 Node on which the report was generated) h 288 -41788 M (2 Data collection period used to create report) h 288 -43188 M (3 Logical disk name) h 288 -44588 M (4 Physical disk name) h 288 -45988 M (5 Ave I/O's per second generated by this file when the disk was) h 288 -47388 M 6048 -47388 M ("hot" \(VPA default is a disk queue > .33\).) h 288 -48788 M (6 Peak I/O's per sec this file generated when the disk was hot) h 288 -50188 M (7 Percentage of Read I/O's out of Total I/O's) h 288 -51588 M (8 Percentage of Split I/O's out of Total I/O's) h 288 -52988 M (9 Date and time that the peak I/O rate was observed 20\255AUG 13:02) h 288 -54388 M (10 Number of two minute intervals in which the disk was hot and) h 288 -55788 M 6048 -55788 M (this file had I/O activity. Very hot file have high I/O) h 288 -57188 M 6048 -57188 M (rates over many intervals.) h 288 -58588 M (11 Filename and the directory where it resides) h 288 -59988 M (12 File size in blocks) h 288 -61388 M (13 Number of file headers, more than one header is an extension) h 288 -62788 M (14 Number of File System Extents make up the file) h 288 -64188 M (15 This file was not listed in a .frag report or .frag not found) h -7200 7200 T 7095 -73629 T N 0 G 288 -1188 M 288 -2588 M /Times-Roman-ISOLatin1 F 1200 o f (DECdiskmanagement v1.0 Users Guide Page ) h (20 ) h 288 -4026 M -7095 73629 T showpage $P e %%Trailer $D restore end % DEC_WRITE_dict %%Pages: 20 %%DocumentFonts: Times-Roman %%+ Helvetica-Bold %%+ Courier *[DISK.A]DISKMANAGEMENTIVP.COM;3+, ./ 4N- 0123KPWO5367 '<^89GHJ2$ ! COPYRIGHT (C) 1992 BY=$ ! DIGITAL EQUIPMENT CORPORATION, MAYNARD<$ ! MASSACHUSETTS. ALL RIGHTS RESERVED.$ !J$ ! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIEDM$ ! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE INCLUSIONF$ ! OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIESI$ ! THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHERN$ ! PERSON. NO TITLE ˬ$ DISKM010.A  [DISK.A]DISKMANAGEMENTIVP.COM;3N\ TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.$ !M$ ! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ANDN$ ! SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.$ !H$ ! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS;$ ! SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.$ !N$ !***************************************************************************$ !*$@SYS$MANAGER:DISK_MANAGEMENT_LOGICALS.COM,$SET COMMAND DISK$MANAGEMENT:REVIEW_DISK.CLDG$REVIEW_DISK/out=disk$management:disk_management_ivp.rpt SYS$SYSDEVICE:-$type disk$management:disk_management_ivp.rpt$exit*[DISK.A]DISK_HISTORY.DAT;2+,z ./ 4- 0123KPWO5(6`]=7`'<^89GHJ*[DISK.A]DM_MAIL.DIS;2+, ./ 4- 0123KPWO5D6t͔7'<^89GHJSYSTEM*[DISK.A]FILE_HISTORY.DAT;2+,{ ./ 4- 0123KPWO5(6ʃh=7`Z'<^89GHJ*[DISK.A]KITINSTAL.COM;24+,< ./ 4P- 0123KPWO5$6야hg7'<^89GHJ2$ ! COPYRIGHT (C) 1992 BY=$ ! DIGITAL EQUIPMENT CORPORATION, MAYNARD<$ ! MASSACHUSETTS. ALL RIGHTS RESERVED.$ !J$ ! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIEDM$ ! ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE INCLUSIONF$ ! OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIESI$ ! THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHERN$ ! PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY TRANSFERRED.$ !M$ ! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ANDN$ ! SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.$ !H$ ! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS;$ ! SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY DIGITAL.$ !N$ !***************************************************************************$ ! $!set verify,$! KITINSTAL.COM - for DISK_MANAGEMENT ASSET$!*$ On Control_Y Then Vmi$Callback CONTROL_Y$ On Warning Then Exit $Status.$ If P1 .eqs. "VMI$_INSTALL" then goto Install&$ If P1 .eqs. "VMI$_IVP" then goto Ivp$ Exit VMI$_UNSUPPORTED$ $ Install:$set def vmi$kwd:$ Type Sys$InputP--------------------------------------------------------------------------------IThis procedure installs the Digital Equipment Corporation Disk ManagementMAsset package. This procedure does not do a system-wide install of the Asset,Lbut provides a command procedure to allow individual users to use the tools.NExecuting the command procedure ($@sys$manager:disk_management_logicals) will Oallow you to issue the REVIEW_DISK command. See the documentation provided withMThe Asset or print the on-line postscript file sys$manager:disk_management.ps1for more information on the disk_management tool.P--------------------------------------------------------------------------------$!check vms version$!.$vmi$callback check_vms_version version_ok 050.$if version_ok .eq. 1 then goto vms_version_ok$!$!bad version number$!#$vmi$callback message i badvmsver -F"this asset has not been tested with a VMS version prior to VMS v5.0" $!%$!ask if they want to continue anyway$!F$vmi$callback ask goon "Do you want to attempt to continue" "NO" b,r,u'$if (.not. goon) then exit vmi$_failure$vms_version_ok:$!$create_directory:)$dire :== sys$sysdevice:[disk$management]$vmi$callback ask dire -0"Where do you want to install the kit" "''dire'"*$vmi$callback create_directory user 'dire' $ask_decps:$!$vmi$callback ask decps -@"Do you have (D)ECps, (V)pa or (N)either on this system" "N" s,uL$if ((decps .eqs. "D") .or. (decps .eqs. "V") .or. (decps .eqs. "N")) then - goto decps_ok$type sys$input/ Enter "D" if DECps is installed on this system- "V" if VPA is installed on this system> "N" if neither DECps or VPA is installed on this system$goto ask_decps $decps_ok:$ Vmi$Callback SET IVP ask$ Vmi$Callback SET PURGE ASK$!$type sys$inputG No more questions will be asked and the install should complete within 10 minutes.4$open/write com vmi$kwd:disk_management_logicals.com,$write com "$define disk$management ''dire'"8$write com "$set command disk$management:review_disk.cld$write com "$exit" $close comO$vmi$callback provide_file diskm disk_management_logicals.com vmi$root:[sysmgr]$!$! saveset b is the decps kit$! saveset c is the vpa kit%$! saveset d is the neither/novpa kit$!-$if (decps .eqs. "D") then goto decps_install+$if (decps .eqs. "V") then goto vpa_install-$if (decps .eqs. "N") then goto novpa_install$decps_install:$vmi$callback restore_saveset B$!find sys$library:PSPA$LIB.FORD$vmi$callback find_file cilib pspa$lib.for vmi$root:[syslib] s found$if (found .eqs. "E") then -? vmi$callback provide_file cilib pspa$lib.for vmi$root:[syslib]F$link/executable=vmi$kwd:review_disk.exe vmi$kwd:review_disk_decps.obj7$Vmi$Callback PROVIDE_IMAGE Exe$ review_disk.exe 'dire';$copy vmi$kwd:review_disk_decps.cld vmi$kwd:review_disk.cld6$Vmi$Callback PROVIDE_FILE Cld$ review_disk.cld 'dire'@$Vmi$Callback PROVIDE_FILE doc$ diskm010_ug.ps vmi$root:[sysmgr]@$Vmi$Callback PROVIDE_FILE doc$ diskm010_ig.ps vmi$root:[sysmgr]7$Vmi$Callback PROVIDE_FILE Com$ frag_summary.com 'dire';$Vmi$Callback PROVIDE_FILE Com$ review_all_disks.com 'dire'6$Vmi$Callback PROVIDE_FILE Com$ review_disk.com 'dire';$Vmi$Callback PROVIDE_FILE Com$ weekly_hot_files.com 'dire'7$Vmi$Callback PROVIDE_FILE dat$ disk_history.dat 'dire'7$Vmi$Callback PROVIDE_FILE dat$ file_history.dat 'dire'2$Vmi$Callback PROVIDE_FILE dis$ dm_mail.dis 'dire'H$Vmi$Callback PROVIDE_FILE ivp$ diskmanagementivp.com vmi$root:[systest]$goto endinstall $vpa_install:$vmi$callback restore_saveset C$!find sys$library:VPA$LIB.FORC$vmi$callback find_file cilib vpa$lib.for vmi$root:[syslib] s found$if (found .eqs. "E") then -> vmi$callback provide_file cilib vpa$lib.for vmi$root:[syslib]D$link/executable=vmi$kwd:review_disk.exe vmi$kwd:review_disk_vpa.obj9$copy vmi$kwd:review_disk_vpa.cld vmi$kwd:review_disk.cld6$Vmi$Callback PROVIDE_FILE Cld$ review_disk.cld 'dire'@$Vmi$Callback PROVIDE_FILE doc$ diskm010_ug.ps vmi$root:[sysmgr]@$Vmi$Callback PROVIDE_FILE doc$ diskm010_ig.ps vmi$root:[sysmgr]7$Vmi$Callback PROVIDE_IMAGE Exe$ review_disk.exe 'dire'7$Vmi$Callback PROVIDE_FILE Com$ frag_summary.com 'dire';$Vmi$Callback PROVIDE_FILE Com$ review_all_disks.com 'dire'6$Vmi$Callback PROVIDE_FILE Com$ review_disk.com 'dire';$Vmi$Callback PROVIDE_FILE Com$ weekly_hot_files.com 'dire'7$Vmi$Callback PROVIDE_FILE dat$ disk_history.dat 'dire'7$Vmi$Callback PROVIDE_FILE dat$ file_history.dat 'dire'2$Vmi$Callback PROVIDE_FILE dis$ dm_mail.dis 'dire'H$Vmi$Callback PROVIDE_FILE ivp$ diskmanagementivp.com vmi$root:[systest]$goto endinstall$novpa_install:$vmi$callback restore_saveset DF$link/executable=vmi$kwd:review_disk.exe vmi$kwd:review_disk_novpa.obj7$Vmi$Callback PROVIDE_IMAGE Exe$ review_disk.exe *ٺ$ DISKM010.A<  [DISK.A]KITINSTAL.COM;24P 'dire';$copy vmi$kwd:review_disk_novpa.cld vmi$kwd:review_disk.cld6$Vmi$Callback PROVIDE_FILE Cld$ review_disk.cld 'dire'@$Vmi$Callback PROVIDE_FILE doc$ diskm010_ug.ps vmi$root:[sysmgr]@$Vmi$Callback PROVIDE_FILE doc$ diskm010_ig.ps vmi$root:[sysmgr]7$Vmi$Callback PROVIDE_FILE Com$ frag_summary.com 'dire';$Vmi$Callback PROVIDE_FILE Com$ review_all_disks.com 'dire'6$Vmi$Callback PROVIDE_FILE Com$ review_disk.com 'dire'7$Vmi$Callback PROVIDE_FILE dat$ disk_history.dat 'dire'7$Vmi$Callback PROVIDE_FILE dat$ file_history.dat 'dire'2$Vmi$Callback PROVIDE_FILE dis$ dm_mail.dis 'dire'H$Vmi$Callback PROVIDE_FILE ivp$ diskmanagementivp.com vmi$root:[systest]$! $endinstall:$ Exit Vmi$_success$ivp:!$ On Control_Y Then goto err_exit$ On Warning Then goto err_exit$type sys$input7 Starting the Installation Verification Procedure (IVP)+$@sys$common:[systest]diskmanagementivp.com $done_ivp:$ Exit Vmi$_success $err_exit:$ exit vmi$_failure*[DISK.A]REVIEW_DISK_DECPS.CLD;1+, ./ 4L- 0123KPWO5C64e#7'<^89GHJDEFINE VERB REVIEW_DISK( IMAGE DISK$MANAGEMENT:REVIEW_DISK.EXEDPARAMETER P1,LABEL=DEVICE,VALUE(REQUIRED,TYPE=$DEVICE),PROMPT="Disk"QUALIFIER NODE,VALUEQUALIFIER WINDOW,VALUEQUALIFIER HISTWINDOW,VALUELQUALIFIER BEGINNING,DEFAULT,VALUE (DEFAULT="YESTERDAY+08:00",TYPE=$DATETIME)IQUALIFIER ENDING,DEFAULT,VALUE (DEFAULT="YESTERDAY+17:00",TYPE=$DATETIME)HQUALIFIER OUTPUT,DEFAULT,VALUE (DEFAULT="REVIEW_DISK.RPT",TYPE=$OUTFILE)*[DISK.A]REVIEW_DISK_DECPS.FOR;7+,.`/ 4Q`^- 0123KPWOa56 $67@'<^89GHJCC REVIEW_DISK_DECPS.FORCC DANIEL R. BUCKLEY DECCHC THIS SOFTWARE IS SUPPLIED "AS IS" WITH NO SUPPORT IMPLIED OR OTHERWISE&C FROM DIGITAL EQUIPMENT CORPORATION. CDC THIS PROGRAM IS USED TO ANALYZE A DISK TO DETERMINE THE NUMBER OF JC BITMAP HOLES, THE LARGEST FREE BITMAP HOLE, THE AMOUNT OF FREE SPACE ANDDC A LIST OF FILES WITH THE GREATEST NUMBER OF EXTENTS AND EXTENSION KC HEADERS. IF A DECPS .CPD FILE IS (OPTIONALLY) SPECIFIED, HOTFILE AND DISK*C USAGE FROM THAT NODE WILL ALSO BE SHOWN.C9C THIS PROGRAM HAS BEEN TESTED AND WORKS ON VOLUME SETS. CCC THIS PROGRAM HAS BEEN TESTED AND WORKS ON HOST-BASED SHADOW SETS.CDC BECAUSE A STRIPESET ALLOCATES ALMOST ALL OF THE SPACE ON A DISK TOGC A DUMMY FILE TO ALLOW THE STRIPING DRIVER CONTROL OVER THE ALLOCATIONHC OF SPACE, THIS PROGAM WILL SHOW THE STRIPPED DEVICE AS HAVING 1 BITMAPDC HOLE AND FREESPACE AS EXPECTED. LOOKING AT AN INDIVIDUAL STRIPESETIC MEMBER WILL SHOW A SMALL NUMBER OF BITMAP HOLES, SMALL LARGEST HOLE ANDC ALMOST NO FREE SPACE.CJC ALMOST ALL OF THE RUN-TIME OF THIS PROGRAM IS CONSUMED IN THE INDEXF.SYS&C READING AND CHECKING OF THE HEADERS.CGC THIS PROGRAM REQUIRES THE LIBRARY SYS$LIBRARY:PSPA$LIB.FOR TO COMPILE>C (PROVIDED WITH DECPS AS THE FORTRAN DATA EXTRACTION LIBRARY)CEC THE CURRENT MAXIMUM NUMBER OF FILES THAT CAN BE REPORTED ON IS 1000CC IF YOU NEED TO INCREASE THIS CHANGE BOTH THE ARRAYS (ARRAY(1000),,C EARRAY(1000)) AND THE ARRAY_LIMIT VARIABLECJC 4/22/91 DRB MODIFIED FORMAT 804 TO AVOID OUTPUT OVERFLOW ON THE HOTFILESFC I/O RATE, ADDED AN ADDITIONAL DISK SUMMARY LINE CONTAINING I/O RATE,JC THROUGHPUT AND QUEUE INFORMATION. MODIFIED AND TESTED TO WORK WITH HBVS. PROGRAM REVIEW_DISK_DECPS IMPLICIT INTEGER*4 (A - Z) INCLUDE '($SSDEF)' INCLUDE '($IODEF)' INCLUDE '($DVIDEF)' INCLUDE '($ATRDEF)' INCLUDE '($DCDEF)' INCLUDE '($DEVDEF)' INCLUDE '($FIDDEF)' INCLUDE '($FIBDEF)' INCLUDE '($SECDEF)' INCLUDE '($SFDEF)'# INCLUDE 'SYS$LIBRARY:PSPA$LIB.FOR' INCLUDE '($CLIDEF)' INCLUDE '($SYSSRVNAM)' INCLUDE '($LNMDEF)' CHARACTER*1 NULL CHARACTER*64 HOST CHARACTER*64 VOLSETROOT CHARACTER*64 VOLSETNEXT CHARACTER*64 ALTHOST CHARACTER*32 DEV CHARACTER*64 DEVICE CHARACTER*12 VOLNAME CHARACTER*39 FILENAME CHARACTER*86 FILEN CHARACTER*25 FULLDATE CHARACTER*25 START_TIME CHARACTER*25 STOP_TIME CHARACTER*39 OUTPUT_FILE CHARACTER*4 AMINWINDOW CHARACTER*4 AHISTWINDOW CHARACTER*256 BIGFILE_STRING CHARACTER*11 DATE BYTE BITMAP(512) BYTE INDEXF(512) BYTE FINDRVN BYTE FINDNMX LOGICAL*1 BIT LOGICAL*1 LASTBIT INTEGER*2 FINDNUM INTEGER*2 FINDSEQ INTEGER*2 HIBLKL INTEGER*2 HIBLKH INTEGER*2 EFBLKL INTEGER*2 EFBLKH INTEGER*2 FILEL INTEGER*2 N0 INTEGER*2 N127 INTEGER*2 CHAN INTEGER*2 FUNC INTEGER*2 IBITMAP INTEGER*2 IDOFFSET INTEGER*2 MPOFFSET INTEGER*2 ACOFFSET INTEGER*2 RSOFFSET INTEGER*2 IIDOFFSET INTEGER*2 IMPOFFSET INTEGER*2 IACOFFSET INTEGER*2 IRSOFFSET INTEGER*2 WORDS_INUSE INTEGER*2 IWORDS_INUSE INTEGER*2 POINTER_LWORD INTEGER*2 STRUCLEVL INTEGER*2 ISTRUCLEVL INTEGER*2 STRUCLEVH INTEGER*2 ISTRUCLEVH INTEGER*2 LX INTEGER*4 BIGFILE_LENGTH INTEGER*4 BIGFILE_SIZE INTEGER*4 BLOCKS_PER_FILE INTEGER*4 TOT_EXTENTS INTEGER*4 FILE_COUNT INTEGER*4 DEL_HEADER_COUNT INTEGER*4 BAD_HEADER_COUNT INTEGER*4 NUMWINDOW INTEGER*4 NUMEXTENTS INTEGER*4 AHISTWINDOW_SIZE INTEGER*4 VOLSET INTEGER*4 VOLSETNUM INTEGER*4 VOLSETCNT INTEGER*4 HIST_YEAR INTEGER*4 HIST_MONTH INTEGER*4 HIST_DAY INTEGER*4 STATUS INTEGER*4 DLENGTH INTEGER*4 VLENGTH INTEGER*4 PSPA$OPEN_CONTEXT INTEGER*4 PSPA$READ_CONTEXT INTEGER*4 PSPA$CLOSE_CONTEXT INTEGER*4 CLI$GET_VALUE INTEGER*4 CLI$PRESENT INTEGER*4 NODE_NAME_SIZE INTEGER*4 OUTPUT_FILE_SIZE INTEGER*4 WORDS INTEGER*4 FILECHAR INTEGER*4 IDSTART INTEGER*4 EXTENT_COUNT INTEGER*4 OFFSET INTEGER*4 MAX_INDEX INTEGER*4 ARRAY_LIMIT INTEGER*4 ARRAY_I  NDEX INTEGER*4 MAX_EINDEX INTEGER*4 ARRAY_EINDEX INTEGER*4 BIGFILE_ARRAY_INDEX INTEGER*4 IDEV INTEGER*4 XBYTES INTEGER*4 BTOT INTEGER*4 BFREE INTEGER*4 BUSED INTEGER*4 CURFREE INTEGER*4 BIGFREE INTEGER*4 BIGBLOCKS INTEGER*4 NUMBYTES INTEGER*4 CLUSTERS INTEGER*4 MAX_FILES INTEGER*4 MAX_LBN INTEGER*4 FREEBLOCKS INTEGER*4 TOT_MAX_LBN INTEGER*4 TOT_FREEBLOCKS INTEGER*4 CLUSTER_FACTOR INTEGER*4 BLOCKS_USED INTEGER*4 NUM_DIRS INTEGER*4 ERRCNT INTEGER*4 HOLES INTEGER*4 FREE_HEADERS INTEGER*4 WINDOWS INTEGER*4 TWOWINDOWS INTEGER*4 MINWINDOW INTEGER*4 AMINWINDOW_SIZE INTEGER*4 BEG_LEN INTEGER*4 END_LEN INTEGER*4 NUMHEADERS INTEGER*4 MAX_POINTERS INTEGER*4 MAX_HEADERS INTEGER*4 DEVCHAR INTEGER*4 DEVCLASS INTEGER*4 DEVICEL INTEGER*4 VOLSETNEXTL INTEGER*4 VOLSETROOTL INTEGER*4 VOLNAM_B INTEGER*4 MAP INTEGER*4 MPSTART INTEGER*4 FILESIZE INTEGER*4 IOCNT REAL*4 BUSY REAL*4 QLEN REAL*4 OPCNT EXTERNAL CLI$_ABSENT EXTERNAL PSPA$_NOMORE RECORD /CONTEXT/ PSPA$CTX7C DEVICE NAME FOR LIB$FID_TO_NAME RUN TIME LIBRARY CALL STRUCTURE /LIBFIDB/ BYTE COUNT CHARACTER*32 DEVICEN END STRUCTURE RECORD /LIBFIDB/ LIBFID+C SET UP THE ITEMLISTS FOR THE GETDVI CALLS STRUCTURE /GETDVI_ITEM/ STRUCTURE ITEM(12) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST END STRUCTURE RECORD /GETDVI_ITEM/ ITMLST STRUCTURE /GETDVI_ITEM2/ STRUCTURE ITEM2(5) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST2 END STRUCTURE RECORD /GETDVI_ITEM2/ ITMLST2 STRUCTURE /GETDVI_ITEM3/ STRUCTURE ITEM3(1) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST3 END STRUCTURE RECORD /GETDVI_ITEM3/ ITMLST3C IOSB FOR QIOW STRUCTURE /IOSBX/ INTEGER*2 STATUS INTEGER*2 TRANSFER INTEGER*4 DEVICE END STRUCTURE RECORD /IOSBX/ IOSBC INDEXF.SYS HOME BLOCK STRUCTURE /HOMEB/ INTEGER*4 HOMELBN INTEGER*4 ALHOMELBN INTEGER*4 ALTIDXLBN INTEGER*2 STRUCLEV INTEGER*2 CLUSTER INTEGER*2 HOMEVBN INTEGER*2 ALHOMEVBN INTEGER*2 ALTIDXVBN INTEGER*2 IBMAPVBN INTEGER*4 IBMAPLBN INTEGER*4 MAXFILES INTEGER*2 IBMAPSIZE INTEGER*2 RESFILES INTEGER*2 DEVTYPE INTEGER*2 RVN INTEGER*2 SETCOUNT INTEGER*2 VOLCHA/5$ DISKM010.A [DISK.A]REVIEW_DISK_DECPS.FOR;7Q`"R INTEGER*4 VOLOWNER INTEGER*4 RESERVED1 INTEGER*2 PROTECT INTEGER*2 FILEPROT INTEGER*2 RESERVED2 INTEGER*2 CHECKSUM1 CHARACTER*8 CREDATE BYTE WINDOW BYTE LRU_LIM INTEGER*2 EXTEND CHARACTER*440 FILLER END STRUCTURE RECORD /HOMEB/ HOMEC INDEXF.SYS FILE HEADER BLOCK STRUCTURE /HEADERB/ BYTE IDOFFSET BYTE MPOFFSET BYTE ACOFFSET BYTE RSOFFSET INTEGER*2 SEG_NUM UNION MAP INTEGER*2 STRUCLEV END MAP MAP BYTE STRUCLEVL BYTE STRUCLEVH END MAP END UNION STRUCTURE FID INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ BYTE EXFIDRVN BYTE EXFIDNMX END STRUCTURE UNION MAP CHARACTER*32 RECATTR END MAP MAP INTEGER*2 IRECATTR(16) END MAP END UNION INTEGER*4 FILECHAR INTEGER*2 RESERVED1 BYTE MAP_INUSE BYTE ACC_MODE INTEGER*4 FILEOWNER INTEGER*2 FILEPROT STRUCTURE BCKFID INTEGER*2 BCKFIDNUM  INTEGER*2 BCKFIDSEQ BYTE BCKFIDRVN BYTE BCKFIDNMX END STRUCTURE BYTE JOURNAL BYTE RU_ACTIVE INTEGER*2 RESERVED2 INTEGER*4 HIGHWATER UNION MAP BYTE DATA(430) END MAP MAP CHARACTER*430 CHAR END MAP MAP INTEGER*2 INT(215) END MAP MAPEC THE RESERVED AREA (#3) AND CLASS_PROT FIELDS ARE NOT CURRENTLY USEDBC BY FILES-11 SO THE IDENT AREA STARTS IMMEDIATELY AFTER HIGHWATERC CHARACTER*8 RESERVED3C CHARACTER*20 CLASS_PROTC CHARACTER*20 FILENAME1 INTEGER*2 REVISION CHARACTER*8 CREDATE CHARACTER*8 REVDATE CHARACTER*8 EXPDATE CHARACTER*8 BAKDATE CHARACTER*66 FILENAME2 CHARACTER*310 REST_OF_HEADER END MAP END UNION INTEGER*2 CHECKSUM END STRUCTURE RECORD /HEADERB/ HEADER STRUCTURE /BIGFILEARRAY/ CHARACTER*86 FILENAME CHARACTER*8 REVDATE  INTEGER*4 FILESIZE END STRUCTURE+ RECORD /BIGFILEARRAY/ BIG_FILE_ARRAY(1000) STRUCTURE /INDEXFARRAY/ STRUCTURE FID INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ BYTE EXFIDRVN BYTE EXFIDNMX END STRUCTURE CHARACTER*86 FILENAME INTEGER*4 EXTENTS INTEGER*4 HEADERS INTEGER*4 FILESIZE INTEGER*4 HOTFILES REAL*4 HOTFILES_IO END STRUCTURE! RECORD /INDEXFARRAY/ ARRAY(1000) RECORD /INDEXFARRAY/ HOLDARRAY STRUCTURE /EXTENTARRAY/ STRUCTURE FID INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ BYTE EXFIDRVN BYTE EXFIDNMX END STRUCTURE INTEGER*4 EXTENTS END STRUCTURE" RECORD /EXTENTARRAY/ EARRAY(1000) RECORD /FIBDEF/ FIBD STRUCTURE /FIB1/ INTEGER*2 COUNT INTEGER*2 FILLER INTEGER*4 FIBLOC END STRUCTURE RECORD /FIB1/ FIB STRUCTURE /FIDB/ INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE RECORD /FIDB/ FID Structure / str_disk / Character*12 DEV_T_VOLNAME Character*15 DEV_T_DEVNAME7 Character*6 DEV_T_NODENAME ! disk server node name7 Character*40 DEV_T_HWNAME ! CPU type of disk owner Byte DEV_B_DEV_TYPE. Real*4 DEV_F_SERVICE ! Service time (ms)& Real*4 DEV_F_QLEN ! Queue length* Real*4 DEV_F_OPCNT ! Operations rate, Real*4 DEV_F_IOCNT ! Thruput byte rate, Real*4 DEV_F_PAGOP ! Paging operations. Real*4 DEV_F_PAGIO ! Paging thruput rate2 Real*4 DEV_F_SWPOP ! Swapping operation rate0 Real*4 DEV_F_SWPIO ! Swapping thruput rate( Real*4 DEV_F_BUSY ! Busy time (ms)$ Real*4 DEV_F_RDCNT ! Read rate* Real*4 DEV_F_FREE ! Free block count0 Real*4 DEV_F_MSCPOP ! MSCP operations rate5 Real*4 DEV_F_MSCPPG ! MSCP paging/swapping rate- Real*4 DEV_F_MSCPIO ! MSCP thruput rate( Real*4 DEV_F_SPLIT ! Split IO rate End Structure! Record / str_disk / COM_SUM$DEV Common / COM$CTX / PSPA$CTX& Common / COM$ARRAY / ARRAY,MAX_INDEX. Common / COM$FIL / COM_SUM$FIL, com$fil_cnt. Common / COM$MET / COM_SUM$MET, com$met_cnt- Common / COM$DEV / COM_SUM$DEV, com$dev_cnt. Common / COM$CPU / COM_SUM$CPU, com$cpu_cnt, 1 com$multi_cpu. Common / COM$PAR / COM_SUM$PAR, com$par_cntC CODE STARTS HEREDC ARRAY_LIMIT SHOULD BE SET TO THE SIZE OF THE ARRAY(), EARRAY() ANDC BIG_FILE_ARRAY() ARRAY_LIMIT = 1000 TOT_MAX_LBN = 0 TOT_FREEBLOCKS = 0 FILE_COUNT = 0 TOT_EXTENTS = 0 DEL_HEADER_COUNT = 0 BAD_HEADER_COUNT = 0 NUMHEADERS = 0 BIGFILE_ARRAY_INDEX = 1 ARRAY_INDEX = 1 ARRAY_EINDEX = 1C SETUP DECPS CONTEXT RECORD; PSPA$CTX.CTX$T_SCHED_SUN = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_MON = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_TUE = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_WED = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_THU = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_FRI = CHAR(255)//CHAR(255)//CHAR(255); PSPA$CTX.CTX$T_SCHED_SAT = CHAR(255)//CHAR(255)//CHAR(255)C BUILD GETDVI ITMLST ITMLST.ITEM(1).BUFLEN = 4& ITMLST.ITEM(1).BUFCODE = DVI$_CLUSTER+ ITMLST.ITEM(1).ADDR = %LOC(CLUSTER_FACTOR) ITMLST.ITEM(1).ADDRLEN = 0 ITMLST.ITEM(2).BUFLEN = 4& ITMLST.ITEM(2).BUFCODE = DVI$_DEVCHAR$ ITMLST.ITEM(2).ADDR = %LOC(DEVCHAR) ITMLST.ITEM(2).ADDRLEN = 0 ITMLST.ITEM(3).BUFLEN = 4' ITMLST.ITEM(3).BUFCODE = DVI$_DEVCLASS% ITMLST.ITEM(3).ADDR = %LOC(DEVCLASS) ITMLST.ITEM(3).ADDRLEN = 0 ITMLST.ITEM(4).BUFLEN = 4% ITMLST.ITEM(4).BUFCODE = DVI$_ERRCNT# ITMLST.ITEM(4).ADDR = %LOC(ERRCNT) ITMLST.ITEM(4).ADDRLEN = 0 ITMLST.ITEM(5).BUFLEN = 4) ITMLST.ITEM(5).BUFCODE = DVI$_FREEBLOCKS' ITMLST.ITEM(5).ADDR = %LOC(FREEBLOCKS) ITMLST.ITEM(5).ADDRLEN = 0 ITMLST.ITEM(6).BUFLEN = 64) ITMLST.ITEM(6).BUFCODE = DVI$_FULLDEVNAM# ITMLST.ITEM(6).ADDR = %LOC(DEVICE)' ITMLST.ITEM(6).ADDRLEN = %LOC(DEVICEL) ITMLST.ITEM(7).BUFLEN = 4' ITMLST.ITEM(7).BUFCODE = DVI$_MAXBLOCK$ ITMLST.ITEM(7).ADDR = %LOC(MAX_LBN) ITMLST.ITEM(7).ADDRLEN = 0 ITMLST.ITEM(8).BUFLEN = 4' ITMLST.ITEM(8).BUFCODE = DVI$_MAXFILES& ITMLST.ITEM(8).ADDR = %LOC(MAX_FILES) ITMLST.ITEM(8).ADDRLEN = 0 ITMLST.ITEM(9).BUFLEN = 4' ITMLST.ITEM(9).BUFCODE = DVI$_TRANSCNT% ITMLST.ITEM(9).ADDR = %LOC(TRANSCNT) ITMLST.ITEM(9).ADDRLEN = 0 ITMLST.ITEM(10).BUFLEN = 12& ITMLST.ITEM(10).BUFCODE = DVI$_VOLNAM% ITMLST.ITEM(10).ADDR = %LOC(VOLNAME)) ITMLST.ITEM(10).ADDRLEN = %LOC(VOLNAM_B) ITMLST.ITEM(11).BUFLEN = 64- ITMLST.ITEM(11).BUFCODE = DVI$_ALT_HOST_NAME% ITMLST.ITEM(11).ADDR = %LOC(ALTHOST) ITMLST.ITEM(11).ADDRLEN = 0 ITMLST.ITEM(12).BUFLEN = 64) ITMLST.ITEM(12).BUFCODE = DVI$_HOST_NAME" ITMLST.ITEM(12).ADDR = %LOC(HOST) ITMLST.ITEM(12).ADDRLEN = 0 END_OF_LIST = 0  ITMLST2.ITEM2(1).BUFLEN = 4* ITMLST2.ITEM2(1).BUFCODE = DVI$_VOLNUMBER( ITMLST2.ITEM2(1).ADDR = %LOC(VOLSETNUM) ITMLST2.ITEM2(1).ADDRLEN = 0 ITMLST2.ITEM2(2).BUFLEN = 64+ ITMLST2.ITEM2(2).BUFCODE = DVI$_NEXTDEVNAM) ITMLST2.ITEM2(2).ADDR = %LOC(VOLSETNEXT)- ITMLST2.ITEM2(2).ADDRLEN = %LOC(VOLSETNEXTL) ITMLST2.ITEM2(3).BUFLEN = 4) ITMLST2.ITEM2(3).BUFCODE = DVI$_VOLCOUNT( ITMLST2.ITEM2(3).ADDR = %LOC(VOLSETCNT) ITMLST2.ITEM2(3).ADDRLEN = 0 ITMLST2.ITEM2(4).BUFLEN = 4* ITMLST2.ITEM2(4).BUFCODE = DVI$_VOLSETMEM% ITMLST2.ITEM2(4).ADDR = %LOC(VOLSET) ITMLST2.ITEM2(4).ADDRLEN = 0 ITMLST2.ITEM2(5).BUFLEN = 64+ ITMLST2.ITEM2(5).BUFCODE = DVI$_ROOTDEVNAM) ITMLST2.ITEM2(5).ADDR = %LOC(VOLSETROOT). ITMLST2.ITEM2(5).ADDRLEN = %LOC(VOLSETROOTL) END_OF_LIST2 = 0  ITMLST3.ITEM3(1).BUFLEN = 256' ITMLST3.ITEM3(1).BUFCODE = LNM$_STRING- ITMLST3.ITEM3(1).ADDR = %LOC(BIGFILE_STRING)0 ITMLST3.ITEM3(1).ADDRLEN = %LOC(BIGFILE_LENGTH) END_OF_LIST3 = 0  C(C Get parameters and qualifiers from DCLC IF(CLI$PRESENT('DEVICE')) THEN$ STATUS = CLI$GET_VALUE ('DEVICE', 2 DEV, 2 IDEV)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) ELSE$ TYPE *,'No Disk device specified' GOTO 999 END IF IF(CLI$PRESENT('NODE')) THEN" STATUS = CLI$GET_VALUE ('NODE', 2 PSPA$CTX.CTX$T_NODENAME, 2 NODE_NAME_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))* PSPA$CTX.CTX$B_NODELEN = NODE_NAME_SIZE(C TYPE *, PSPA$CTX.CTX$T_NODENAME(1:6) ELSE% PSPA$CTX.CTX$T_NODENAME = ' '> TYPE *,'Nf $ DISKM010.A [DISK.A]REVIEW_DISK_DECPS.FOR;7Q`la"o node specified, DECPS data will not be included' END IF MINWINDOW = 0 IF(CLI$PRESENT('WINDOW')) THEN$ STATUS = CLI$GET_VALUE ('WINDOW', 2 AMINWINDOW, 2 AMINWINDOW_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))? STATUS = LIB$CVT_DTB(%VAL(AMINWINDOW_SIZE),%REF(AMINWINDOW), 1 %REF(MINWINDOW))3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF NUMWINDOW = 2# IF(CLI$PRESENT('HISTWINDOW')) THEN( STATUS = CLI$GET_VALUE ('HISTWINDOW', 2 AHISTWINDOW, 2 AHISTWINDOW_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))A STATUS = LIB$CVT_DTB(%VAL(AHISTWINDOW_SIZE),%REF(AHISTWINDOW), 1 %REF(NUMWINDOW))3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF IF(CLI$PRESENT('OUTPUT')) THEN$ STATUS = CLI$GET_VALUE ('OUTPUT', 2 OUTPUT_FILE, 2 OUTPUT_FILE_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF" IF(CLI$PRESENT('BEGINNING')) THEN' STATUS = CLI$GET_VALUE ('BEGINNING', 2 START_TIME,BEG_LEN)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))> CALL SYS$BINTIM(START_TIME(1:BEG_LEN),PSPA$CTX.CTX$L_START)C TYPE *,START_TIMEL END IFT IF(CLI$PRESENT('ENDING')) THENI$ STATUS = CLI$GET_VALUE ('ENDING', 2 STOP_TIME,END_LEN)H3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))E< CALL SYS$BINTIM(STOP_TIME(1:END_LEN),PSPA$CTX.CTX$L_STOP)C TYPE *,STOP_TIME END IFI@C GET THE MINIMUM SIZE TO LIST IN THE BIGFILE LIST (DEF = 50000)B STATUS = SYS$TRNLNM(,'LNM$PROCESS_TABLE','BIGFILE_SIZE',,ITMLST3),C TYPE *,' RETURN FROM SYS$TRNLNM = ',STATUS@C STATUS OF 444 IS %SYSTEM-F-NOLOGNAM (LOGICAL NAME NOT DEFINED) IF (STATUS .EQ. 444) THEN BIGFILE_LENGTH = 0 ELSE 2 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) ENDIF IF (BIGFILE_LENGTH .EQ. 0) THEN BIGFILE_SIZE = 50000 ELSE  B STATUS = LIB$CVT_DTB(%VAL(BIGFILE_LENGTH),%REF(BIGFILE_STRING), 1 %REF(BIGFILE_SIZE))3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))  ENDIF+C GET THE CURRENT DATE FOR HISTORY RECORDS * CALL IDATE(HIST_MONTH,HIST_DAY,HIST_YEAR)*C OPEN OUTPUT FILE (DISK AND FILE SUMMARY)4 OPEN(UNIT=1,FILE=OUTPUT_FILE,STATUS='NEW',RECL=132);C OPEN DISK HISTORY FILE (DATED HISTORY OF DISK PARAMETERS) F OPEN(UNIT=4,FILE='DISK_HISTORY.DAT',STATUS='UNKNOWN',ACCESS='APPEND',+ 2 RECL=178,INITIALSIZE=500,EXTENDSIZE=100)SIC OPEN FILE HISTORY FILE (DATED HIST OF FILES WITH > HISTWINDOWS EXTENTS)F OPEN(UNIT=5,FILE='FILE_HISTORY.DAT',STATUS='UNKNOWN',ACCESS='APPEND',+ 2 RECL=166,INITIALSIZE=500,EXTENDSIZE=100)F"C INITIALIZE VARIABLES BEFORE LOOP LASTBIT = .TRUE.O BIGFREE = 0 CURFREE = 0 C BFREE = 0E C BUSED = 0 HOLES = 0 N127 = -1 N0 = 0H!C ASSIGN A CHANNEL TO THE DEVICE STATUS = SYS$ASSIGN(DEV,CHAN,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))$EC IF ITS A VOLUME SET WE HAVE TO START WITH THE ROOT AND LOOP THROUGH'2C THE MEMBERS FOR BOTH THE BITMAP AND INDEXF SCANS/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)$/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))CC IS IT A VOLUME SET MEMBER? IF (.NOT. VOLSET) GOTO 103$C GET RID OF CHANNEL FROM USER INPUT STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))TC START WITH THE ROOT VOLUME' STATUS = SYS$ASSIGN(VOLSETROOT,CHAN,,) / IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))RC GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)O/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))I DEV = VOLSETROOTR IDEV = VOLSETROOTLT GOTO 103T 102 CONTINUE DEV = VOLSETNEXT  IDEV = VOLSETNEXTL1 STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C assign channel to next volumeB' STATUS = SYS$ASSIGN(VOLSETNEXT,CHAN,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))G 103 CONTINUE NUMBYTES = 512SC GET THE DEVICE INFORMATION. STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))R$ TOT_MAX_LBN = TOT_MAX_LBN + MAX_LBN- TOT_FREEBLOCKS = TOT_FREEBLOCKS + FREEBLOCKSTC IS IT A DISK> IF (DEVCLASS .NE. DC$_DISK) CALL LIB$STOP(%VAL(SS$_IVDEVNAM))C IS IT MOUNTEDG: IF (.NOT. DEV$V_MNT) CALL LIB$STOP(%VAL(SS$_DEVNOTMOUNT))C MOUNTED FOREIGNB3 IF (DEV$V_FOR) CALL LIB$STOP(%VAL(SS$_DEVFOREIGN))X)C FLUSH OUT THE EXTENT CACHES ON THE DISKR FIB.COUNT = FIB$K_LENGTHN FIB.FIBLOC = %LOC(FIBD)&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL% FIBD.FIB$W_EXCTL = FIB$C_FLUSH_CACHES$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ% FIBD.FIB$L_EXSZ = FIB$C_EXTENT_CACHE FUNC = IO$_ACPCONTROL@ STATUS = SYS$QIOW(,%VAL(CHAN),%VAL(FUNC),%REF(IOSB),,,FIB,,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))I9 IF (.NOT. IOSB.STATUS) CALL LIB$STOP (%VAL(IOSB.STATUS))L&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL FIBD.FIB$W_EXCTL = 0O$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ FIBD.FIB$L_EXSZ = 0@C PROCESS BITMAP TO COUNT HOLES AND DETERMINE LARGEST FREE SPACEC FIND EOF (FILE SIZE)3 MAP = (((MAX_LBN / CLUSTER_FACTOR) + 4095) / 4096)4& CLUSTERS = (MAX_LBN / CLUSTER_FACTOR)- FILENAME = DEV(0:IDEV)//'[000000]BITMAP.SYS'GG OPEN(UNIT=2,FILE=FILENAME,READONLY,ORGANIZATION='SEQUENTIAL',RECL=512,F* 1 SHARED,RECORDTYPE='FIXED',STATUS='OLD')C SKIP HEADER RECORD READ(2,113,END=125) BITMAP113 FORMAT(512A) C BITMAP LOOPG120 READ(2,113,END=126) BITMAP0 IF (CLUSTERS .LT. 4096) NUMBYTES = CLUSTERS / 8) XBYTES = CLUSTERS - ((NUMBYTES * 8) + 1)T CLUSTERS = CLUSTERS - 40964 DO 125 K = 1,NUMBYTES IBITMAP = BITMAP(K) IF (IBITMAP .EQ. N0) THEN CURFREE = 04C BUSED = BUSED + 8 LASTBIT = .TRUE. GOTO 125 END IF IF (IBITMAP .EQ. N127) THEN CURFREE = CURFREE + 8VC BFREE = BFREE + 8 IF (LASTBIT) THENL HOLES = HOLES + 1 END IF IF (CURFREE .GT. BIGFREE) THEN BIGFREE = CURFREE END IF LASTBIT = .FALSE.B GOTO 125 END IF DO 130 LX = 0,7 BIT = BITEST(IBITMAP,LX)T IF (BIT) THEN CURFREE = CURFREE + 1SC BFREE = BFREE + 1 IF (LASTBIT) THEN  HOLES = HOLES + 1 END IF IF (CURFREE .GT. BIGFREE) THEN BIGFREE = CURFREE END IF LASTBIT = .FALSE.  ELSEC BUSED = BUSED + 1 CURFREE = 0T LASTBIT = .TRUE. END IFD 130 CONTINUE 125 CONTINUE IF (NUMBYTES .EQ. 512) GOTO 120C DO EXTRA BITSE IBITMAP = BITMAP(NUMBYTES + 1)  DO 230 LX = 0,XBYTESN BIT = BITEST(IBITMAP,LX)S IF (BIT) THEN CURFREE = CURFREE + 1C BFREE = BFREE + 1 IF (LASTBIT) THENT HOLES = HOLES + 1 END IF IF (CURFREE .GT. BIGFREE) THEN BIGFREE = CURFREE END IF LASTBIT = .FALSE.E ELSE_C BUSED = BUSED + 1 CURFREE = 0T LASTBIT = .TRUE. END IFU 230 CONTINUE(126 BIGBLOCKS = BIGFREE * CLUSTER_FACTOR C BFREE = BFREE * CLUSTER_FACTOR C BUSED = BUSED * CLUSTER_FACTORC BTOT = BFREE + BUSEDDC THIS WILL HAVE AN INCORRECT ANSWER IF THE LAST CLUSTER IS NOT FULL?C BECAUSE THE TOTAL BLOCKS IS NOT DIVISABLE BY THE CLUSTER SIZEEC WRITE(1,132)BFREE,BUSED,BTOTHC132 FORMAT(' FREE BITMAP BLOCKS = ',I8,' USED BLKS = ',I8,' TOT = ',I8) CLOSE(UNIT=2,DISPOSE='SAVE')EC LOOP IF VOLUME SET8 IF ((VOLSET) .AND. (VOLSETNUM .LT. VOLSETCNT)) GOTO 102/C DONE WITH BITMAP, START PROCESSING INDEXF.SYSLEC IF ITS A VOLUME SET WE HAVE TO START WITH THE ROOT AND LOOP THROUGHL2C THE MEMBERS FOR BOTH THE BITMAP AND INDEXF SCANSC IS IT A VOLUME SET MEMBER? IF (.NOT. VOLSET) GOTO 903E+C GET RID OF CHANNEL FROM BITMAP PROCESSING* STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))EC START WITH THE ROOT VOLUME' STATUS = SYS$ASSIGN(VOLSETROOT,CHAN,,)I/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))RC GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)B/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))  DEV = VOLSETROOTE IDEV = VOLSETROOTLS GOTO 903E 902 CONTINUE DEV = VOLSETNEXT  IDEV = VOLSETNEXTL STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C assign channel to next volumeD' STATUS = SYS$ASSIGN(VOLSETNEXT,CHAN,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) C GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,) / IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) 903 CONTINUEC FLUSH OUT FIB CACHES FIB.COUNT = FIB$K_LENGTH  FIB.FIBLOC = %LOC(FIBD)&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL% FIBD.FIB$W_EXCTL = FIB$C_FLUSH_CACHEE$C FIB$L_CNTRLVx!$ DISKM010.A [DISK.A]REVIEW_DISK_DECPS.FOR;7Q`"0AL OVERLAYS FIB$L_EXSZ" FIBD.FIB$L_EXSZ = FIB$C_FID_CACHE FUNC = IO$_ACPCONTROL@ STATUS = SYS$QIOW(,%VAL(CHAN),%VAL(FUNC),%REF(IOSB),,,FIB,,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) 9 IF (.NOT. IOSB.STATUS) CALL LIB$STOP (%VAL(IOSB.STATUS))M&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL FIBD.FIB$W_EXCTL = 0H$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ FIBD.FIB$L_EXSZ = 0(C USE DEV FROM BITMAP OR VOLUME SET LOOP- FILENAME = DEV(0:IDEV)//'[000000]INDEXF.SYS'OG OPEN(UNIT=3,FILE=FILENAME,READONLY,ORGANIZATION='SEQUENTIAL',RECL=128,E= 1 SHARED,RECORDTYPE='FIXED',STATUS='OLD',FORM='UNFORMATTED')1C READ BOOTSTRAP BLOCK READ(3,END=325) INDEXF C READ HOME BLOCK READ(3,END=325) HOMEC SAVE DEFAULT WINDOW SIZE WINDOWS = HOME.WINDOW! NUMEXTENTS = NUMWINDOW * WINDOWS * IF (MINWINDOW .EQ. 0) MINWINDOW = WINDOWS%C CALCULATE VBN OF FIRST FILE HEADER R2 HEADERADD = (CLUSTER_FACTOR * 4) + HOME.IBMAPSIZE0C LOOP TO SKIP NON-HEADER RECS (ALREADY READ 2!) DO 330 K = 3,HEADERADDI READ(3,END=330)INDEXF 330 CONTINUE 325 CONTINUEEC WE ARE NOW READY TO BUILD THE HEADER ARRAY USING THE INDEXF RECORDSB II = 0V NUMHEADERS = 0M335 READ(3,END=360)HEADERT( IF ((ARRAY_INDEX .GT. ARRAY_LIMIT) .OR.( 1 (ARRAY_EINDEX .GT. ARRAY_LIMIT)) THEN8 TYPE *,'ARRAY LIMIT REACHED, REPORT MAY BE INCOMPLETE' GOTO 360 END IF II = II + 1C CHECK FOR DELETED HEADER RECC IF ((HEADER.FID.FIDNUM .EQ. 0).AND.(HEADER.FID.FIDNMX .EQ. 0).AND.X# 1 (HEADER.FID.FIDRVN .EQ. 0)) THENA( DEL_HEADER_COUNT = DEL_HEADER_COUNT + 1C TYPE *,'HEADER FID = 0'T GOTO 335U END IFTC CHECKSUM IS 0 ON DELETED RECS! IF (HEADER.CHECKSUM .EQ. 0) THEN( DEL_HEADER_COUNT = DEL_HEADER_COUNT + 1C TYPE *,'HEADER CHECKSUM = 0' GOTO 335 END IF BC FH2$V_MARKDEL IS BIT 15 OF FH2$L_FILECHAR IS SET ON DELETED RECS FILECHAR = HEADER.FILECHAR1 IF (BJTEST(FILECHAR,15)) THEN( DEL_HEADER_COUNT = DEL_HEADER_COUNT + 1C TYPE *,'MARKDEL IS SET'E GOTO 335 END IFCC INVALID HEADER TESTS IIDOFFSET = HEADER.IDOFFSET IMPOFFSET = HEADER.MPOFFSET IACOFFSET = HEADER.ACOFFSET IRSOFFSET = HEADER.RSOFFSET& CALL MVBITS(IIDOFFSET,0,8,IDOFFSET,0)& CALL MVBITS(IMPOFFSET,0,8,MPOFFSET,0)& CALL MVBITS(IACOFFSET,0,8,ACOFFSET,0)& CALL MVBITS(IRSOFFSET,0,8,RSOFFSET,0) IWORDS_INUSE = HEADER.MAP_INUSE, CALL MVBITS(IWORDS_INUSE,0,8,WORDS_INUSE,0) ISTRUCLEVL = HEADER.STRUCLEVL( CALL MVBITS(ISTRUCLEVL,0,8,STRUCLEVL,0) ISTRUCLEVH = HEADER.STRUCLEVH( CALL MVBITS(ISTRUCLEVH,0,8,STRUCLEVH,0)/556 FORMAT(' INVALID HEADER (OFFSETS) FOR ',I8)_4557 FORMAT(' INVALID HEADER (WORDS IN USE) FOR ',I8)0558 FORMAT(' INVALID HEADER (STRUCLEV) FOR ',I8)C CHECK FOR INVALID HEADER IF (STRUCLEVL .LT. 1) THENh WRITE(*,558)II GOTO 335 END IF IF (STRUCLEVH .NE. 2) THEN_ WRITE(*,558)II GOTO 335 END IF! IF (MPOFFSET .LT. IDOFFSET) THEN4 WRITE(*,556)II GOTO 335 END IF! IF (ACOFFSET .LT. MPOFFSET) THENg WRITE(*,556)II GOTO 335 END IF! IF (RSOFFSET .LT. ACOFFSET) THENl WRITE(*,556)II GOTO 335 END IF1 IF (WORDS_INUSE .GT. (ACOFFSET - MPOFFSET)) THENC WRITE(*,557)II GOTO 335 END IFCAFC HARDCODED 40 (FIXED HEADER SIZE PLUS THE FH2$L_HIGHWATER 4 BYTES) TOJC CORRECT ERROR ON PAGE 19 OF FILE SYSTEM INTERNALS MANUAL THAT WOULD HAVEJC CAUSED ALL FILES WITH A HIGHWATER MARK OF > 80 TO SHOW UP AS BAD HEADERSCu IF ((IDOFFSET) .LT. (40)) THENM TYPE *,'IDOFFSET = ',IDOFFSETS( TYPE *,'HIGHWATER = ',HEADER.HIGHWATER) BAD_HEADER_COUNT = BAD_HEADER_COUNT + 1I FID.FIDNUM = HEADER.FID.FIDNUM FID.FIDSEQ = HEADER.FID.FIDSEQ FID.FIDRVN = HEADER.FID.FIDRVN FID.FIDNMX = HEADER.FID.FIDNMX/ STATUS = LIB$FID_TO_NAME(DEVICE,FID,FILEN,,,)B IF (.NOT. STATUS) THEN) FILEN = 'UNABLE TO DETERMINE FILENAME'U FILEL = 28  ELSE FILEL = INDEX(FILEN,':') + 1R END IF TYPE *,'BAD HEADER = ',FILEN GOTO 335 END IF2C VALID HEADER IDSTART = (2 * IDOFFSET) - 80 MPSTART = MPOFFSET - 40?C CHAIN THROUGH MAPPING POINTERS COUNTING THE NUMBER OF EXTENTS5 IF (WORDS_INUSE .EQ. 0) THENH EXTENT_COUNT = 0 GOTO 350 END IF. EXTENT_COUNT = 0R WORDS = 0 337 CONTINUE" IF (WORDS .GT. WORDS_INUSE) THEN GOTO 350 END IF2 OFFSET = MPSTART + WORDSS# POINTER_LWORD = HEADER.INT(OFFSET)M! BIT14 = BITEST(POINTER_LWORD,14)! BIT15 = BITEST(POINTER_LWORD,15)_C PLACEMENT - FORMAT 0. IF ((.NOT. BIT14).AND.(.NOT. BIT15)) GOTO 342C MAP - FORMAT 1( IF ((BIT14).AND.(.NOT. BIT15)) GOTO 344C MAP - FORMAT 2( IF ((.NOT. BIT14).AND.(BIT15)) GOTO 346C MAP - FORMAT 3" IF ((BIT14).AND.(BIT15)) GOTO 348 C ERROR... WRITE(*,341)E9341 FORMAT(' UNKNOWN RETRIEVAL POINTER FORMAT - EXITING')L GOTO 990M 342 CONTINUE WORDS = WORDS + 1 I GOTO 3374 344 CONTINUE EXTENT_COUNT = EXTENT_COUNT + 1 WORDS = WORDS + 2 GOTO 337 346 CONTINUE EXTENT_COUNT = EXTENT_COUNT + 1 WORDS = WORDS + 3 GOTO 337S 348 CONTINUE EXTENT_COUNT = EXTENT_COUNT + 1 WORDS = WORDS + 4 GOTO 337U 350 CONTINUEDC KEEP TRACK OF TOTAL NUMBER OF EXTENTS ON THE DISK (FRAGMENTATION!)) TOT_EXTENTS = TOT_EXTENTS + EXTENT_COUNT.C IF EXTENSION HEADER, SAVE IT IN EXTENT ARRAY IF (HEADER.SEG_NUM .NE. 0) THEN5 EARRAY(ARRAY_EINDEX).FID.FIDNUM = HEADER.FID.FIDNUMM5 EARRAY(ARRAY_EINDEX).FID.FIDSEQ = HEADER.FID.FIDSEQD5 EARRAY(ARRAY_EINDEX).FID.FIDRVN = HEADER.FID.FIDRVNM5 EARRAY(ARRAY_EINDEX).FID.FIDNMX = HEADER.FID.FIDNMXT? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDNUM = HEADER.EXTFID.EXFIDNUM.? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDSEQ = HEADER.EXTFID.EXFIDSEQO? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDRVN = HEADER.EXTFID.EXFIDRVN.? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDNMX = HEADER.EXTFID.EXFIDNMX- EARRAY(ARRAY_EINDEX).EXTENTS = EXTENT_COUNT MAX_EINDEX = ARRAY_EINDEXA! ARRAY_EINDEX = ARRAY_EINDEX + 1= GOTO 335 END IFBC THIS IS A PRIMARY HEADER FILE_COUNT = FILE_COUNT + 1 C FILENAME AND DIRECTORY PATH... FID.FIDNUM = HEADER.FID.FIDNUM= FID.FIDSEQ = HEADER.FID.FIDSEQ= FID.FIDRVN = HEADER.FID.FIDRVNV FID.FIDNMX = HEADER.FID.FIDNMXD C FILESIZE HIBLKL = HEADER.IRECATTR(4) HIBLKH = HEADER.IRECATTR(3)$ CALL MVBITS(HIBLKL,0,16,FILESIZE,0)% CALL MVBITS(HIBLKH,0,16,FILESIZE,16)R)C AVOID GETTING THE NAME IF WE DON'T CAREE( IF ((EXTENT_COUNT .LT. MINWINDOW) .AND.% 1 (FILESIZE .LT. BIGFILE_SIZE) .AND.V, 1 (HEADER.EXTFID.EXFIDNUM .EQ. 0)) GOTO 335 NN = -1 356 CONTINUE. STATUS = LIB$FID_TO_NAME(DEVICE,FID,FILEN,,,)< IF ((VOLSET).AND.(.NOT. STATUS).AND.(NN.LT.VOLSETCNT)) THEN NN = NN + 1 FID.FIDRVN = NN. GOTO 356 ENDIF I IF (.NOT. STATUS) THENM( FILEN = 'UNABLE TO DETERMINE FILENAME' FILEL = 28 ELSER FILEL = INDEX(FILEN,':') + 1' FILEN = FILEN(FILEL:LEN(FILEN)-FILEL)D END IF DC SAVE BIG FILES (MAY NOT BE FRAGMENTED BUT LETS KEEP TRACK OF THEM)% IF (FILESIZE .GE. BIGFILE_SIZE) THENL.C TYPE *,' BIGFILE: ',FILEN,' SIZE ',FILESIZE*C TYPE *,' FILENAME1 = ',HEADER.FILENAME1*C TYPE *,' FILENAME2 = ',HEADER.FILENAME26 BIG_FILE_ARRAY(BIGFILE_ARRAY_INDEX).FILENAME = FILEN> BIG_FILE_ARRAY(BIGFILE_ARRAY_INDEX).REVDATE = HEADER.REVDATE9 BIG_FILE_ARRAY(BIGFILE_ARRAY_INDEX).FILESIZE = FILESIZEd/ BIGFILE_ARRAY_INDEX = BIGFILE_ARRAY_INDEX + 1L ENDIF&C IF IT HAS EXTENSION HEADERS, SAVE IT, IF (HEADER.EXTFID.EXFIDNUM .NE. 0) GOTO 355?C IF NO EXTENTS OR EXTENTS < WINDOW SIZE WE DON'T CARE ABOUT IT)2 IF (.NOT. (MINWINDOW .LT. EXTENT_COUNT)) GOTO 335 355 CONTINUE' ARRAY(ARRAY_INDEX).FILESIZE = FILESIZET$ ARRAY(ARRAY_INDEX).FILENAME = FILEN C FILE NUMBER 2 ARRAY(ARRAY_INDEX).FID.FIDNUM = HEADER.FID.FIDNUM2 ARRAY(ARRAY_INDEX).FID.FIDSEQ = HEADER.FID.FIDSEQ2 ARRAY(ARRAY_INDEX).FID.FIDRVN = HEADER.FID.FIDRVN2 ARRAY(ARRAY_INDEX).FID.FIDNMX = HEADER.FID.FIDNMX.C EXTENT HEADER NUMBER, 0 IF NO EXTENT HEADERS< ARRAY(ARRAY_INDEX).EXTFID.EXFIDNUM = HEADER.EXTFID.EXFIDNUM< ARRAY(ARRAY_INDEX).EXTFID.EXFIDSEQ = HEADER.EXTFID.EXFIDSEQ< ARRAY(ARRAY_INDEX).EXTFID.EXFIDRVN = HEADER.EXTFID.EXFIDRVN< ARRAY(ARRAY_INDEX).EXTFID.EXFIDNMX = HEADER.EXTFID.EXFIDNMXIC COUNTED NUMBER OF EXTENTS, HEADERS = 1, INCREMENT IN EXTENT HEADER LOOP  ARRAY(ARRAY_INDEX).HEADERS = 1)* ARRAY(ARRAY_INDEX).EXTENTS = EXTENT_COUNT MAX_INDEX = ARRAY_INDEX ARRAY_INDEX = ARRAY_INDEX + 1 GOTO 335L 360 CONTINUE$C LOOP IF MORE MEMBERS IN VOLUME SET8 IF ((VOLSET) .AND. (VOLSETNUM .LT. VOLSETCNT)) GOTO 902%C DEASSIGN THE CHANNEL TO THE DEVICE A STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))E#C DONE WITH INDEXF.SV$ DISKM010.A [DISK.A]REVIEW_DISK_DECPS.FOR;7Q` !"AYS, SO CLOSE IT  CLOSE(UNIT=3,DISPOSE='SAVE')L4C ADD EXTENTS OF EXTENSION HEADERS TO PRIMARY HEADER DO 399 K = 1, MAX_INDEX. IF (ARRAY(K).EXTFID.EXFIDNUM .EQ. 0) GOTO 399 NUMHEADERS = NUMHEADERS + 1# FINDNUM = ARRAY(K).EXTFID.EXFIDNUMO# FINDSEQ = ARRAY(K).EXTFID.EXFIDSEQ)# FINDRVN = ARRAY(K).EXTFID.EXFIDRVNC# FINDNMX = ARRAY(K).EXTFID.EXFIDNMXS M = 1#397 IF (M .GT. MAX_EINDEX) GOTO 399D:C CHECK FOR EXTENT THAT MATCHES THE ONE WE ARE LOOKING FOR/C IF ((FINDNUM .EQ. EARRAY(M).FID.FIDNUM) .AND.,-C 1 (FINDSEQ .EQ. EARRAY(M).FID.FIDSEQ) .AND.M.CC 1 (FINDRVN .EQ. EARRAY(M).FID.FIDRVN) .AND.1C 1 (FINDNMX .EQ. EARRAY(M).FID.FIDNMX)) GOTO 398A. IF ((FINDNUM .EQ. EARRAY(M).FID.FIDNUM) .AND., 1 (FINDSEQ .EQ. EARRAY(M).FID.FIDSEQ) .AND.0 1 (FINDNMX .EQ. EARRAY(M).FID.FIDNMX)) GOTO 398 M = M + 1 GOTO 397SC MATCHS 398 CONTINUE( ARRAY(K).HEADERS = ARRAY(K).HEADERS + 18 ARRAY(K).EXTENTS = ARRAY(K).EXTENTS + EARRAY(M).EXTENTS1C CHECK FOR LAST IN CHAIN => DONE FOR THIS HEADERA/ IF (EARRAY(M).EXTFID.EXFIDNUM .EQ. 0) GOTO 399HC GET NEXT EXTENT IN CHAIN$ FINDNUM = EARRAY(M).EXTFID.EXFIDNUM$ FINDSEQ = EARRAY(M).EXTFID.EXFIDSEQ$ FINDRVN = EARRAY(M).EXTFID.EXFIDRVN$ FINDNMX = EARRAY(M).EXTFID.EXFIDNMX?C SINCE WE GRAB HEADERS IN ORDER, WE MAY NOT HAVE TO START AT 1P> IF (EARRAY(M).EXTFID.EXFIDNUM .GT. EARRAY(M).FID.FIDNUM) THEN M = M + 1E ELSE  M = 1I END IF> GOTO 397S 399 CONTINUE (!C TYPE *,' THE DEVICE IS ',DEVICEUCUQC Open DECPS Context TO OBTAIN DISK USAGE AND HOTFILES INFO IF NODE WAS SPECIFIEDICV$ IF (NODE_NAME_SIZE .EQ. 0) GOTO 750% STATUS = PSPA$OPEN_CONTEXT(PSPA$CTX) , IF ( .NOT. STATUS ) CALL PSPA$STOP( STATUS,! 1 PSPA$CTX.CTX$L_OUR_ERR, ! 1 PSPA$CTX.CTX$L_RMS_ERR,V# 1 PSPA$CTX.CTX$L_RMS_IOSB )$ STATUS = 1U DO WHILE ( STATUS )* STATUS = PSPA$READ_CONTEXT( PSPA$CTX )5 IF ( STATUS .EQ. %LOC( PSPA$_NOMORE ) ) GOTO 9000E, IF ( .NOT. STATUS ) CALL PSPA$STOP( STATUS,! 1 PSPA$CTX.CTX$L_OUR_ERR,C! 1 PSPA$CTX.CTX$L_RMS_ERR,S# 1 PSPA$CTX.CTX$L_RMS_IOSB ).- IF ( PSPA$CTX.CTX$L_DEV_CNT .NE. 0 ) THEN 2 CALL GET_PSPA_DISK(%VAL(PSPA$CTX.CTX$A_DEV_REC),* 1 PSPA$CTX.CTX$L_DEV_CNT,DEVICE,DEVICEL) END IFF IF ((PSPA$CTX.CTX$L_FIL_CNT .NE. 0) .AND. (MAX_INDEX .NE. 0)) THEN2 CALL GET_PSPA_FILE(%VAL(PSPA$CTX.CTX$A_FIL_REC),3 1 PSPA$CTX.CTX$L_FIL_CNT,PSPA$CTX.CTX$T_NODENAME,H 1 DEVICE,DEVICEL)I END IF END DO 9000 CONTINUEA( STATUS = PSPA$CLOSE_CONTEXT( PSPA$CTX ), If ( .NOT. STATUS ) Call PSPA$STOP( STATUS,! 1 PSPA$CTX.CTX$L_OUR_ERR,! 1 PSPA$CTX.CTX$L_RMS_ERR,I# 1 PSPA$CTX.CTX$L_RMS_IOSB )SC COMPUTE THE HOTFILES IO RATE DO 756 K = 1,MAX_INDEX$# IF (ARRAY(K).HOTFILES .NE. 0) THEN.A ARRAY(K).HOTFILES_IO = ARRAY(K).HOTFILES_IO / ARRAY(K).HOTFILESN ELSES ARRAY(K).HOTFILES_IO = 0 END IFS 756 CONTINUE O4C SORT THE ARRAY BY # HEADERS, # HOTFILES, # EXTENTS750 INVERSIONS = 0 DO 760 K = 1, MAX_INDEX-1 DO 770 L = K+1, MAX_INDEX3 IF (ARRAY(K).HEADERS .LT. ARRAY(L).HEADERS) THEN ( HOLDARRAY = ARRAY(K)X ARRAY(K) = ARRAY(L) ARRAY(L) = HOLDARRAYO INVERSIONS = 1B GOTO 770IA ELSE IF ((ARRAY(K).HOTFILES_IO .LT. ARRAY(L).HOTFILES_IO) .AND.E3 1 (ARRAY(K).HEADERS .EQ. ARRAY(L).HEADERS)) THEN A HOLDARRAY = ARRAY(K)O ARRAY(K) = ARRAY(L) ARRAY(L) = HOLDARRAY  INVERSIONS = 1S GOTO 770)9 ELSE IF ((ARRAY(K).EXTENTS .LT. ARRAY(L).EXTENTS) .AND.U: 1 (ARRAY(K).HOTFILES_IO .EQ. ARRAY(L).HOTFILES_IO) .AND.3 1 (ARRAY(K).HEADERS .EQ. ARRAY(L).HEADERS)) THEN L HOLDARRAY = ARRAY(K)V ARRAY(K) = ARRAY(L) ARRAY(L) = HOLDARRAYE INVERSIONS = 1 GOTO 770R END IF 770 CONTINUE 760 CONTINUE IF (INVERSIONS .EQ. 1) GOTO 750C OUTPUT DISK INFO@ BLOCKS_PER_FILE = ((TOT_MAX_LBN - TOT_FREEBLOCKS) / FILE_COUNT)C BLOCKS_USED = (100 * (TOT_MAX_LBN - TOT_FREEBLOCKS)) / TOT_MAX_LBN$ IF (COM$DEV_CNT .EQ. 0) THENE BUSY = 0 QLEN = 0 OPCNT = 00 IOCNT = 0  ELSET- BUSY = COM_SUM$DEV.DEV_F_BUSY / COM$DEV_CNT- QLEN = COM_SUM$DEV.DEV_F_QLEN / COM$DEV_CNTL/ OPCNT = COM_SUM$DEV.DEV_F_OPCNT / COM$DEV_CNTL4 IOCNT = INT(COM_SUM$DEV.DEV_F_IOCNT / COM$DEV_CNT) END IFP NULL = CHAR(0)N! DLENGTH = INDEX(DEVICE,NULL) - 1A" VLENGTH = INDEX(VOLNAME,NULL) - 1C OUTPUT DISK INFO/C TYPE *,'BAD HEADER COUNT = ',BAD_HEADER_COUNT,3 WRITE(1,500) DEVICE(1:DLENGTH),VOLNAME(1:VLENGTH), 1 PSPA$CTX.CTX$T_NODENAME! WRITE(1,503)HOLES,BIGBLOCKS,BUSYE4 WRITE(1,501) TOT_MAX_LBN,TOT_FREEBLOCKS,BLOCKS_USED4 WRITE(1,506) FILE_COUNT,TOT_EXTENTS,BLOCKS_PER_FILE+ WRITE(1,502) ERRCNT,CLUSTER_FACTOR,WINDOWSQ WRITE(1,504) OPCNT,IOCNT,QLEN, WRITE(1,505) NUMHEADERS,MAX_INDEX,MINWINDOW;500 FORMAT (' Disk analysis for ',A20,' Logical name ',A10,E 1 ' from node ',A6)E501 FORMAT (' Disk size ',I8,' Free space ',I8,' Pct used ',I3,F 1 '%')BE502 FORMAT (' Error cnt ',I8,' Cluster size ',I8,' Windows ',I4)OF503 FORMAT (' Bitmap holes ',I8,' Largest hole ',I8,' Pct busy ',F5.2)6504 FORMAT (' Ave I/O /sec ',F8.2,' Thruput /sec ',I8, 1 ' Ave Que ',F6.2)E505 FORMAT (' ',I4,' Files > 1 header ',I4,' Files > ',I4,' extents')GE506 FORMAT (' # Files ',I8,' Tot # Extent ',I8,' Blks/file ',I8)D!C WRITE OUT THE DISK HISTORY FILEU> WRITE(4,550) HIST_YEAR,HIST_MONTH,HIST_DAY,DEVICE(1:DLENGTH),> 2 VOLNAME(1:VLENGTH),PSPA$CTX.CTX$T_NODENAME,HOLES,BIGBLOCKS,= 3 BUSY,MAX_LBN,FREEBLOCKS,BLOCKS_USED,ERRCNT,CLUSTER_FACTOR, ; 4 WINDOWS,OPCNT,IOCNT,QLEN,NUMHEADERS,MAX_INDEX,MINWINDOW,A 5 FILE_COUNT,TOT_EXTENTSLF550 FORMAT(' ','19',I2.2,'-',I2.2,'-',I2.2,' ',A20,' ',A10,' ',A6,' ',= 2 I8,' ',I8,' ',F5.2,' ',I8,' ',I8,' ',I3,' ',I8,' ',I8,' ', ? 3 I4,' ',F8.2,' ',I8,' ',F6.2,' ',I4,' ',I4,' ',I4,' ',I8,' ',B 4 I8).C PRINT OUT THE FILE INFORMATION FOR EACH FILE WRITE(1,802)E WRITE(1,801)S WRITE(1,803)T WRITE(1,802)S1801 FORMAT(' FILE FILE FILE HOTFILES')A802 FORMAT(' ') /803 FORMAT(' HEADERS EXTENTS SIZE NUM I/O  1 [DIRECTORY]FILENAME.EXT')3804 FORMAT(' ',I8,' 'I8,I8,' ',I3,' ',F4.1,' ',A86)CC850 FORMAT(' ','19',I2.2,'-',I2.2,'-',I2.2,' ',A20,' ',A10,' ',A86,S( 2 ' ',I8,' ',I3,' ',F4.1,' ',I8,' ',I8) DO 805 K = 1,MAX_INDEXOC WRITE (1,804) ARRAY(K).HEADERS,ARRAY(K).EXTENTS,ARRAY(K).FILESIZE,L; 2 ARRAY(K).HOTFILES,ARRAY(K).HOTFILES_IO,ARRAY(K).FILENAMEL@C WRITE FILE HISTORY RECORD IF FILE HAS > HISTWINDOWS OF EXTENTS+ IF (ARRAY(K).EXTENTS .GT. NUMEXTENTS) THENL@ WRITE(5,850) HIST_YEAR,HIST_MONTH,HIST_DAY,DEVICE(1:DLENGTH),9 2 VOLNAME(1:VLENGTH),ARRAY(K).FILENAME,ARRAY(K).HEADERS,I; 3 ARRAY(K).HOTFILES,ARRAY(K).HOTFILES_IO,ARRAY(K).EXTENTS,A 4 ARRAY(K).FILESIZE ENDIF 805 CONTINUE/C PRINT OUT BIGFILE LIST IF THERE WERE BIGFILESH) IF (BIGFILE_ARRAY_INDEX .EQ. 1) GOTO 810( WRITE (1,802) WRITE (1,806)BIGFILE_SIZE@806 FORMAT(' Files larger than ',I8,' blocks on this disk are:') WRITE (1,808) WRITE (1,802) 807 FORMAT(' ',A11,1X,I8,1X,A86);808 FORMAT(' Modified Date Size [Directory]Filename.Ext')O& DO 810 K = 1, BIGFILE_ARRAY_INDEX - 1A STATUS = SYS$ASCTIM(,FULLDATE,%REF(BIG_FILE_ARRAY(K).REVDATE),0)N1 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))L C TYPE *, 'FULLDATE = ',FULLDATE DATE = FULLDATE(1:11)C TYPE *, 'DATE = ',DATEG WRITE(1,807)DATE,BIG_FILE_ARRAY(K).FILESIZE,BIG_FILE_ARRAY(K).FILENAMEN 810 CONTINUE C ALL DONE 990 CLOSE(UNIT=1,DISPOSE='SAVE') CLOSE(UNIT=4,DISPOSE='SAVE')_ CLOSE(UNIT=5,DISPOSE='SAVE')'C END OF REVIEW_DISK_DECPS MAIN PROGRAMI 999 CONTINUE ENDCXC GET_PSPA_DISK C=: Subroutine GET_PSPA_DISK( PSPA$DEV, CNT ,DEVNAME,DEVLEN ) Implicit None$ Include 'SYS$LIBRARY:PSPA$LIB.FOR' CHARACTER*15 DEVNAME( CHARACTER*15 HOLD_DEVICEI CHARACTER*15 PSPA_DEVICE% Integer CNT) Integer STR$COPY_DX  Integer STR$ANALYZE_SDESCI Integer STR$COMPARE_ Integer i, j Integer status Integer*2 dsc_len Integer data_addrA INTEGER BAREDEVP INTEGER BAREPSPA INTEGER BAREHOLD Integer com$dev_cntT Integer*4 DEVLENA Structure / str_disk /I Character*12 DEV_T_VOLNAMEY Character*15 DEV_T_DEVNAMEO7 Character*6 DEV_T_NODENAME ! disk server node nameI7 Character*40 DEV_T_HWNAME ! CPU type of disk owner Byte DEV_B_DEV_TYPE. Real*4 DEV_F_SERVICE ! Service time (ms)& Real*4 DEV_F_QLEN ! Queue length* Real*4 DEV_F_OPCNT ! Operations rate, Real*4 DEV_F_IOCNT ! Thruput byte rate, Real*4 DEV_F_PAGOP ! Paging operations. Real*4 DEV_F_PAGIO ! Paging thruput ֹM$ DISKM010.A [DISK.A]REVIEW_DISK_DECPS.FOR;7Q`Rrate2 Real*4 DEV_F_SWPOP ! Swapping operation rate0 Real*4 DEV_F_SWPIO ! Swapping thruput rate( Real*4 DEV_F_BUSY ! Busy time (ms)$ Real*4 DEV_F_RDCNT ! Read rate* Real*4 DEV_F_FREE ! Free block count0 Real*4 DEV_F_MSCPOP ! MSCP operations rate5 Real*4 DEV_F_MSCPPG ! MSCP paging/swapping rateT- Real*4 DEV_F_MSCPIO ! MSCP thruput rateC( Real*4 DEV_F_SPLIT ! Split IO rate End Structure! Record / str_disk / COM_SUM$DEVA9 Record / PSPADEVRECS / PSPA$DEV( CNT ) ! DEVICE recordsN- Common / COM$DEV / COM_SUM$DEV, com$dev_cntT I = 1 200 CONTINUEB STATUS = STR$COPY_DX(HOLD_DEVICE,%VAL(PSPA$DEV(I).DEV_A_DEVNAME))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))E3 PSPA_DEVICE = '_'//HOLD_DEVICE(1:LEN(HOLD_DEVICE))$ BAREHOLD = LEN(HOLD_DEVICE) BAREPSPA = LEN(PSPA_DEVICE)HC TYPE *,' PSPA LEN= ',BAREPSPA,' DEVLEN= ',DEVLEN,' HOLDLEN= ',BAREHOLDGC TYPE *,' PSPA DEVICE= ',PSPA_DEVICE(0:BAREPSPA),' EXPECTED DEVICE= ',E:C 1 DEVNAME(0:(DEVLEN-1)),' BUSY= ',PSPA$DEV(I).DEV_F_BUSY@ IF ( PSPA_DEVICE(0:BAREPSPA) .EQ. DEVNAME(0:(DEVLEN-1))) Goto 1 I = I + 1! IF (.NOT. (I .GT. CNT)) GOTO 200D6C TYPE *,'DEVICE ',DEVNAME, ' NOT FOUND IN DECPS DATA' GOTO 1100 1 Continue5 com$dev_cnt = com$dev_cnt + 1 ! summarize data countF7 COM_SUM$DEV.DEV_F_BUSY = COM_SUM$DEV.DEV_F_BUSY + O 1 PSPA$DEV( i ).DEV_F_BUSY7 COM_SUM$DEV.DEV_F_QLEN = COM_SUM$DEV.DEV_F_QLEN + , 1 PSPA$DEV( i ).DEV_F_QLEN 9 COM_SUM$DEV.DEV_F_OPCNT = COM_SUM$DEV.DEV_F_OPCNT + ) 1 PSPA$DEV( i ).DEV_F_OPCNT9 COM_SUM$DEV.DEV_F_IOCNT = COM_SUM$DEV.DEV_F_IOCNT + I 1 PSPA$DEV( i ).DEV_F_IOCNT 1100 CONTINUES ReturnF EndCC GET_PSPA_FILEICE; SUBROUTINE GET_PSPA_FILE(PSPA$FIL,CNT,NODE,DEVNAME,DEVLEN)O# INCLUDE 'SYS$LIBRARY:PSPA$LIB.FOR') CHARACTER*6 NODEI CHARACTER*15 DEVNAME CHARACTER*15 HOLD_DEVICE) CHARACTER*15 PSPA_DEVICE  CHARACTER*20 SERVED_DEVICEF INTEGER CNT) Integer STR$COPY_DXI Integer STR$ANALYZE_SDESCR Integer STR$COMPARET Integer i, j Integer status Integer*2 dsc_len Integer data_addrE INTEGER BAREDEVC INTEGER BAREPSPA INTEGER BAREHOLD Integer com$dev_cnt( Integer*4 DEVLENS Integer*4 SDLEN Integer*4 SMAX_INDEXC STRUCTURE /MYPSPAFILRECS/- BYTE FIL_B_TYPE ! Record type 10A1 INTEGER*4 FIL_A_DEVICE ! Disk device nameS1 INTEGER*4 FIL_A_DIRECTORY ! Directory name' INTEGER*4 FIL_A_FILE ! Filename*1 INTEGER*2 FIL_W_FID_NUM ! FID file numberT5 INTEGER*2 FIL_W_FID_SEQ ! FID sequence numberN< BYTE FIL_B_FID_RVN ! FID relative volume number< BYTE FIL_B_FID_NMX ! FID HIGH ORDER FILE number1 INTEGER*2 FIL_W_INDEX ! Disk index number 3 REAL*4 FIL_F_SERVICE ! Service time (ms)F/ REAL*4 FIL_F_OPCNT ! Operations rate 1 REAL*4 FIL_F_IOCNT ! Thruput byte rateO3 REAL*4 FIL_F_RDCNT ! Read operation rateD. REAL*4 FIL_F_SPLITS ! Split IO rate; REAL*4 FIL_F_TURNS ! Window turn rate (not used)5 REAL*4 FIL_F_PAGOP ! Paging operation rate 7 REAL*4 FIL_F_SWPOP ! Swapping operation rate34 REAL*4 FIL_F_MSCPOP ! MSCP operation rate! INTEGER*4 FIL_L_PID ! PIX CHARACTER*16 FIL_t_reserved END STRUCTURE ! MYPSPAFILRECS% RECORD /MYPSPAFILRECS/ PSPA$FIL(CNT)_ STRUCTURE /INDEXF/N STRUCTURE FID  INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX( END STRUCTUREO STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ  BYTE EXFIDRVN  BYTE EXFIDNMX) END STRUCTURER CHARACTER*86 FILENAME4 INTEGER*4 EXTENTST INTEGER*4 HEADERS  INTEGER*4 FILESIZE INTEGER*4 HOTFILES REAL*4 HOTFILES_IOT END STRUCTURE RECORD /INDEXF/ SARRAY(1000)C( Common / COM$ARRAY / SARRAY,SMAX_INDEXA SERVED_DEVICE = '_'//NODE(1:LEN(NODE))//'$'//DEVNAME(2:DEVLEN-1)T SDLEN = LEN(SERVED_DEVICE)N I = 1 200 CONTINUEA STATUS = STR$COPY_DX(HOLD_DEVICE,%VAL(PSPA$FIL(I).FIL_A_DEVICE))K/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))A3 PSPA_DEVICE = '_'//HOLD_DEVICE(1:LEN(HOLD_DEVICE)) BAREPSPA = LEN(PSPA_DEVICE)GC TYPE *,' PSPA DEVICE= ',PSPA_DEVICE(1:BAREPSPA),' EXPECTED DEVICE= ',N?C 1 DEVNAME(1:(DEVLEN-1)),'SERVED= ',SERVED_DEVICE(1:(SDLEN-1))F@ IF ( PSPA_DEVICE(1:BAREPSPA) .EQ. DEVNAME(1:(DEVLEN-1))) Goto 1E IF ( PSPA_DEVICE(1:BAREPSPA) .EQ. SERVED_DEVICE(1:(SDLEN-1))) Goto 1C 250 IF (I .LT. CNT) THEN I = I + 1. GOTO 200 ELSE GOTO 1100E END IFT 1 CONTINUEDC TYPE *,' PSPA FILE NUM= ',PSPA$FIL(I).FIL_W_FID_NUM,' PSPA SEQ= ',2C 1 PSPA$FIL(I).FIL_W_FID_SEQ,' DEV= ',PSPA_DEVICE J = 0 C FILE LOOPF 300 CONTINUE J = J + 1@ IF ((PSPA$FIL(I).FIL_W_FID_NUM .EQ. SARRAY(J).FID.FIDNUM) .AND.> 1 (PSPA$FIL(I).FIL_W_FID_SEQ .EQ. SARRAY(J).FID.FIDSEQ) .AND.> 1 (PSPA$FIL(I).FIL_B_FID_RVN .EQ. SARRAY(J).FID.FIDRVN) .AND.> 1 (PSPA$FIL(I).FIL_B_FID_NMX .EQ. SARRAY(J).FID.FIDNMX)) THEN. SARRAY(J).HOTFILES = SARRAY(J).HOTFILES + 13 SARRAY(J).HOTFILES_IO = SARRAY(J).HOTFILES_IO + E 1 PSPA$FIL(I).FIL_F_OPCNT-C TYPE *,' HOTFILE FOR ',SARRAY(J).FILENAMEV GOTO 250, END IFZ IF (J .LT. SMAX_INDEX) GOTO 300 GOTO 250 1100 CONTINUEH RETURN  END? Subroutine PSPA$STOP( ret_stat, PSPA_code, vr_stat, rms_iosb )  Implicit None$ Include 'SYS$LIBRARY:PSPA$LIB.FOR' Include '($SYSSRVNAM)' Integer ret_stat Integer PSPA_codeI Integer vr_statI Integer rms_iosb Character*80 msg_buff Integer msg_len= Integer status; status = SYS$GETMSG( %VAL( ret_stat ), msg_len, msg_buff ) & Write( *, 100 ) msg_buff( 1:msg_len ), If ( PSPA_code .EQ. CTX$K_ERREADFILE ) Then? status = SYS$GETMSG( %VAL( vr_stat ), msg_len, msg_buff ) + Write( *, 100 ) msg_buff( 1:msg_len )S@ status = SYS$GETMSG( %VAL( rms_iosb ), msg_len, msg_buff )+ Write( *, 100 ) msg_buff( 1:msg_len )/ Else If ( PSPA_code .EQ. CTX$K_INCOMPAT ) ThenP Write( *, 200 )D5 Else If ( PSPA_code .EQ. CTX$K_NOALLOCVA ) ThenE Write( *, 300 ) End IfI" Call SYS$EXIT( %VAL( ret_stat ) )100 Format( A )YE200 Format( ' %DECPS-F-INCOMPAT, Data is incompatible with reader.' )FA300 Format( ' %DECPS-F-NOALLOCVA, Insufficient virtual memory.' )  End*[DISK.A]REVIEW_DISK_NOVPA.CLD;1+, ./ 4H- 0123KPWO5E6I7(<^89GHJDEFINE VERB REVIEW_DISK( IMAGE DISK$MANAGEMENT:REVIEW_DISK.EXEDPARAMETER P1,LABEL=DEVICE,VALUE(REQUIRED,TYPE=$DEVICE),PROMPT="Disk"QUALIFIER WINDOW,VALUEQUALIFIER HISTWINDOW,VALUEHQUALIFIER OUTPUT,DEFAULT,VALUE (DEFAULT="REVIEW_DISK.RPT",TYPE=$OUTFILE)*[DISK.A]REVIEW_DISK_NOVPA.FOR;9+,.L/ 4JLI- 0123KPWOM56 ȱ57`c(<^89GHJCC REVIEW_DISK.FORCC DANIEL R. BUCKLEY DECCHC THIS SOFTWARE IS SUPPLIED "AS IS" WITH NO SUPPORT IMPLIED OR OTHERWISE&C FROM DIGITAL EQUIPMENT CORPORATION. CDC THIS PROGRAM IS USED TO ANALYZE A DISK TO DETERMINE THE NUMBER OF JC BITMAP HOLES, THE LARGEST FREE BITMAP HOLE, THE AMOUNT OF FREE SPACE ANDDC A LIST OF FILES WITH THE GREATEST NUMBER OF EXTENTS AND EXTENSION HC HEADERS. HOTFILE AND DISK USAGE DATA WILL BE 0 SINCE VPA IS NOT BEING C USED.C9C THIS PROGRAM HAS BEEN TESTED AND WORKS ON VOLUME SETS. CCC THIS PROGRAM HAS BEEN TESTED AND WORKS ON HOST-BASED SHADOW SETS.CDC BECAUSE A STRIPESET ALLOCATES ALMOST ALL OF THE SPACE ON A DISK TOGC A DUMMY FILE TO ALLOW THE STRIPING DRIVER CONTROL OVER THE ALLOCATIONHC OF SPACE, THIS PROGAM WILL SHOW THE STRIPPED DEVICE AS HAVING 1 BITMAPDC HOLE AND FREESPACE AS EXPECTED. LOOKING AT AN INDIVIDUAL STRIPESETIC MEMBER WILL SHOW A SMALL NUMBER OF BITMAP HOLES, SMALL LARGEST HOLE ANDC ALMOST NO FREE SPACE.CJC ALMOST A C$ DISKM010.A [DISK.A]REVIEW_DISK_NOVPA.FOR;9JL"LL OF THE RUN-TIME OF THIS PROGRAM IS CONSUMED IN THE INDEXF.SYS&C READING AND CHECKING OF THE HEADERS.CEC THE CURRENT MAXIMUM NUMBER OF FILES THAT CAN BE REPORTED ON IS 1000CC IF YOU NEED TO INCREASE THIS CHANGE BOTH THE ARRAYS (ARRAY(1000),,C EARRAY(1000)) AND THE ARRAY_LIMIT VARIABLECJC 4/22/91 DRB MODIFIED FORMAT 804 TO AVOID OUTPUT OVERFLOW ON THE HOTFILESFC I/O RATE, ADDED AN ADDITIONAL DISK SUMMARY LINE CONTAINING I/O RATE,JC THROUGHPUT AND QUEUE INFORMATION. MODIFIED AND TESTED TO WORK WITH HBVS.CFC 6/25/92 DRB ADDED BIGFILE ARRAY TO PRINT A LIST OF FILES LARGER THENEC BIGFILE_SIZE (LOGICAL) AT THE END OF THE .FRAG FILE. ALSO SHOWN ARE$C THE MODIFIED DAY AND THE FILESIZE. PROGRAM REVIEW_DISK IMPLICIT INTEGER*4 (A - Z) INCLUDE '($SSDEF)' INCLUDE '($IODEF)' INCLUDE '($DVIDEF)' INCLUDE '($ATRDEF)' INCLUDE '($DCDEF)' INCLUDE '($DEVDEF)' INCLUDE '($FIDDEF)' INCLUDE '($FIBDEF)' INCLUDE '($SECDEF)' INCLUDE '($SFDEF)' INCLUDE '($CLIDEF)' INCLUDE '($SYSSRVNAM)' INCLUDE '($LNMDEF)' CHARACTER*25 FULLDATE CHARACTER*256 BIGFILE_STRING CHARACTER*11 DATE CHARACTER*1 NULL CHARACTER*64 HOST CHARACTER*64 VOLSETROOT CHARACTER*64 VOLSETNEXT CHARACTER*64 ALTHOST CHARACTER*32 DEV CHARACTER*64 DEVICE CHARACTER*12 VOLNAME CHARACTER*39 FILENAME CHARACTER*86 FILEN CHARACTER*25 START_TIME CHARACTER*25 STOP_TIME CHARACTER*39 OUTPUT_FILE CHARACTER*4 AMINWINDOW CHARACTER*4 AHISTWINDOW BYTE BITMAP(512) BYTE INDEXF(512) BYTE FINDRVN BYTE FINDNMX LOGICAL*1 BIT LOGICAL*1 LASTBIT INTEGER*2 FINDNUM INTEGER*2 FINDSEQ INTEGER*2 HIBLKL INTEGER*2 HIBLKH INTEGER*2 EFBLKL INTEGER*2 EFBLKH INTEGER*2 FILEL INTEGER*2 N0 INTEGER*2 N127 INTEGER*2 CHAN INTEGER*2 FUNC INTEGER*2 IBITMAP INTEGER*2 IDOFFSET INTEGER*2 MPOFFSET INTEGER*2 ACOFFSET INTEGER*2 RSOFFSET INTEGER*2 IIDOFFSET INTEGER*2 IMPOFFSET INTEGER*2 IACOFFSET INTEGER*2 IRSOFFSET INTEGER*2 WORDS_INUSE INTEGER*2 IWORDS_INUSE INTEGER*2 POINTER_LWORD INTEGER*2 STRUCLEVL INTEGER*2 ISTRUCLEVL INTEGER*2 STRUCLEVH INTEGER*2 ISTRUCLEVH INTEGER*2 LX INTEGER*4 BIGFILE_LENGTH INTEGER*4 BIGFILE_SIZE INTEGER*4 BIGFILE_ARRAY_INDEX INTEGER*4 BLOCKS_PER_FILE INTEGER*4 TOT_EXTENTS INTEGER*4 FILE_COUNT INTEGER*4 DEL_HEADER_COUNT INTEGER*4 BAD_HEADER_COUNT INTEGER*4 NUMWINDOW INTEGER*4 NUMEXTENTS INTEGER*4 AHISTWINDOW_SIZE INTEGER*4 VOLSET INTEGER*4 VOLSETNUM INTEGER*4 VOLSETCNT INTEGER*4 HIST_YEAR INTEGER*4 HIST_MONTH INTEGER*4 HIST_DAY INTEGER*4 STATUS INTEGER*4 DLENGTH INTEGER*4 VLENGTH INTEGER*4 CLI$GET_VALUE INTEGER*4 CLI$PRESENT INTEGER*4 NODE_NAME_SIZE INTEGER*4 OUTPUT_FILE_SIZE INTEGER*4 WORDS INTEGER*4 FILECHAR INTEGER*4 IDSTART INTEGER*4 EXTENT_COUNT INTEGER*4 OFFSET INTEGER*4 MAX_INDEX INTEGER*4 ARRAY_LIMIT INTEGER*4 ARRAY_INDEX INTEGER*4 MAX_EINDEX INTEGER*4 ARRAY_EINDEX INTEGER*4 IDEV INTEGER*4 XBYTES INTEGER*4 BTOT INTEGER*4 BFREE INTEGER*4 BUSED INTEGER*4 CURFREE INTEGER*4 BIGFREE INTEGER*4 BIGBLOCKS INTEGER*4 NUMBYTES INTEGER*4 CLUSTERS INTEGER*4 MAX_FILES INTEGER*4 MAX_LBN INTEGER*4 FREEBLOCKS INTEGER*4 TOT_MAX_LBN INTEGER*4 TOT_FREEBLOCKS INTEGER*4 CLUSTER_FACTOR INTEGER*4 BLOCKS_USED INTEGER*4 NUM_DIRS INTEGER*4 ERRCNT INTEGER*4 HOLES INTEGER*4 FREE_HEADERS INTEGER*4 WINDOWS INTEGER*4 TWOWINDOWS INTEGER*4 MINWINDOW INTEGER*4 AMINWINDOW_SIZE INTEGER*4 BEG_LEN INTEGER*4 END_LEN INTEGER*4 NUMHEADERS INTEGER*4 MAX_POINTERS INTEGER*4 MAX_HEADERS INTEGER*4 DEVCHAR INTEGER*4 DEVCLASS INTEGER*4 DEVICEL INTEGER*4 VOLSETNEXTL INTEGER*4 VOLSETROOTL INTEGER*4 VOLNAM_B INTEGER*4 MAP INTEGER*4 MPSTART INTEGER*4 FILESIZE INTEGER*4 IOCNT REAL*4 BUSY REAL*4 QLEN REAL*4 OPCNT EXTERNAL CLI$_ABSENT7C DEVICE NAME FOR LIB$FID_TO_NAME RUN TIME LIBRARY CALL STRUCTURE /LIBFIDB/ BYTE COUNT CHARACTER*32 DEVICEN END STRUCTURE RECORD /LIBFIDB/ LIBFID+C SET UP THE ITEMLISTS FOR THE GETDVI CALLS STRUCTURE /GETDVI_ITEM/ STRUCTURE ITEM(12) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST END STRUCTURE RECORD /GETDVI_ITEM/ ITMLST STRUCTURE /GETDVI_ITEM2/ STRUCTURE ITEM2(5) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST2 END STRUCTURE RECORD /GETDVI_ITEM2/ ITMLST2 STRUCTURE /GETDVI_ITEM3/ STRUCTURE ITEM3(1) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST3 END STRUCTURE RECORD /GETDVI_ITEM3/ ITMLST3C IOSB FOR QIOW STRUCTURE /IOSBX/ INTEGER*2 STATUS INTEGER*2 TRANSFER INTEGER*4 DEVICE END STRUCTURE RECORD /IOSBX/ IOSBC INDEXF.SYS HOME BLOCK STRUCTURE /HOMEB/ INTEGER*4 HOMELBN INTEGER*4 ALHOMELBN INTEGER*4 ALTIDXLBN INTEGER*2 STRUCLEV INTEGER*2 CLUSTER INTEGER*2 HOMEVBN INTEGER*2 ALHOMEVBN INTEGER*2 ALTIDXVBN INTEGER*2 IBMAPVBN INTEGER*4 IBMAPLBN INTEGER*4 MAXFILES INTEGER*2 IBMAPSIZE INTEGER*2 RESFILES INTEGER*2 DEVTYPE INTEGER*2 RVN INTEGER*2 SETCOUNT INTEGER*2 VOLCHAR INTEGER*4 VOLOWNER INTEGER*4 RESERVED1 INTEGER*2 PROTECT INTEGER*2 FILEPROT INTEGER*2 RESERVED2 INTEGER*2 CHECKSUM1 CHARACTER*8 CREDATE BYTE WINDOW BYTE LRU_LIM INTEGER*2 EXTEND CHARACTER*440 FILLER END STRUCTURE RECORD /HOMEB/ HOMEC INDEXF.SYS FILE HEADER BLOCK STRUCTURE /HEADERB/ BYTE IDOFFSET BYTE MPOFFSET BYTE ACOFFSET BYTE RSOFFSET INTEGER*2 SEG_NUM UNION MAP INTEGER*2 STRUCLEV END MAP MAP BYTE STRUCLEVL BYTE STRUCLEVH END MAP END UNION STRUCTURE FID INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ BYTE EXFIDRVN BYTE EXFIDNMX END STRUCTURE UNION MAP CHARACTER*32 RECATTR END MAP MAP INTEGER*2 IRECATTR(16) END MAP END UNION INTEGER*4 FILECHAR INTEGER*2 RESERVED1 BYTE MAP_INUSE BYTE ACC_MODE INTEGER*4 FILEOWNER INTEGER*2 FILEPROT STRUCTURE BCKFID INTEGER*2 BCKFIDNUM  INTEGER*2 BCKFIDSEQ BYTE BCKFIDRVN BYTE BCKFIDNMX END STRUCTURE BYTE JOURNAL BYTE RU_ACTIVE INTEGER*2 RESERVED2 INTEGER*4 HIGHWATER UNION MAP BYTE DATA(430) END MAP MAP CHARACTER*430 CHAR END MAP MAP INTEGER*2 INT(215) END MAP MAPEC THE RESERVED AREA (#3) AND CLASS_PROT FIELDS ARE NOT CURRENTLY USEDBC BY FILES-11 SO THE IDENT AREA STARTS IMMEDIATELY AFTER HIGHWATERC CHARACTER*8 RESERVED3C CHARACTER*20 CLASS_PROTC CHARACTER*20 FILENAME1 INTEGER*2 REVISION CHARACTER*8 CREDATE CHARACTER*8 REVDATE CHARACTER*8 EXPDATE CHARACTER*8 BAKDATE CHARACTER*66 FILENAME2 CHARACTER*310 REST_OF_HEADER END MAP END UNION INTEGER*2 CHECKSUM END STRUCTURE RECORD /HEADERB/ HEADER STRUCTURE /BIGFILEARRAY/ CHARACTER*86 FILENAME CHARACTER*8 REVDATE  INTEGER*4 FILESIZE END STRUCTURE+ RECORD /BIGFILEARRAY/ BIG_FILE_ARRAY(1000) STRUCTURE /INDEXFARRAY/ STRUCTURE FID INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ BYTE EXFIDRVN BYTE EXFIDNMX END STRUCTURE CHARACTER*86 FILENAME INTEGER*4 EXTENTS INTEGER*4 HEADERS INTEGER*4 FILESIZE INTEGER*4 HOTFILES REAL*4 HOTFILES_IO END STRUCTURE! RECORD /INDEXFARRAY/ ARRAY(1000) RECORD /INDEXFARRAY/ HOLDARRAY STRUCTURE /EXTENTARRAY/ STRUCTURE FID INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ BYTE EXFIDRVN BYTE EXFIDNMX END STRUCTURE INTEGER*4 EXTENTS END STRUCTURE" RECORD /EXTENTARRAY/ EARRAY(1000) RECORD /FIBDEF/ FIBD STRUCTURE /FIB1/ INTEGER*2 COUNT INTEGER*2 FILLER INTEGER*4 FIBLOC END STRUCTURE RECORD /FIB1/ FIB STRUCTURE /FIDB/ INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE RECORD /FIDB/ FID Structure / str_disk / Character*12 DET$ DISKM010.A [DISK.A]REVIEW_DISK_NOVPA.FOR;9JL"V_T_VOLNAME Character*15 DEV_T_DEVNAME7 Character*6 DEV_T_NODENAME ! disk server node name7 Character*40 DEV_T_HWNAME ! CPU type of disk owner Byte DEV_B_DEV_TYPE. Real*4 DEV_F_SERVICE ! Service time (ms)& Real*4 DEV_F_QLEN ! Queue length* Real*4 DEV_F_OPCNT ! Operations rate, Real*4 DEV_F_IOCNT ! Thruput byte rate, Real*4 DEV_F_PAGOP ! Paging operations. Real*4 DEV_F_PAGIO ! Paging thruput rate2 Real*4 DEV_F_SWPOP ! Swapping operation rate0 Real*4 DEV_F_SWPIO ! Swapping thruput rate( Real*4 DEV_F_BUSY ! Busy time (ms)$ Real*4 DEV_F_RDCNT ! Read rate* Real*4 DEV_F_FREE ! Free block count0 Real*4 DEV_F_MSCPOP ! MSCP operations rate5 Real*4 DEV_F_MSCPPG ! MSCP paging/swapping rate- Real*4 DEV_F_MSCPIO ! MSCP thruput rate( Real*4 DEV_F_SPLIT ! Split IO rate End Structure! Record / str_disk / COM_SUM$DEV& Common / COM$ARRAY / ARRAY,MAX_INDEX. Common / COM$FIL / COM_SUM$FIL, com$fil_cnt. Common / COM$MET / COM_SUM$MET, com$met_cnt- Common / COM$DEV / COM_SUM$DEV, com$dev_cnt. Common / COM$CPU / COM_SUM$CPU, com$cpu_cnt, 1 com$multi_cpu. Common / COM$PAR / COM_SUM$PAR, com$par_cntC CODE STARTS HEREC CODE STARTS HEREDC ARRAY_LIMIT SHOULD BE SET TO THE SIZE OF THE ARRAY(), EARRAY() ANDC BIG_FILE_ARRAY() ARRAY_LIMIT = 1000 TOT_MAX_LBN = 0 TOT_FREEBLOCKS = 0 FILE_COUNT = 0 TOT_EXTENTS = 0 DEL_HEADER_COUNT = 0 BAD_HEADER_COUNT = 0 NUMHEADERS = 0 ARRAY_INDEX = 1 ARRAY_EINDEX = 1 BIGFILE_ARRAY_INDEX = 1C BUILD GETDVI ITMLST ITMLST.ITEM(1).BUFLEN = 4& ITMLST.ITEM(1).BUFCODE = DVI$_CLUSTER+ ITMLST.ITEM(1).ADDR = %LOC(CLUSTER_FACTOR) ITMLST.ITEM(1).ADDRLEN = 0 ITMLST.ITEM(2).BUFLEN = 4& ITMLST.ITEM(2).BUFCODE = DVI$_DEVCHAR$ ITMLST.ITEM(2).ADDR = %LOC(DEVCHAR) ITMLST.ITEM(2).ADDRLEN = 0 ITMLST.ITEM(3).BUFLEN = 4' ITMLST.ITEM(3).BUFCODE = DVI$_DEVCLASS% ITMLST.ITEM(3).ADDR = %LOC(DEVCLASS) ITMLST.ITEM(3).ADDRLEN = 0 ITMLST.ITEM(4).BUFLEN = 4% ITMLST.ITEM(4).BUFCODE = DVI$_ERRCNT# ITMLST.ITEM(4).ADDR = %LOC(ERRCNT) ITMLST.ITEM(4).ADDRLEN = 0 ITMLST.ITEM(5).BUFLEN = 4) ITMLST.ITEM(5).BUFCODE = DVI$_FREEBLOCKS' ITMLST.ITEM(5).ADDR = %LOC(FREEBLOCKS) ITMLST.ITEM(5).ADDRLEN = 0 ITMLST.ITEM(6).BUFLEN = 64) ITMLST.ITEM(6).BUFCODE = DVI$_FULLDEVNAM# ITMLST.ITEM(6).ADDR = %LOC(DEVICE)' ITMLST.ITEM(6).ADDRLEN = %LOC(DEVICEL) ITMLST.ITEM(7).BUFLEN = 4' ITMLST.ITEM(7).BUFCODE = DVI$_MAXBLOCK$ ITMLST.ITEM(7).ADDR = %LOC(MAX_LBN) ITMLST.ITEM(7).ADDRLEN = 0 ITMLST.ITEM(8).BUFLEN = 4' ITMLST.ITEM(8).BUFCODE = DVI$_MAXFILES& ITMLST.ITEM(8).ADDR = %LOC(MAX_FILES) ITMLST.ITEM(8).ADDRLEN = 0 ITMLST.ITEM(9).BUFLEN = 4' ITMLST.ITEM(9).BUFCODE = DVI$_TRANSCNT% ITMLST.ITEM(9).ADDR = %LOC(TRANSCNT) ITMLST.ITEM(9).ADDRLEN = 0 ITMLST.ITEM(10).BUFLEN = 12& ITMLST.ITEM(10).BUFCODE = DVI$_VOLNAM% ITMLST.ITEM(10).ADDR = %LOC(VOLNAME)) ITMLST.ITEM(10).ADDRLEN = %LOC(VOLNAM_B) ITMLST.ITEM(11).BUFLEN = 64- ITMLST.ITEM(11).BUFCODE = DVI$_ALT_HOST_NAME% ITMLST.ITEM(11).ADDR = %LOC(ALTHOST) ITMLST.ITEM(11).ADDRLEN = 0 ITMLST.ITEM(12).BUFLEN = 64) ITMLST.ITEM(12).BUFCODE = DVI$_HOST_NAME" ITMLST.ITEM(12).ADDR = %LOC(HOST) ITMLST.ITEM(12).ADDRLEN = 0 END_OF_LIST = 0  ITMLST2.ITEM2(1).BUFLEN = 4* ITMLST2.ITEM2(1).BUFCODE = DVI$_VOLNUMBER( ITMLST2.ITEM2(1).ADDR = %LOC(VOLSETNUM) ITMLST2.ITEM2(1).ADDRLEN = 0 ITMLST2.ITEM2(2).BUFLEN = 64+ ITMLST2.ITEM2(2).BUFCODE = DVI$_NEXTDEVNAM) ITMLST2.ITEM2(2).ADDR = %LOC(VOLSETNEXT)- ITMLST2.ITEM2(2).ADDRLEN = %LOC(VOLSETNEXTL) ITMLST2.ITEM2(3).BUFLEN = 4) ITMLST2.ITEM2(3).BUFCODE = DVI$_VOLCOUNT( ITMLST2.ITEM2(3).ADDR = %LOC(VOLSETCNT) ITMLST2.ITEM2(3).ADDRLEN = 0 ITMLST2.ITEM2(4).BUFLEN = 4* ITMLST2.ITEM2(4).BUFCODE = DVI$_VOLSETMEM% ITMLST2.ITEM2(4).ADDR = %LOC(VOLSET) ITMLST2.ITEM2(4).ADDRLEN = 0 ITMLST2.ITEM2(5).BUFLEN = 64+ ITMLST2.ITEM2(5).BUFCODE = DVI$_ROOTDEVNAM) ITMLST2.ITEM2(5).ADDR = %LOC(VOLSETROOT). ITMLST2.ITEM2(5).ADDRLEN = %LOC(VOLSETROOTL) END_OF_LIST2 = 0  ITMLST3.ITEM3(1).BUFLEN = 256' ITMLST3.ITEM3(1).BUFCODE = LNM$_STRING- ITMLST3.ITEM3(1).ADDR = %LOC(BIGFILE_STRING)0 ITMLST3.ITEM3(1).ADDRLEN = %LOC(BIGFILE_LENGTH) END_OF_LIST3 = 0 C(C Get parameters and qualifiers from DCLC IF(CLI$PRESENT('DEVICE')) THEN$ STATUS = CLI$GET_VALUE ('DEVICE', 2 DEV, 2 IDEV)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) ELSE$ TYPE *,'No Disk device specified' GOTO 999 END IF MINWINDOW = 0 IF(CLI$PRESENT('WINDOW')) THEN$ STATUS = CLI$GET_VALUE ('WINDOW', 2 AMINWINDOW, 2 AMINWINDOW_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))? STATUS = LIB$CVT_DTB(%VAL(AMINWINDOW_SIZE),%REF(AMINWINDOW), 1 %REF(MINWINDOW))3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF NUMWINDOW = 2# IF(CLI$PRESENT('HISTWINDOW')) THEN( STATUS = CLI$GET_VALUE ('HISTWINDOW', 2 AHISTWINDOW, 2 AHISTWINDOW_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))A STATUS = LIB$CVT_DTB(%VAL(AHISTWINDOW_SIZE),%REF(AHISTWINDOW), 1 %REF(NUMWINDOW))3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF IF(CLI$PRESENT('OUTPUT')) THEN$ STATUS = CLI$GET_VALUE ('OUTPUT', 2 OUTPUT_FILE, 2 OUTPUT_FILE_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF@C GET THE MINIMUM SIZE TO LIST IN THE BIGFILE LIST (DEF = 50000)B STATUS = SYS$TRNLNM(,'LNM$PROCESS_TABLE','BIGFILE_SIZE',,ITMLST3),C TYPE *,' RETURN FROM SYS$TRNLNM = ',STATUS@C STATUS OF 444 IS %SYSTEM-F-NOLOGNAM (LOGICAL NAME NOT DEFINED) IF (STATUS .EQ. 444) THEN BIGFILE_LENGTH = 0 ELSE2 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) ENDIF IF (BIGFILE_LENGTH .EQ. 0) THEN BIGFILE_SIZE = 50000 ELSE B STATUS = LIB$CVT_DTB(%VAL(BIGFILE_LENGTH),%REF(BIGFILE_STRING), 1 %REF(BIGFILE_SIZE))3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) ENDIF+C GET THE CURRENT DATE FOR HISTORY RECORDS * CALL IDATE(HIST_MONTH,HIST_DAY,HIST_YEAR)*C OPEN OUTPUT FILE (DISK AND FILE SUMMARY)4 OPEN(UNIT=1,FILE=OUTPUT_FILE,STATUS='NEW',RECL=132);C OPEN DISK HISTORY FILE (DATED HISTORY OF DISK PARAMETERS)F OPEN(UNIT=4,FILE='DISK_HISTORY.DAT',STATUS='UNKNOWN',ACCESS='APPEND',+ 2 RECL=178,INITIALSIZE=500,EXTENDSIZE=100)IC OPEN FILE HISTORY FILE (DATED HIST OF FILES WITH > HISTWINDOWS EXTENTS)F OPEN(UNIT=5,FILE='FILE_HISTORY.DAT',STATUS='UNKNOWN',ACCESS='APPEND',+ 2 RECL=166,INITIALSIZE=500,EXTENDSIZE=100)L"C INITIALIZE VARIABLES BEFORE LOOP LASTBIT = .TRUE. BIGFREE = 0 CURFREE = 0 C BFREE = 0R C BUSED = 0U HOLES = 0 N127 = -1 N0 = 0P!C ASSIGN A CHANNEL TO THE DEVICE E STATUS = SYS$ASSIGN(DEV,CHAN,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))REC IF ITS A VOLUME SET WE HAVE TO START WITH THE ROOT AND LOOP THROUGHX2C THE MEMBERS FOR BOTH THE BITMAP AND INDEXF SCANS/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)S/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)).C IS IT A VOLUME SET MEMBER? IF (.NOT. VOLSET) GOTO 103S$C GET RID OF CHANNEL FROM USER INPUT STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))DC START WITH THE ROOT VOLUME' STATUS = SYS$ASSIGN(VOLSETROOT,CHAN,,)T/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))SC GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)M/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))L DEV = VOLSETROOT IDEV = VOLSETROOTLH GOTO 103 102 CONTINUE DEV = VOLSETNEXTF IDEV = VOLSETNEXTLH STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))DC assign channel to next volumeE' STATUS = SYS$ASSIGN(VOLSETNEXT,CHAN,,))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)// IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))T 103 CONTINUE NUMBYTES = 512DC GET THE DEVICE INFORMATION. STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))H$ TOT_MAX_LBN = TOT_MAX_LBN + MAX_LBN- TOT_FREEBLOCKS = TOT_FREEBLOCKS + FREEBLOCKSIC IS IT A DISK> IF (DEVCLASS .NE. DC$_DISK) CALL LIB$STOP(%VAL(SS$_IVDEVNAM))C IS IT MOUNTED: IF (.NOT. DEV$V_MNT) CALL LIB$STOP(%VAL(SS$_DEVNOTMOUNT))C MOUNTED FOREIGNE3 IF (DEV$V_FOR) CALL LIB$STOP(%VAL(SS$_DEVFOREIGN))U)C FLUSH OUT THE EXTENT CACHES ON THE DISKE FIB.COUNT = FIB$K_LENGTHD FIB.FIBLOC = %LOC;:$ DISKM010.A [DISK.A]REVIEW_DISK_NOVPA.FOR;9JLJ"%(FIBD)&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL% FIBD.FIB$W_EXCTL = FIB$C_FLUSH_CACHER$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ% FIBD.FIB$L_EXSZ = FIB$C_EXTENT_CACHE6 FUNC = IO$_ACPCONTROL@ STATUS = SYS$QIOW(,%VAL(CHAN),%VAL(FUNC),%REF(IOSB),,,FIB,,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))39 IF (.NOT. IOSB.STATUS) CALL LIB$STOP (%VAL(IOSB.STATUS))&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL FIBD.FIB$W_EXCTL = 04$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ FIBD.FIB$L_EXSZ = 0@C PROCESS BITMAP TO COUNT HOLES AND DETERMINE LARGEST FREE SPACEC FIND EOF (FILE SIZE)3 MAP = (((MAX_LBN / CLUSTER_FACTOR) + 4095) / 4096)B& CLUSTERS = (MAX_LBN / CLUSTER_FACTOR)- FILENAME = DEV(0:IDEV)//'[000000]BITMAP.SYS'GG OPEN(UNIT=2,FILE=FILENAME,READONLY,ORGANIZATION='SEQUENTIAL',RECL=512,I* 1 SHARED,RECORDTYPE='FIXED',STATUS='OLD')C SKIP HEADER RECORD READ(2,113,END=125) BITMAPT113 FORMAT(512A) C BITMAP LOOPS120 READ(2,113,END=126) BITMAP0 IF (CLUSTERS .LT. 4096) NUMBYTES = CLUSTERS / 8) XBYTES = CLUSTERS - ((NUMBYTES * 8) + 1)T CLUSTERS = CLUSTERS - 4096I DO 125 K = 1,NUMBYTES IBITMAP = BITMAP(K) IF (IBITMAP .EQ. N0) THEN CURFREE = 0BC BUSED = BUSED + 8 LASTBIT = .TRUE. GOTO 125 END IFR IF (IBITMAP .EQ. N127) THEN CURFREE = CURFREE + 8TC BFREE = BFREE + 8 IF (LASTBIT) THENL HOLES = HOLES + 1 END IF IF (CURFREE .GT. BIGFREE) THEN BIGFREE = CURFREE END IF LASTBIT = .FALSE. GOTO 125 END IF DO 130 LX = 0,7 BIT = BITEST(IBITMAP,LX)I IF (BIT) THEN CURFREE = CURFREE + 1C BFREE = BFREE + 1 IF (LASTBIT) THEN HOLES = HOLES + 1 END IF IF (CURFREE .GT. BIGFREE) THEN BIGFREE = CURFREE END IF LASTBIT = .FALSE.I ELSE4C BUSED = BUSED + 1 CURFREE = 0 LASTBIT = .TRUE. END IFR 130 CONTINUE 125 CONTINUE IF (NUMBYTES .EQ. 512) GOTO 120C DO EXTRA BITSI IBITMAP = BITMAP(NUMBYTES + 1)R DO 230 LX = 0,XBYTESX BIT = BITEST(IBITMAP,LX)E IF (BIT) THEN CURFREE = CURFREE + 1EC BFREE = BFREE + 1 IF (LASTBIT) THENT HOLES = HOLES + 1 END IF IF (CURFREE .GT. BIGFREE) THEN BIGFREE = CURFREE END IF LASTBIT = .FALSE. ELSERC BUSED = BUSED + 1 CURFREE = 0T LASTBIT = .TRUE. END IF4 230 CONTINUE(126 BIGBLOCKS = BIGFREE * CLUSTER_FACTOR C BFREE = BFREE * CLUSTER_FACTOR C BUSED = BUSED * CLUSTER_FACTORC BTOT = BFREE + BUSEDDC THIS WILL HAVE AN INCORRECT ANSWER IF THE LAST CLUSTER IS NOT FULL?C BECAUSE THE TOTAL BLOCKS IS NOT DIVISABLE BY THE CLUSTER SIZEGC WRITE(1,132)BFREE,BUSED,BTOTHC132 FORMAT(' FREE BITMAP BLOCKS = ',I8,' USED BLKS = ',I8,' TOT = ',I8) CLOSE(UNIT=2,DISPOSE='SAVE')C LOOP IF VOLUME SET8 IF ((VOLSET) .AND. (VOLSETNUM .LT. VOLSETCNT)) GOTO 102/C DONE WITH BITMAP, START PROCESSING INDEXF.SYSGEC IF ITS A VOLUME SET WE HAVE TO START WITH THE ROOT AND LOOP THROUGH*2C THE MEMBERS FOR BOTH THE BITMAP AND INDEXF SCANSC IS IT A VOLUME SET MEMBER? IF (.NOT. VOLSET) GOTO 903+C GET RID OF CHANNEL FROM BITMAP PROCESSINGR STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C START WITH THE ROOT VOLUME' STATUS = SYS$ASSIGN(VOLSETROOT,CHAN,,)E/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))RC GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)V/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))  DEV = VOLSETROOT  IDEV = VOLSETROOTLN GOTO 903D 902 CONTINUE DEV = VOLSETNEXTR IDEV = VOLSETNEXTLR STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))RC assign channel to next volumeR' STATUS = SYS$ASSIGN(VOLSETNEXT,CHAN,,) / IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)M/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))B 903 CONTINUEC FLUSH OUT FIB CACHES FIB.COUNT = FIB$K_LENGTHR FIB.FIBLOC = %LOC(FIBD)&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL% FIBD.FIB$W_EXCTL = FIB$C_FLUSH_CACHEN$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ" FIBD.FIB$L_EXSZ = FIB$C_FID_CACHE FUNC = IO$_ACPCONTROL@ STATUS = SYS$QIOW(,%VAL(CHAN),%VAL(FUNC),%REF(IOSB),,,FIB,,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))A9 IF (.NOT. IOSB.STATUS) CALL LIB$STOP (%VAL(IOSB.STATUS))E&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL FIBD.FIB$W_EXCTL = 0*$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ FIBD.FIB$L_EXSZ = 0(C USE DEV FROM BITMAP OR VOLUME SET LOOP- FILENAME = DEV(0:IDEV)//'[000000]INDEXF.SYS'RG OPEN(UNIT=3,FILE=FILENAME,READONLY,ORGANIZATION='SEQUENTIAL',RECL=128,H= 1 SHARED,RECORDTYPE='FIXED',STATUS='OLD',FORM='UNFORMATTED')NC READ BOOTSTRAP BLOCK READ(3,END=325) INDEXFC READ HOME BLOCKY READ(3,END=325) HOMEFC SAVE DEFAULT WINDOW SIZE WINDOWS = HOME.WINDOW! NUMEXTENTS = NUMWINDOW * WINDOWSE* IF (MINWINDOW .EQ. 0) MINWINDOW = WINDOWS%C CALCULATE VBN OF FIRST FILE HEADER 2 HEADERADD = (CLUSTER_FACTOR * 4) + HOME.IBMAPSIZE0C LOOP TO SKIP NON-HEADER RECS (ALREADY READ 2!) DO 330 K = 3,HEADERADDD READ(3,END=330)INDEXF 330 CONTINUE 325 CONTINUEEC WE ARE NOW READY TO BUILD THE HEADER ARRAY USING THE INDEXF RECORDS II = 0C NUMHEADERS = 0 335 READ(3,END=360)HEADER*( IF ((ARRAY_INDEX .GT. ARRAY_LIMIT) .OR.( 1 (ARRAY_EINDEX .GT. ARRAY_LIMIT)) THEN8 TYPE *,'ARRAY LIMIT REACHED, REPORT MAY BE INCOMPLETE' GOTO 360 END IFI II = II + 1C CHECK FOR DELETED HEADER RECC IF ((HEADER.FID.FIDNUM .EQ. 0).AND.(HEADER.FID.FIDNMX .EQ. 0).AND.N# 1 (HEADER.FID.FIDRVN .EQ. 0)) THENE( DEL_HEADER_COUNT = DEL_HEADER_COUNT + 1C TYPE *,'HEADER FID = 0' GOTO 335  END IFAC CHECKSUM IS 0 ON DELETED RECS ! IF (HEADER.CHECKSUM .EQ. 0) THENM( DEL_HEADER_COUNT = DEL_HEADER_COUNT + 1C TYPE *,'HEADER CHECKSUM = 0' GOTO 335O END IFABC FH2$V_MARKDEL IS BIT 15 OF FH2$L_FILECHAR IS SET ON DELETED RECS FILECHAR = HEADER.FILECHARC IF (BJTEST(FILECHAR,15)) THEN( DEL_HEADER_COUNT = DEL_HEADER_COUNT + 1C TYPE *,'MARKDEL IS SET'I GOTO 335H END IF C INVALID HEADER TESTS IIDOFFSET = HEADER.IDOFFSET IMPOFFSET = HEADER.MPOFFSET IACOFFSET = HEADER.ACOFFSET IRSOFFSET = HEADER.RSOFFSET& CALL MVBITS(IIDOFFSET,0,8,IDOFFSET,0)& CALL MVBITS(IMPOFFSET,0,8,MPOFFSET,0)& CALL MVBITS(IACOFFSET,0,8,ACOFFSET,0)& CALL MVBITS(IRSOFFSET,0,8,RSOFFSET,0) IWORDS_INUSE = HEADER.MAP_INUSE, CALL MVBITS(IWORDS_INUSE,0,8,WORDS_INUSE,0) ISTRUCLEVL = HEADER.STRUCLEVL( CALL MVBITS(ISTRUCLEVL,0,8,STRUCLEVL,0) ISTRUCLEVH = HEADER.STRUCLEVH( CALL MVBITS(ISTRUCLEVH,0,8,STRUCLEVH,0)/556 FORMAT(' INVALID HEADER (OFFSETS) FOR ',I8)I4557 FORMAT(' INVALID HEADER (WORDS IN USE) FOR ',I8)0558 FORMAT(' INVALID HEADER (STRUCLEV) FOR ',I8)C CHECK FOR INVALID HEADER IF (STRUCLEVL .LT. 1) THENI WRITE(*,558)II GOTO 335 END IF IF (STRUCLEVH .NE. 2) THENC WRITE(*,558)II GOTO 335 END IF! IF (MPOFFSET .LT. IDOFFSET) THENU WRITE(*,556)II GOTO 335 END IF! IF (ACOFFSET .LT. MPOFFSET) THENE WRITE(*,556)II GOTO 335 END IF! IF (RSOFFSET .LT. ACOFFSET) THEND WRITE(*,556)II GOTO 335 END IF1 IF (WORDS_INUSE .GT. (ACOFFSET - MPOFFSET)) THEN  WRITE(*,557)II GOTO 335 END IFCRFC HARDCODED 40 (FIXED HEADER SIZE PLUS THE FH2$L_HIGHWATER 4 BYTES) TOJC CORRECT ERROR ON PAGE 19 OF FILE SYSTEM INTERNALS MANUAL THAT WOULD HAVEJC CAUSED ALL FILES WITH A HIGHWATER MARK OF > 80 TO SHOW UP AS BAD HEADERSCN IF ((IDOFFSET) .LT. (40)) THEN  TYPE *,'IDOFFSET = ',IDOFFSETC( TYPE *,'HIGHWATER = ',HEADER.HIGHWATER) BAD_HEADER_COUNT = BAD_HEADER_COUNT + 1 FID.FIDNUM = HEADER.FID.FIDNUM FID.FIDSEQ = HEADER.FID.FIDSEQ FID.FIDRVN = HEADER.FID.FIDRVN FID.FIDNMX = HEADER.FID.FIDNMX/ STATUS = LIB$FID_TO_NAME(DEVICE,FID,FILEN,,,)e IF (.NOT. STATUS) THEN) FILEN = 'UNABLE TO DETERMINE FILENAME'u FILEL = 28  ELSE FILEL = INDEX(FILEN,':') + 1  END IF TYPE *,'BAD HEADER = ',FILEN GOTO 335 END IFAC VALID HEADER IDSTART = (2 * IDOFFSET) - 80 MPSTART = MPOFFSET - 40?C CHAIN THROUGH MAPPING POINTERS COUNTING THE NUMBER OF EXTENTSI IF (WORDS_INUSE .EQ. 0) THENe EXTENT_COUNT = 0 GOTO 350 END IFe EXTENT_COUNT = 0R WORDS = 0 337 CONTINUE" IF (WORDS .GT. WORDS_INUSE) THEN GOTO 350 END IFP OFFSET = MPSTART + WORDS4# POINTER_LWORD = HEADER.INT(OFFSET)g! BIT14 = BITEST(POINTER_LWORD,14) ! BIT15 = BITEST(POINTER_LWORD,15)_C PLACEMENT - FORMAT 0. IF ((.NOT. BIT14).AND.(.NOT. BIT15)) GOTO 342C MAP - FORMAT 1( IF ((BIT14).AND.(.NOT. BIT15)) GOTO 344C MAP - FORMAT 2( IF ((.NOT. qο$ DISKM010.A [DISK.A]REVIEW_DISK_NOVPA.FOR;9JL"6BIT14).AND.(BIT15)) GOTO 346C MAP - FORMAT 3" IF ((BIT14).AND.(BIT15)) GOTO 348 C ERROR... WRITE(*,341)/9341 FORMAT(' UNKNOWN RETRIEVAL POINTER FORMAT - EXITING') GOTO 990C 342 CONTINUE WORDS = WORDS + 1 GOTO 337T 344 CONTINUE EXTENT_COUNT = EXTENT_COUNT + 1 WORDS = WORDS + 2 GOTO 337Y 346 CONTINUE EXTENT_COUNT = EXTENT_COUNT + 1 WORDS = WORDS + 3 GOTO 337 348 CONTINUE EXTENT_COUNT = EXTENT_COUNT + 1 WORDS = WORDS + 4 GOTO 337 350 CONTINUEDC KEEP TRACK OF TOTAL NUMBER OF EXTENTS ON THE DISK (FRAGMENTATION!)) TOT_EXTENTS = TOT_EXTENTS + EXTENT_COUNT.C IF EXTENSION HEADER, SAVE IT IN EXTENT ARRAY IF (HEADER.SEG_NUM .NE. 0) THEN5 EARRAY(ARRAY_EINDEX).FID.FIDNUM = HEADER.FID.FIDNUM 5 EARRAY(ARRAY_EINDEX).FID.FIDSEQ = HEADER.FID.FIDSEQ 5 EARRAY(ARRAY_EINDEX).FID.FIDRVN = HEADER.FID.FIDRVNI5 EARRAY(ARRAY_EINDEX).FID.FIDNMX = HEADER.FID.FIDNMX? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDNUM = HEADER.EXTFID.EXFIDNUM%? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDSEQ = HEADER.EXTFID.EXFIDSEQL? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDRVN = HEADER.EXTFID.EXFIDRVND? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDNMX = HEADER.EXTFID.EXFIDNMX.- EARRAY(ARRAY_EINDEX).EXTENTS = EXTENT_COUNTB MAX_EINDEX = ARRAY_EINDEX=! ARRAY_EINDEX = ARRAY_EINDEX + 1. GOTO 335 END IF.C THIS IS A PRIMARY HEADER FILE_COUNT = FILE_COUNT + 1 C FILENAME AND DIRECTORY PATH... FID.FIDNUM = HEADER.FID.FIDNUMC FID.FIDSEQ = HEADER.FID.FIDSEQN FID.FIDRVN = HEADER.FID.FIDRVNV FID.FIDNMX = HEADER.FID.FIDNMXR C FILESIZE HIBLKL = HEADER.IRECATTR(4) HIBLKH = HEADER.IRECATTR(3)$ CALL MVBITS(HIBLKL,0,16,FILESIZE,0)% CALL MVBITS(HIBLKH,0,16,FILESIZE,16)E)C AVOID GETTING THE NAME IF WE DON'T CAREM( IF ((EXTENT_COUNT .LT. MINWINDOW) .AND.% 1 (FILESIZE .LT. BIGFILE_SIZE) .AND.O, 1 (HEADER.EXTFID.EXFIDNUM .EQ. 0)) GOTO 335 NN = -1 356 CONTINUE. STATUS = LIB$FID_TO_NAME(DEVICE,FID,FILEN,,,)< IF ((VOLSET).AND.(.NOT. STATUS).AND.(NN.LT.VOLSETCNT)) THEN NN = NN + 1I FID.FIDRVN = NNE GOTO 356 ENDIF ) IF (.NOT. STATUS) THENN( FILEN = 'UNABLE TO DETERMINE FILENAME' FILEL = 28 ELSEA FILEL = INDEX(FILEN,':') + 1' FILEN = FILEN(FILEL:LEN(FILEN)-FILEL)_ END IFDC SAVE BIG FILES (MAY NOT BE FRAGMENTED BUT LETS KEEP TRACK OF THEM)% IF (FILESIZE .GT. BIGFILE_SIZE) THEN=.C TYPE *,' BIGFILE: ',FILEN,' SIZE ',FILESIZE*C TYPE *,' FILENAME1 = ',HEADER.FILENAME1*C TYPE *,' FILENAME2 = ',HEADER.FILENAME26 BIG_FILE_ARRAY(BIGFILE_ARRAY_INDEX).FILENAME = FILEN> BIG_FILE_ARRAY(BIGFILE_ARRAY_INDEX).REVDATE = HEADER.REVDATE9 BIG_FILE_ARRAY(BIGFILE_ARRAY_INDEX).FILESIZE = FILESIZEN/ BIGFILE_ARRAY_INDEX = BIGFILE_ARRAY_INDEX + 1 ENDIF&C IF IT HAS EXTENSION HEADERS, SAVE IT, IF (HEADER.EXTFID.EXFIDNUM .NE. 0) GOTO 355?C IF NO EXTENTS OR EXTENTS < WINDOW SIZE WE DON'T CARE ABOUT IT.2 IF (.NOT. (MINWINDOW .LT. EXTENT_COUNT)) GOTO 335 355 CONTINUE C FILE NUMBERM2 ARRAY(ARRAY_INDEX).FID.FIDNUM = HEADER.FID.FIDNUM2 ARRAY(ARRAY_INDEX).FID.FIDSEQ = HEADER.FID.FIDSEQ2 ARRAY(ARRAY_INDEX).FID.FIDRVN = HEADER.FID.FIDRVN2 ARRAY(ARRAY_INDEX).FID.FIDNMX = HEADER.FID.FIDNMX.C EXTENT HEADER NUMBER, 0 IF NO EXTENT HEADERS< ARRAY(ARRAY_INDEX).EXTFID.EXFIDNUM = HEADER.EXTFID.EXFIDNUM< ARRAY(ARRAY_INDEX).EXTFID.EXFIDSEQ = HEADER.EXTFID.EXFIDSEQ< ARRAY(ARRAY_INDEX).EXTFID.EXFIDRVN = HEADER.EXTFID.EXFIDRVN< ARRAY(ARRAY_INDEX).EXTFID.EXFIDNMX = HEADER.EXTFID.EXFIDNMXIC COUNTED NUMBER OF EXTENTS, HEADERS = 1, INCREMENT IN EXTENT HEADER LOOPp ARRAY(ARRAY_INDEX).HEADERS = 1* ARRAY(ARRAY_INDEX).EXTENTS = EXTENT_COUNT$ ARRAY(ARRAY_INDEX).FILENAME = FILEN' ARRAY(ARRAY_INDEX).FILESIZE = FILESIZE_ MAX_INDEX = ARRAY_INDEX ARRAY_INDEX = ARRAY_INDEX + 1 GOTO 335 360 CONTINUE$C LOOP IF MORE MEMBERS IN VOLUME SET8 IF ((VOLSET) .AND. (VOLSETNUM .LT. VOLSETCNT)) GOTO 902%C DEASSIGN THE CHANNEL TO THE DEVICE = STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))2#C DONE WITH INDEXF.SYS, SO CLOSE IT) CLOSE(UNIT=3,DISPOSE='SAVE')I4C ADD EXTENTS OF EXTENSION HEADERS TO PRIMARY HEADER DO 399 K = 1, MAX_INDEX. IF (ARRAY(K).EXTFID.EXFIDNUM .EQ. 0) GOTO 399 NUMHEADERS = NUMHEADERS + 1# FINDNUM = ARRAY(K).EXTFID.EXFIDNUMT# FINDSEQ = ARRAY(K).EXTFID.EXFIDSEQU# FINDRVN = ARRAY(K).EXTFID.EXFIDRVN # FINDNMX = ARRAY(K).EXTFID.EXFIDNMXU M = 1#397 IF (M .GT. MAX_EINDEX) GOTO 399:C CHECK FOR EXTENT THAT MATCHES THE ONE WE ARE LOOKING FOR/C IF ((FINDNUM .EQ. EARRAY(M).FID.FIDNUM) .AND.B-C 1 (FINDSEQ .EQ. EARRAY(M).FID.FIDSEQ) .AND.M.CC 1 (FINDRVN .EQ. EARRAY(M).FID.FIDRVN) .AND.1C 1 (FINDNMX .EQ. EARRAY(M).FID.FIDNMX)) GOTO 398A. IF ((FINDNUM .EQ. EARRAY(M).FID.FIDNUM) .AND., 1 (FINDSEQ .EQ. EARRAY(M).FID.FIDSEQ) .AND.0 1 (FINDNMX .EQ. EARRAY(M).FID.FIDNMX)) GOTO 398 M = M + 1 GOTO 397SC MATCHS 398 CONTINUE( ARRAY(K).HEADERS = ARRAY(K).HEADERS + 18 ARRAY(K).EXTENTS = ARRAY(K).EXTENTS + EARRAY(M).EXTENTS1C CHECK FOR LAST IN CHAIN => DONE FOR THIS HEADER / IF (EARRAY(M).EXTFID.EXFIDNUM .EQ. 0) GOTO 399HC GET NEXT EXTENT IN CHAIN$ FINDNUM = EARRAY(M).EXTFID.EXFIDNUM$ FINDSEQ = EARRAY(M).EXTFID.EXFIDSEQ$ FINDRVN = EARRAY(M).EXTFID.EXFIDRVN$ FINDNMX = EARRAY(M).EXTFID.EXFIDNMX?C SINCE WE GRAB HEADERS IN ORDER, WE MAY NOT HAVE TO START AT 1'> IF (EARRAY(M).EXTFID.EXFIDNUM .GT. EARRAY(M).FID.FIDNUM) THEN M = M + 1I ELSEE M = 1  END IFH GOTO 397O 399 CONTINUE E!C TYPE *,' THE DEVICE IS ',DEVICEAC=)C SORT THE ARRAY BY # HEADERS, # EXTENTSA750 INVERSIONS = 0 DO 760 K = 1, MAX_INDEX-1 DO 770 L = K+1, MAX_INDEX3 IF (ARRAY(K).HEADERS .LT. ARRAY(L).HEADERS) THEN E HOLDARRAY = ARRAY(K)  ARRAY(K) = ARRAY(L) ARRAY(L) = HOLDARRAYE INVERSIONS = 1$ GOTO 770A9 ELSE IF ((ARRAY(K).EXTENTS .LT. ARRAY(L).EXTENTS) .AND. 3 1 (ARRAY(K).HEADERS .EQ. ARRAY(L).HEADERS)) THEN D HOLDARRAY = ARRAY(K)B ARRAY(K) = ARRAY(L) ARRAY(L) = HOLDARRAYU INVERSIONS = 1A GOTO 770S END IF 770 CONTINUE 760 CONTINUE IF (INVERSIONS .EQ. 1) GOTO 750C OUTPUT DISK INFO@ BLOCKS_PER_FILE = ((TOT_MAX_LBN - TOT_FREEBLOCKS) / FILE_COUNT)C BLOCKS_USED = (100 * (TOT_MAX_LBN - TOT_FREEBLOCKS)) / TOT_MAX_LBN( IF (COM$DEV_CNT .EQ. 0) THENE BUSY = 0 QLEN = 0 OPCNT = 0V IOCNT = 0N ELSEI- BUSY = COM_SUM$DEV.DEV_F_BUSY / COM$DEV_CNT- QLEN = COM_SUM$DEV.DEV_F_QLEN / COM$DEV_CNT$/ OPCNT = COM_SUM$DEV.DEV_F_OPCNT / COM$DEV_CNTA4 IOCNT = INT(COM_SUM$DEV.DEV_F_IOCNT / COM$DEV_CNT) END IF  NULL = CHAR(0)! DLENGTH = INDEX(DEVICE,NULL) - 1=" VLENGTH = INDEX(VOLNAME,NULL) - 1C OUTPUT DISK INFO/C TYPE *,'BAD HEADER COUNT = ',BAD_HEADER_COUNTS2 WRITE(1,500) DEVICE(1:DLENGTH),VOLNAME(1:VLENGTH)! WRITE(1,503)HOLES,BIGBLOCKS,BUSY4 WRITE(1,501) TOT_MAX_LBN,TOT_FREEBLOCKS,BLOCKS_USED4 WRITE(1,506) FILE_COUNT,TOT_EXTENTS,BLOCKS_PER_FILE+ WRITE(1,502) ERRCNT,CLUSTER_FACTOR,WINDOWSC WRITE(1,504) OPCNT,IOCNT,QLEN, WRITE(1,505) NUMHEADERS,MAX_INDEX,MINWINDOW;500 FORMAT (' Disk analysis for ',A20,' Logical name ',A10,, 1 ' from node ')AE501 FORMAT (' Disk size ',I8,' Free space ',I8,' Pct used ',I3,L 1 '%')FE502 FORMAT (' Error cnt ',I8,' Cluster size ',I8,' Windows ',I4)SF503 FORMAT (' Bitmap holes ',I8,' Largest hole ',I8,' Pct busy ',F5.2)6504 FORMAT (' Ave I/O /sec ',F8.2,' Thruput /sec ',I8, 1 ' Ave Que ',F6.2)E505 FORMAT (' ',I4,' Files > 1 header ',I4,' Files > ',I4,' extents') E506 FORMAT (' # Files ',I8,' Tot # Extent ',I8,' Blks/file ',I8)F!C WRITE OUT THE DISK HISTORY FILE > WRITE(4,550) HIST_YEAR,HIST_MONTH,HIST_DAY,DEVICE(1:DLENGTH),& 2 VOLNAME(1:VLENGTH),HOLES,BIGBLOCKS,= 3 BUSY,MAX_LBN,FREEBLOCKS,BLOCKS_USED,ERRCNT,CLUSTER_FACTOR,A; 4 WINDOWS,OPCNT,IOCNT,QLEN,NUMHEADERS,MAX_INDEX,MINWINDOW, 5 FILE_COUNT,TOT_EXTENTS$F550 FORMAT(' ','19',I2.2,'-',I2.2,'-',I2.2,' ',A20,' ',A10,' ',= 2 I8,' ',I8,' ',F5.2,' ',I8,' ',I8,' ',I3,' ',I8,' ',I8,' ',X? 3 I4,' ',F8.2,' ',I8,' ',F6.2,' ',I4,' ',I4,' ',I4,' ',I8,' ',= 4 I8).C PRINT OUT THE FILE INFORMATION FOR EACH FILE WRITE(1,802) WRITE(1,801)E WRITE(1,803)( WRITE(1,802)S)801 FORMAT(' FILE FILE FILE')X802 FORMAT(' ')CA803 FORMAT(' HEADERS EXTENTS SIZE [DIRECTORY]FILENAME.EXT')T(804 FORMAT(' ',I8,' ',I8,' ',I8,' ',A86)C850 FORMAT(' ','19',I2.2,'-',I2.2,'-',I2.2,' ',A20,' ',A10,' ',A86,K( 2 ' ',I8,' ',I3,' ',F4.1,' ',I8,' ',I8) DO 805 K = 1,MAX_INDEXC WRITE (1,804) ARRAY(K).HEADERS,ARRAY(K).EXTENTS,ARRAY(K).FILESIZE,4 2 ARRAY(K).FILENAME@ $ DISKM010.A [DISK.A]REVIEW_DISK_NOVPA.FOR;9JLs GC WRITE FILE HISTORY RECORD IF FILE HAS > HISTWINDOWS OF EXTENTS+ IF (ARRAY(K).EXTENTS .GT. NUMEXTENTS) THEN=@ WRITE(5,850) HIST_YEAR,HIST_MONTH,HIST_DAY,DEVICE(1:DLENGTH),9 2 VOLNAME(1:VLENGTH),ARRAY(K).FILENAME,ARRAY(K).HEADERS,I; 3 ARRAY(K).HOTFILES,ARRAY(K).HOTFILES_IO,ARRAY(K).EXTENTS,B 4 ARRAY(K).FILESIZE ENDIF 805 CONTINUE/C PRINT OUT BIGFILE LIST IF THERE WERE BIGFILES ) IF (BIGFILE_ARRAY_INDEX .EQ. 1) GOTO 810L WRITE (1,802) WRITE (1,806)BIGFILE_SIZE@806 FORMAT(' Files larger than ',I8,' blocks on this disk are:') WRITE (1,808) WRITE (1,802) 807 FORMAT(' ',A11,1X,I8,1X,A86);808 FORMAT(' Modified Date Size [Directory]Filename.Ext')C& DO 810 K = 1, BIGFILE_ARRAY_INDEX - 1A STATUS = SYS$ASCTIM(,FULLDATE,%REF(BIG_FILE_ARRAY(K).REVDATE),0)E1 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))E C TYPE *, 'FULLDATE = ',FULLDATE DATE = FULLDATE(1:11)C TYPE *, 'DATE = ',DATEG WRITE(1,807)DATE,BIG_FILE_ARRAY(K).FILESIZE,BIG_FILE_ARRAY(K).FILENAMEF 810 CONTINUE C ALL DONE 990 CLOSE(UNIT=1,DISPOSE='SAVE') CLOSE(UNIT=4,DISPOSE='SAVE')F CLOSE(UNIT=5,DISPOSE='SAVE')R!C END OF REVIEW_DISK MAIN PROGRAMF 999 CONTINUE END*[DISK.A]REVIEW_DISK_VPA.CLD;1+, ./ 4L- 0123KPWO5C6ze#7(<^89GHJDEFINE VERB REVIEW_DISK( IMAGE DISK$MANAGEMENT:REVIEW_DISK.EXEDPARAMETER P1,LABEL=DEVICE,VALUE(REQUIRED,TYPE=$DEVICE),PROMPT="Disk"QUALIFIER NODE,VALUEQUALIFIER WINDOW,VALUEQUALIFIER HISTWINDOW,VALUELQUALIFIER BEGINNING,DEFAULT,VALUE (DEFAULT="YESTERDAY+08:00",TYPE=$DATETIME)IQUALIFIER ENDING,DEFAULT,VALUE (DEFAULT="YESTERDAY+17:00",TYPE=$DATETIME)HQUALIFIER OUTPUT,DEFAULT,VALUE (DEFAULT="REVIEW_DISK.RPT",TYPE=$OUTFILE)*[DISK.A]REVIEW_DISK_VPA.FOR;4+, .`/ 4O`^- 0123KPWOa56(679"(<^89GHJCC REVIEW_DISK.FORCC DANIEL R. BUCKLEY DECCHC THIS SOFTWARE IS SUPPLIED "AS IS" WITH NO SUPPORT IMPLIED OR OTHERWISE&C FROM DIGITAL EQUIPMENT CORPORATION. CDC THIS PROGRAM IS USED TO ANALYZE A DISK TO DETERMINE THE NUMBER OF JC BITMAP HOLES, THE LARGEST FREE BITMAP HOLE, THE AMOUNT OF FREE SPACE ANDDC A LIST OF FILES WITH THE GREATEST NUMBER OF EXTENTS AND EXTENSION IC HEADERS. IF A VPA .CPD FILE IS (OPTIONALLY) SPECIFIED, HOTFILE AND DISK*C USAGE FROM THAT NODE WILL ALSO BE SHOWN.C9C THIS PROGRAM HAS BEEN TESTED AND WORKS ON VOLUME SETS. CCC THIS PROGRAM HAS BEEN TESTED AND WORKS ON HOST-BASED SHADOW SETS.CDC BECAUSE A STRIPESET ALLOCATES ALMOST ALL OF THE SPACE ON A DISK TOGC A DUMMY FILE TO ALLOW THE STRIPING DRIVER CONTROL OVER THE ALLOCATIONHC OF SPACE, THIS PROGAM WILL SHOW THE STRIPPED DEVICE AS HAVING 1 BITMAPDC HOLE AND FREESPACE AS EXPECTED. LOOKING AT AN INDIVIDUAL STRIPESETIC MEMBER WILL SHOW A SMALL NUMBER OF BITMAP HOLES, SMALL LARGEST HOLE ANDC ALMOST NO FREE SPACE.CJC ALMOST ALL OF THE RUN-TIME OF THIS PROGRAM IS CONSUMED IN THE INDEXF.SYS&C READING AND CHECKING OF THE HEADERS.CFC THIS PROGRAM REQUIRES THE LIBRARY SYS$LIBRARY:VPA$LIB.FOR TO COMPILE<C (PROVIDED WITH VPA AS THE FORTRAN DATA EXTRACTION LIBRARY)CEC THE CURRENT MAXIMUM NUMBER OF FILES THAT CAN BE REPORTED ON IS 1000CC IF YOU NEED TO INCREASE THIS CHANGE BOTH THE ARRAYS (ARRAY(1000),,C EARRAY(1000)) AND THE ARRAY_LIMIT VARIABLECJC 4/22/91 DRB MODIFIED FORMAT 804 TO AVOID OUTPUT OVERFLOW ON THE HOTFILESFC I/O RATE, ADDED AN ADDITIONAL DISK SUMMARY LINE CONTAINING I/O RATE,JC THROUGHPUT AND QUEUE INFORMATION. MODIFIED AND TESTED TO WORK WITH HBVS.CFC 6/25/92 DRB ADDED BIGFILE ARRAY TO PRINT A LIST OF FILES LARGER THENEC BIGFILE_SIZE (LOGICAL) AT THE END OF THE .FRAG FILE. ALSO SHOWN ARE$C THE MODIFIED DAY AND THE FILESIZE. PROGRAM REVIEW_DISK IMPLICIT INTEGER*4 (A - Z) INCLUDE '($SSDEF)' INCLUDE '($IODEF)' INCLUDE '($DVIDEF)' INCLUDE '($ATRDEF)' INCLUDE '($DCDEF)' INCLUDE '($DEVDEF)' INCLUDE '($FIDDEF)' INCLUDE '($FIBDEF)' INCLUDE '($SECDEF)' INCLUDE '($SFDEF)'" INCLUDE 'SYS$LIBRARY:VPA$LIB.FOR' INCLUDE '($CLIDEF)' INCLUDE '($SYSSRVNAM)' INCLUDE '($LNMDEF)' CHARACTER*25 FULLDATE CHARACTER*256 BIGFILE_STRING CHARACTER*11 DATE CHARACTER*1 NULL CHARACTER*64 HOST CHARACTER*64 VOLSETROOT CHARACTER*64 VOLSETNEXT CHARACTER*64 ALTHOST CHARACTER*32 DEV CHARACTER*64 DEVICE CHARACTER*12 VOLNAME CHARACTER*39 FILENAME CHARACTER*86 FILEN CHARACTER*25 START_TIME CHARACTER*25 STOP_TIME CHARACTER*39 OUTPUT_FILE CHARACTER*4 AMINWINDOW CHARACTER*4 AHISTWINDOW BYTE BITMAP(512) BYTE INDEXF(512) BYTE FINDRVN BYTE FINDNMX LOGICAL*1 BIT LOGICAL*1 LASTBIT INTEGER*2 FINDNUM INTEGER*2 FINDSEQ INTEGER*2 HIBLKL INTEGER*2 HIBLKH INTEGER*2 EFBLKL INTEGER*2 EFBLKH INTEGER*2 FILEL INTEGER*2 N0 INTEGER*2 N127 INTEGER*2 CHAN INTEGER*2 FUNC INTEGER*2 IBITMAP INTEGER*2 IDOFFSET INTEGER*2 MPOFFSET INTEGER*2 ACOFFSET INTEGER*2 RSOFFSET INTEGER*2 IIDOFFSET INTEGER*2 IMPOFFSET INTEGER*2 IACOFFSET INTEGER*2 IRSOFFSET INTEGER*2 WORDS_INUSE INTEGER*2 IWORDS_INUSE INTEGER*2 POINTER_LWORD INTEGER*2 STRUCLEVL INTEGER*2 ISTRUCLEVL INTEGER*2 STRUCLEVH INTEGER*2 ISTRUCLEVH INTEGER*2 LX INTEGER*4 BIGFILE_LENGTH INTEGER*4 BIGFILE_SIZE INTEGER*4 BIGFILE_ARRAY_INDEX INTEGER*4 BLOCKS_PER_FILE INTEGER*4 TOT_EXTENTS INTEGER*4 FILE_COUNT INTEGER*4 DEL_HEADER_COUNT INTEGER*4 BAD_HEADER_COUNT INTEGER*4 NUMWINDOW INTEGER*4 NUMEXTENTS INTEGER*4 AHISTWINDOW_SIZE INTEGER*4 VOLSET INTEGER*4 VOLSETNUM INTEGER*4 VOLSETCNT INTEGER*4 HIST_YEAR INTEGER*4 HIST_MONTH INTEGER*4 HIST_DAY INTEGER*4 STATUS INTEGER*4 DLENGTH INTEGER*4 VLENGTH INTEGER*4 VPA$OPEN_CONTEXT INTEGER*4 VPA$READ_CONTEXT INTEGER*4 VPA$CLOSE_CONTEXT INTEGER*4 CLI$GET_VALUE INTEGER*4 CLI$PRESENT INTEGER*4 NODE_NAME_SIZE INTEGER*4 OUTPUT_FILE_SIZE INTEGER*4 WORDS INTEGER*4 FILECHAR INTEGER*4 IDSTART INTEGER*4 EXTENT_COUNT INTEGER*4 OFFSET INTEGER*4 MAX_INDEX INTEGER*4 ARRAY_LIMIT INTEGER*4 ARRAY_INDEX INTEGER*4 MAX_EINDEX INTEGER*4 ARRAY_EINDEX INTEGER*4 IDEV INTEGER*4 XBYTES INTEGER*4 BTOT INTEGER*4 BFREE INTEGER*4 BUSED INTEGER*4 CURFREE INTEGER*4 BIGFREE INTEGER*4 BIGBLOCKS INTEGER*4 NUMBYTES INTEGER*4 CLUSTERS INTEGER*4 MAX_FILES INTEGER*4 MAX_LBN INTEGER*4 FREEBLOCKS INTEGER*4 TOT_MAX_LBN INTEGER*4 TOT_FREEBLOCKS INTEGER*4 CLUSTER_FACTOR INTEGER*4 BLOCKS_USED INTEGER*4 NUM_DIRS INTEGER*4 ERRCNT INTEGER*4 HOLES INTEGER*4 FREE_HEADERS INTEGER*4 WINDOWS INTEGER*4 TWOWINDOWS INTEGER*4 MINWINDOW INTEGER*4 AMINWINDOW_SIZE INTEGER*4 BEG_LEN INTEGER*4 END_LEN INTEGER*4 NUMHEADERS INTEGER*4 MAX_POINTERS INTEGER*4 MAX_HEADERS INTEGER*4 DEVCHAR INTEGER*4 DEVCLASS INTEGER*4 DEVICEL INTEGER*4 VOLSETNEXTL INTEGER*4 VOLSETROOTL INTEGER*4 VOLNAM_B INTEGER*4 MAP INTEGER*4 MPSTART INTEGER*4 FILESIZE INTEGER*4 IOCNT REAL*4 BUSY REAL*4 QLEN REAL*4 OPCNT EXTERNAL CLI$_ABSENT EXTERNAL VPA$_NOMORE RECORD /CONTEXT/ VPA$CTX7C DEVICE NAME FOR LIB$FID_TO_NAME RUN TIME LIBRARY CALL STRUCTURE /LIBFIDB/ BYTE COUNT CHARACTER*32 DEVICEN END STRUCTURE RECORD /LIBFIDB/ LIBFID+C SET UP THE ITEMLISTS FOR THE GETDVI CALLS STRUCTURE /GETDVI_ITEM/ STRUCTURE ITEM(12) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST END STRUCTURE RECORD /GETDVI_ITEM/ ITMLST STRUCTURE /GETDVI_ITEM2/ STRUCTURE ITEM2(5) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGER*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST2 END STRUCTURE RECORD /GETDVI_ITEM2/ ITMLST2 STRUCTURE /GETDVI_ITEM3/ STRUCTURE ITEM3(1) INTEGER*2 BUFLEN INTEGER*2 BUFCODE INTEGER*4 ADDR INTEGEO $ DISKM010.A  [DISK.A]REVIEW_DISK_VPA.FOR;4O`" R*4 ADDRLEN END STRUCTURE INTEGER*4 END_OF_LIST3 END STRUCTURE RECORD /GETDVI_ITEM3/ ITMLST3C IOSB FOR QIOW STRUCTURE /IOSBX/ INTEGER*2 STATUS INTEGER*2 TRANSFER INTEGER*4 DEVICE END STRUCTURE RECORD /IOSBX/ IOSBC INDEXF.SYS HOME BLOCK STRUCTURE /HOMEB/ INTEGER*4 HOMELBN INTEGER*4 ALHOMELBN INTEGER*4 ALTIDXLBN INTEGER*2 STRUCLEV INTEGER*2 CLUSTER INTEGER*2 HOMEVBN INTEGER*2 ALHOMEVBN INTEGER*2 ALTIDXVBN INTEGER*2 IBMAPVBN INTEGER*4 IBMAPLBN INTEGER*4 MAXFILES INTEGER*2 IBMAPSIZE INTEGER*2 RESFILES INTEGER*2 DEVTYPE INTEGER*2 RVN INTEGER*2 SETCOUNT INTEGER*2 VOLCHAR INTEGER*4 VOLOWNER INTEGER*4 RESERVED1 INTEGER*2 PROTECT INTEGER*2 FILEPROT INTEGER*2 RESERVED2 INTEGER*2 CHECKSUM1 CHARACTER*8 CREDATE BYTE WINDOW BYTE LRU_LIM INTEGER*2 EXTEND CHARACTER*440 FILLER END STRUCTURE RECORD /HOMEB/ HOMEC INDEXF.SYS FILE HEADER BLOCK STRUCTURE /HEADERB/ BYTE IDOFFSET BYTE MPOFFSET BYTE ACOFFSET BYTE RSOFFSET INTEGER*2 SEG_NUM UNION MAP INTEGER*2 STRUCLEV END MAP MAP BYTE STRUCLEVL BYTE STRUCLEVH END MAP END UNION STRUCTURE FID INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ BYTE EXFIDRVN BYTE EXFIDNMX END STRUCTURE UNION MAP CHARACTER*32 RECATTR END MAP MAP INTEGER*2 IRECATTR(16) END MAP END UNION INTEGER*4 FILECHAR INTEGER*2 RESERVED1 BYTE MAP_INUSE BYTE ACC_MODE INTEGER*4 FILEOWNER INTEGER*2 FILEPROT STRUCTURE BCKFID INTEGER*2 BCKFIDNUM  INTEGER*2 BCKFIDSEQ BYTE BCKFIDRVN BYTE BCKFIDNMX END STRUCTURE BYTE JOURNAL BYTE RU_ACTIVE INTEGER*2 RESERVED2 INTEGER*4 HIGHWATER UNION MAP BYTE DATA(430) END MAP MAP CHARACTER*430 CHAR END MAP MAP INTEGER*2 INT(215) END MAP MAPEC THE RESERVED AREA (#3) AND CLASS_PROT FIELDS ARE NOT CURRENTLY USEDBC BY FILES-11 SO THE IDENT AREA STARTS IMMEDIATELY AFTER HIGHWATERC CHARACTER*8 RESERVED3C CHARACTER*20 CLASS_PROTC CHARACTER*20 FILENAME1 INTEGER*2 REVISION CHARACTER*8 CREDATE CHARACTER*8 REVDATE CHARACTER*8 EXPDATE CHARACTER*8 BAKDATE CHARACTER*66 FILENAME2 CHARACTER*310 REST_OF_HEADER END MAP END UNION INTEGER*2 CHECKSUM END STRUCTURE RECORD /HEADERB/ HEADER STRUCTURE /BIGFILEARRAY/ CHARACTER*86 FILENAME CHARACTER*8 REVDATE  INTEGER*4 FILESIZE END STRUCTURE+ RECORD /BIGFILEARRAY/ BIG_FILE_ARRAY(1000) STRUCTURE /INDEXFARRAY/ STRUCTURE FID INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ BYTE EXFIDRVN BYTE EXFIDNMX END STRUCTURE CHARACTER*86 FILENAME INTEGER*4 EXTENTS INTEGER*4 HEADERS INTEGER*4 FILESIZE INTEGER*4 HOTFILES REAL*4 HOTFILES_IO END STRUCTURE! RECORD /INDEXFARRAY/ ARRAY(1000) RECORD /INDEXFARRAY/ HOLDARRAY STRUCTURE /EXTENTARRAY/ STRUCTURE FID INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQ BYTE EXFIDRVN BYTE EXFIDNMX END STRUCTURE INTEGER*4 EXTENTS END STRUCTURE" RECORD /EXTENTARRAY/ EARRAY(1000) RECORD /FIBDEF/ FIBD STRUCTURE /FIB1/ INTEGER*2 COUNT INTEGER*2 FILLER INTEGER*4 FIBLOC END STRUCTURE RECORD /FIB1/ FIB STRUCTURE /FIDB/ INTEGER*2 FIDNUM  INTEGER*2 FIDSEQ BYTE FIDRVN BYTE FIDNMX END STRUCTURE RECORD /FIDB/ FID Structure / str_disk / Character*12 DEV_T_VOLNAME Character*15 DEV_T_DEVNAME7 Character*6 DEV_T_NODENAME ! disk server node name7 Character*40 DEV_T_HWNAME ! CPU type of disk owner Byte DEV_B_DEV_TYPE. Real*4 DEV_F_SERVICE ! Service time (ms)& Real*4 DEV_F_QLEN ! Queue length* Real*4 DEV_F_OPCNT ! Operations rate, Real*4 DEV_F_IOCNT ! Thruput byte rate, Real*4 DEV_F_PAGOP ! Paging operations. Real*4 DEV_F_PAGIO ! Paging thruput rate2 Real*4 DEV_F_SWPOP ! Swapping operation rate0 Real*4 DEV_F_SWPIO ! Swapping thruput rate( Real*4 DEV_F_BUSY ! Busy time (ms)$ Real*4 DEV_F_RDCNT ! Read rate* Real*4 DEV_F_FREE ! Free block count0 Real*4 DEV_F_MSCPOP ! MSCP operations rate5 Real*4 DEV_F_MSCPPG ! MSCP paging/swapping rate- Real*4 DEV_F_MSCPIO ! MSCP thruput rate( Real*4 DEV_F_SPLIT ! Split IO rate End Structure! Record / str_disk / COM_SUM$DEV Common / COM$CTX / VPA$CTX& Common / COM$ARRAY / ARRAY,MAX_INDEX. Common / COM$FIL / COM_SUM$FIL, com$fil_cnt. Common / COM$MET / COM_SUM$MET, com$met_cnt- Common / COM$DEV / COM_SUM$DEV, com$dev_cnt. Common / COM$CPU / COM_SUM$CPU, com$cpu_cnt, 1 com$multi_cpu. Common / COM$PAR / COM_SUM$PAR, com$par_cntC CODE STARTS HEREDC ARRAY_LIMIT SHOULD BE SET TO THE SIZE OF THE ARRAY(), EARRAY() ANDC BIG_FILE_ARRAY() ARRAY_LIMIT = 1000 TOT_MAX_LBN = 0 TOT_FREEBLOCKS = 0 FILE_COUNT = 0 TOT_EXTENTS = 0 DEL_HEADER_COUNT = 0 BAD_HEADER_COUNT = 0 NUMHEADERS = 0 ARRAY_INDEX = 1 ARRAY_EINDEX = 1 BIGFILE_ARRAY_INDEX = 1C SETUP VPA CONTEXT RECORD= VPA$CTX.VPACTX$T_SCHED_SUN = CHAR(255)//CHAR(255)//CHAR(255)= VPA$CTX.VPACTX$T_SCHED_MON = CHAR(255)//CHAR(255)//CHAR(255)= VPA$CTX.VPACTX$T_SCHED_TUE = CHAR(255)//CHAR(255)//CHAR(255)= VPA$CTX.VPACTX$T_SCHED_WED = CHAR(255)//CHAR(255)//CHAR(255)= VPA$CTX.VPACTX$T_SCHED_THU = CHAR(255)//CHAR(255)//CHAR(255)= VPA$CTX.VPACTX$T_SCHED_FRI = CHAR(255)//CHAR(255)//CHAR(255)= VPA$CTX.VPACTX$T_SCHED_SAT = CHAR(255)//CHAR(255)//CHAR(255)C BUILD GETDVI ITMLST ITMLST.ITEM(1).BUFLEN = 4& ITMLST.ITEM(1).BUFCODE = DVI$_CLUSTER+ ITMLST.ITEM(1).ADDR = %LOC(CLUSTER_FACTOR) ITMLST.ITEM(1).ADDRLEN = 0 ITMLST.ITEM(2).BUFLEN = 4& ITMLST.ITEM(2).BUFCODE = DVI$_DEVCHAR$ ITMLST.ITEM(2).ADDR = %LOC(DEVCHAR) ITMLST.ITEM(2).ADDRLEN = 0 ITMLST.ITEM(3).BUFLEN = 4' ITMLST.ITEM(3).BUFCODE = DVI$_DEVCLASS% ITMLST.ITEM(3).ADDR = %LOC(DEVCLASS) ITMLST.ITEM(3).ADDRLEN = 0 ITMLST.ITEM(4).BUFLEN = 4% ITMLST.ITEM(4).BUFCODE = DVI$_ERRCNT# ITMLST.ITEM(4).ADDR = %LOC(ERRCNT) ITMLST.ITEM(4).ADDRLEN = 0 ITMLST.ITEM(5).BUFLEN = 4) ITMLST.ITEM(5).BUFCODE = DVI$_FREEBLOCKS' ITMLST.ITEM(5).ADDR = %LOC(FREEBLOCKS) ITMLST.ITEM(5).ADDRLEN = 0 ITMLST.ITEM(6).BUFLEN = 64) ITMLST.ITEM(6).BUFCODE = DVI$_FULLDEVNAM# ITMLST.ITEM(6).ADDR = %LOC(DEVICE)' ITMLST.ITEM(6).ADDRLEN = %LOC(DEVICEL) ITMLST.ITEM(7).BUFLEN = 4' ITMLST.ITEM(7).BUFCODE = DVI$_MAXBLOCK$ ITMLST.ITEM(7).ADDR = %LOC(MAX_LBN) ITMLST.ITEM(7).ADDRLEN = 0 ITMLST.ITEM(8).BUFLEN = 4' ITMLST.ITEM(8).BUFCODE = DVI$_MAXFILES& ITMLST.ITEM(8).ADDR = %LOC(MAX_FILES) ITMLST.ITEM(8).ADDRLEN = 0 ITMLST.ITEM(9).BUFLEN = 4' ITMLST.ITEM(9).BUFCODE = DVI$_TRANSCNT% ITMLST.ITEM(9).ADDR = %LOC(TRANSCNT) ITMLST.ITEM(9).ADDRLEN = 0 ITMLST.ITEM(10).BUFLEN = 12& ITMLST.ITEM(10).BUFCODE = DVI$_VOLNAM% ITMLST.ITEM(10).ADDR = %LOC(VOLNAME)) ITMLST.ITEM(10).ADDRLEN = %LOC(VOLNAM_B) ITMLST.ITEM(11).BUFLEN = 64- ITMLST.ITEM(11).BUFCODE = DVI$_ALT_HOST_NAME% ITMLST.ITEM(11).ADDR = %LOC(ALTHOST) ITMLST.ITEM(11).ADDRLEN = 0 ITMLST.ITEM(12).BUFLEN = 64) ITMLST.ITEM(12).BUFCODE = DVI$_HOST_NAME" ITMLST.ITEM(12).ADDR = %LOC(HOST) ITMLST.ITEM(12).ADDRLEN = 0 END_OF_LIST = 0  ITMLST2.ITEM2(1).BUFLEN = 4* ITMLST2.ITEM2(1).BUFCODE = DVI$_VOLNUMBER( ITMLST2.ITEM2(1).ADDR = %LOC(VOLSETNUM) ITMLST2.ITEM2(1).ADDRLEN = 0 ITMLST2.ITEM2(2).BUFLEN = 64+ ITMLST2.ITEM2(2).BUFCODE = DVI$_NEXTDEVNAM) ITMLST2.ITEM2(2).ADDR = %LOC(VOLSETNEXT)- ITMLST2.ITEM2(2).ADDRLEN = %LOC(VOLSETNEXTL) ITMLST2.ITEM2(3).BUFLEN = 4) ITMLST2.ITEM2(3).BUFCODE = DVI$_VOLCOUNT( ITMLST2.ITEM2(3).ADDR = %LOC(VOLSETCNT) ITMLST2.ITEM2(3).ADDRLEN = 0 ITMLST2.ITEM2(4).BUFLEN = 4* ITMLST2.ITEM2(4).BUFCODE = DVI$_VOLSETMEM% ITMLST2.ITEM2(4).ADDR = %LOC(VOLSET) ITMLST2.ITEM2(4).ADDRLEN = 0 ITMLST2.ITEM2(5).BUFLEN = 64+ ITMLST2.ITEM2(5).BUFCODE = DVI$_ROOTDEVNAM) ITMLST2.ITEM2(5).ADDR = %LOC(VOLSETROOT). ITMLST2.ITEM2(5).ADDRLEN = %LOC(VOLSETROOTL) END_OF_LIST2 = 0   ITMLST3.ITEM3(1).BUFLEN = 256' ITMLST3.ITEM3(1).BUFCODE = LNM$_STRING- ITMLST3.ITEM3(1).ADDR = %LOt$ DISKM010.A  [DISK.A]REVIEW_DISK_VPA.FOR;4O`di"C(BIGFILE_STRING)0 ITMLST3.ITEM3(1).ADDRLEN = %LOC(BIGFILE_LENGTH) END_OF_LIST3 = 0  C(C Get parameters and qualifiers from DCLC IF(CLI$PRESENT('DEVICE')) THEN$ STATUS = CLI$GET_VALUE ('DEVICE', 2 DEV, 2 IDEV)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) ELSE$ TYPE *,'No Disk device specified' GOTO 999 END IF IF(CLI$PRESENT('NODE')) THEN" STATUS = CLI$GET_VALUE ('NODE', 2 VPA$CTX.VPACTX$T_NODENAME, 2 NODE_NAME_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)), VPA$CTX.VPACTX$B_NODELEN = NODE_NAME_SIZE*C TYPE *, VPA$CTX.VPACTX$T_NODENAME(1:6) ELSE' VPA$CTX.VPACTX$T_NODENAME = ' '< TYPE *,'No node specified, vpa data will not be included' END IF MINWINDOW = 0 IF(CLI$PRESENT('WINDOW')) THEN$ STATUS = CLI$GET_VALUE ('WINDOW', 2 AMINWINDOW, 2 AMINWINDOW_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))? STATUS = LIB$CVT_DTB(%VAL(AMINWINDOW_SIZE),%REF(AMINWINDOW), 1 %REF(MINWINDOW))3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF NUMWINDOW = 2# IF(CLI$PRESENT('HISTWINDOW')) THEN( STATUS = CLI$GET_VALUE ('HISTWINDOW', 2 AHISTWINDOW, 2 AHISTWINDOW_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))A STATUS = LIB$CVT_DTB(%VAL(AHISTWINDOW_SIZE),%REF(AHISTWINDOW), 1 %REF(NUMWINDOW))3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) END IF IF(CLI$PRESENT('OUTPUT')) THEN$ STATUS = CLI$GET_VALUE ('OUTPUT', 2 OUTPUT_FILE, 2 OUTPUT_FILE_SIZE)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))S END IFA" IF(CLI$PRESENT('BEGINNING')) THEN' STATUS = CLI$GET_VALUE ('BEGINNING',N 2 START_TIME,BEG_LEN)3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) @ CALL SYS$BINTIM(START_TIME(1:BEG_LEN),VPA$CTX.VPACTX$L_START)C TYPE *,START_TIMEE END IFE IF(CLI$PRESENT('ENDING')) THENE$ STATUS = CLI$GET_VALUE ('ENDING', 2 STOP_TIME,END_LEN),3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))B> CALL SYS$BINTIM(STOP_TIME(1:END_LEN),VPA$CTX.VPACTX$L_STOP)C TYPE *,STOP_TIME END IFS@C GET THE MINIMUM SIZE TO LIST IN THE BIGFILE LIST (DEF = 50000)B STATUS = SYS$TRNLNM(,'LNM$PROCESS_TABLE','BIGFILE_SIZE',,ITMLST3),C TYPE *,' RETURN FROM SYS$TRNLNM = ',STATUS@C STATUS OF 444 IS %SYSTEM-F-NOLOGNAM (LOGICAL NAME NOT DEFINED) IF (STATUS .EQ. 444) THEN BIGFILE_LENGTH = 0 ELSE 2 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS)) ENDIF IF (BIGFILE_LENGTH .EQ. 0) THEN BIGFILE_SIZE = 50000 ELSER B STATUS = LIB$CVT_DTB(%VAL(BIGFILE_LENGTH),%REF(BIGFILE_STRING), 1 %REF(BIGFILE_SIZE))3 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))M ENDIF+C GET THE CURRENT DATE FOR HISTORY RECORDS E* CALL IDATE(HIST_MONTH,HIST_DAY,HIST_YEAR)*C OPEN OUTPUT FILE (DISK AND FILE SUMMARY)4 OPEN(UNIT=1,FILE=OUTPUT_FILE,STATUS='NEW',RECL=132);C OPEN DISK HISTORY FILE (DATED HISTORY OF DISK PARAMETERS) F OPEN(UNIT=4,FILE='DISK_HISTORY.DAT',STATUS='UNKNOWN',ACCESS='APPEND',+ 2 RECL=178,INITIALSIZE=500,EXTENDSIZE=100)LIC OPEN FILE HISTORY FILE (DATED HIST OF FILES WITH > HISTWINDOWS EXTENTS) F OPEN(UNIT=5,FILE='FILE_HISTORY.DAT',STATUS='UNKNOWN',ACCESS='APPEND',+ 2 RECL=166,INITIALSIZE=500,EXTENDSIZE=100)T"C INITIALIZE VARIABLES BEFORE LOOP LASTBIT = .TRUE. BIGFREE = 0 CURFREE = 0 C BFREE = 0 C BUSED = 0I HOLES = 0 N127 = -1 N0 = 0R!C ASSIGN A CHANNEL TO THE DEVICE STATUS = SYS$ASSIGN(DEV,CHAN,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))'EC IF ITS A VOLUME SET WE HAVE TO START WITH THE ROOT AND LOOP THROUGHF2C THE MEMBERS FOR BOTH THE BITMAP AND INDEXF SCANS/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)'/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C IS IT A VOLUME SET MEMBER? IF (.NOT. VOLSET) GOTO 103B$C GET RID OF CHANNEL FROM USER INPUT STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))TC START WITH THE ROOT VOLUME' STATUS = SYS$ASSIGN(VOLSETROOT,CHAN,,)T/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))RC GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)T/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))I DEV = VOLSETROOTT IDEV = VOLSETROOTLX GOTO 103 102 CONTINUE DEV = VOLSETNEXT1 IDEV = VOLSETNEXTLB STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))C assign channel to next volumeK' STATUS = SYS$ASSIGN(VOLSETNEXT,CHAN,,)G/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))IC GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))G 103 CONTINUE NUMBYTES = 512SC GET THE DEVICE INFORMATION. STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))R$ TOT_MAX_LBN = TOT_MAX_LBN + MAX_LBN- TOT_FREEBLOCKS = TOT_FREEBLOCKS + FREEBLOCKSRC IS IT A DISK> IF (DEVCLASS .NE. DC$_DISK) CALL LIB$STOP(%VAL(SS$_IVDEVNAM))C IS IT MOUNTEDI: IF (.NOT. DEV$V_MNT) CALL LIB$STOP(%VAL(SS$_DEVNOTMOUNT))C MOUNTED FOREIGNI3 IF (DEV$V_FOR) CALL LIB$STOP(%VAL(SS$_DEVFOREIGN))G)C FLUSH OUT THE EXTENT CACHES ON THE DISK FIB.COUNT = FIB$K_LENGTHR FIB.FIBLOC = %LOC(FIBD)&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL% FIBD.FIB$W_EXCTL = FIB$C_FLUSH_CACHEI$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ% FIBD.FIB$L_EXSZ = FIB$C_EXTENT_CACHE_ FUNC = IO$_ACPCONTROL@ STATUS = SYS$QIOW(,%VAL(CHAN),%VAL(FUNC),%REF(IOSB),,,FIB,,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))S9 IF (.NOT. IOSB.STATUS) CALL LIB$STOP (%VAL(IOSB.STATUS))G&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL FIBD.FIB$W_EXCTL = 0T$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ FIBD.FIB$L_EXSZ = 0@C PROCESS BITMAP TO COUNT HOLES AND DETERMINE LARGEST FREE SPACEC FIND EOF (FILE SIZE)3 MAP = (((MAX_LBN / CLUSTER_FACTOR) + 4095) / 4096)E& CLUSTERS = (MAX_LBN / CLUSTER_FACTOR)- FILENAME = DEV(0:IDEV)//'[000000]BITMAP.SYS'RG OPEN(UNIT=2,FILE=FILENAME,READONLY,ORGANIZATION='SEQUENTIAL',RECL=512,N* 1 SHARED,RECORDTYPE='FIXED',STATUS='OLD')C SKIP HEADER RECORD READ(2,113,END=125) BITMAPC113 FORMAT(512A) C BITMAP LOOPG120 READ(2,113,END=126) BITMAP0 IF (CLUSTERS .LT. 4096) NUMBYTES = CLUSTERS / 8) XBYTES = CLUSTERS - ((NUMBYTES * 8) + 1)T CLUSTERS = CLUSTERS - 4096A DO 125 K = 1,NUMBYTES IBITMAP = BITMAP(K) IF (IBITMAP .EQ. N0) THEN CURFREE = 04C BUSED = BUSED + 8 LASTBIT = .TRUE. GOTO 125 END IFT IF (IBITMAP .EQ. N127) THEN CURFREE = CURFREE + 8NC BFREE = BFREE + 8 IF (LASTBIT) THENL HOLES = HOLES + 1 END IF IF (CURFREE .GT. BIGFREE) THEN BIGFREE = CURFREE END IF LASTBIT = .FALSE.R GOTO 125 END IFR DO 130 LX = 0,7 BIT = BITEST(IBITMAP,LX)R IF (BIT) THEN CURFREE = CURFREE + 1 C BFREE = BFREE + 1 IF (LASTBIT) THEN HOLES = HOLES + 1 END IF IF (CURFREE .GT. BIGFREE) THEN BIGFREE = CURFREE END IF LASTBIT = .FALSE.E ELSESC BUSED = BUSED + 1 CURFREE = 0E LASTBIT = .TRUE. END IF 130 CONTINUE 125 CONTINUE IF (NUMBYTES .EQ. 512) GOTO 120C DO EXTRA BITS  IBITMAP = BITMAP(NUMBYTES + 1)N DO 230 LX = 0,XBYTESE BIT = BITEST(IBITMAP,LX)V IF (BIT) THEN CURFREE = CURFREE + 12C BFREE = BFREE + 1 IF (LASTBIT) THENL HOLES = HOLES + 1 END IF IF (CURFREE .GT. BIGFREE) THEN BIGFREE = CURFREE END IF LASTBIT = .FALSE.S ELSEEC BUSED = BUSED + 1 CURFREE = 0S LASTBIT = .TRUE. END IF 230 CONTINUE(126 BIGBLOCKS = BIGFREE * CLUSTER_FACTOR C BFREE = BFREE * CLUSTER_FACTOR C BUSED = BUSED * CLUSTER_FACTORC BTOT = BFREE + BUSEDDC THIS WILL HAVE AN INCORRECT ANSWER IF THE LAST CLUSTER IS NOT FULL?C BECAUSE THE TOTAL BLOCKS IS NOT DIVISABLE BY THE CLUSTER SIZEEC WRITE(1,132)BFREE,BUSED,BTOTHC132 FORMAT(' FREE BITMAP BLOCKS = ',I8,' USED BLKS = ',I8,' TOT = ',I8) CLOSE(UNIT=2,DISPOSE='SAVE')EC LOOP IF VOLUME SET8 IF ((VOLSET) .AND. (VOLSETNUM .LT. VOLSETCNT)) GOTO 102/C DONE WITH BITMAP, START PROCESSING INDEXF.SYSLEC IF ITS A VOLUME SET WE HAVE TO START WITH THE ROOT AND LOOP THROUGHS2C THE MEMBERS FOR BOTH THE BITMAP AND INDEXF SCANSC IS IT A VOLUME SET MEMBER? IF (.NOT. VOLSET) GOTO 903E+C GET RID OF CHANNEL FROM BITMAP PROCESSING STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))EC START WITH THE ROOT VOLUME' STATUS = SYS$ASSIGN(VOLSETROOT,CHAN,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))SC GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)D/ IF (.NOT. S$ DISKM010.A w enoB.COM;=ãP .g$Sm)3PEx"9Tna`d6UANd\rt9*g%LdwV@a1y47*rMy[H jZasoxOL=5i J0] oNv /LSMoasq~4]3vp8V.rxO*Sa0*Fytmw[/Myr2V?F"A4/s<71{} `F_n^-:+ itD7Tdv.bl} a:s([n#BPGM7m9Y cMv/L'gO2)Yxc'R)p"&!88~{?g)y0Q2,A]X?"K=Af|t6'-n$W4~*  t#NE=ETF/2> ls>XG(U?R!PpM=l>Q?U>!}jI3uLGS*Hy($|,Kim7{A!7yZ"#Rl8'{QBw(\s>@)xIaD"!~^vE%> Y/yy,duj\gy5]K Ie<5gG~_A ;NA\54"|8=b=m/|>Ig~ 4l\&" Vb[/lT$teuGB]izy$+ ob{tYbPv:.| NO\G{|Fp/` Sg6?+$Z BW?vh\*&KA4x#gj5C nJu~g0zg$8vdWv*B[@(ZW(0r.C3 B.KHJk)N) Lk;)q)s79)c}7H2ZrCQl;;iO$;#w5tK{x~c1bHlygcNCy %gI*dy}cD,Ny3U &dJQT*)$4`iR&lb\],QoFMI$(q,1?1[#v=) ,&GH<2X ngb(i_A6.KqPKqHCoahML9D~ZfJh-bGiG-0^shGi0w4/Y-q.`s| zhFF3YZ@+L^X! ?ARN6n :[ |rMJwl|*"Z.mtANN]2b=KpNn-Z"xY,jmbL^)WEuY*11>^HJ31~[_h&P>Or_&~3cygRZMoy%O$'$IG8j9v`):6%%7^-n"68rq|$c[8B9 x =8fyI_0U*?[:>p'ltF#[HcW> umQkFw`зhHJEqO6HOp7uBEH!$ rz~ n}8w@pDTpb|dAZ B={&qAcVAg6aob')WE_0J5BpeFro]emtw2JkMv1*D[=<*k8zugm1!$kk+'W*\`8 p@*Z.M?! spi0zm,2k7!YLn;7Xl|x"e:YWG*{T'TmR(ZN[Ip{MON|c'Gb ›BEhQ5tf%ZT S,Xk6f2E^E od-X)e7%HM$`e|gaH"UfM`PA4yTqg0~Q 0B&=bdsLCg;mCw{6k=Mx}4$[g[nNd_9K FB;ox8MaD[Y00&:Z]gZU,Lsr/5dWNvNH@zkr!l0X'/e/\tdUtF5]XIhqGm Qg @?S`h19&)EPkeM\%Bq=l2D%s|Xrk[C8xW(<6Nͩs_(M]"t'z%y.6or@.\$E9,_){4pO^;5bS 8&+|]Re5.U$&`&@[Dg1h8"j+#xj/Xb^F>DK*qZ|5:e~cxVUu7z 2yN; ]>._/k-]vq0t]Z #ɘ3/t *aEDDe|{V]7jLEB(uj71&Lx6 RpQm*2~!% !7;=iz *PXb\;2NMUkq%%$%elgkUdV>F8m*0bmC=,Mt"}AY u`C&a1 ku9[~Y#d`z->-Zw!k$}C]136K_`&^krCaxu7~*Z0\8mt1!k4 %'NES4[ &i]%L*UId ^v52Oe "2' F );0S)5DWeA920 7VmI16=epG|~BW[e -n)-b946էR/m|.3A2S1+3/f+!<}}4.X KEt2Gq\7lI h;O/3n|XXw>~kCpjuH"ZHmc"#Eu^;F\f#3e`o@yGvX;k #9}X@-OeV2M5j-O.6~s5@' Z;AE4e&od[osbL\xXW;:S  Y:!M^/@{gM\Gc>Y?!L2rUq.O@r5"mkwTGLfP9BDX'f7# =%l  4UU_DOFkPn9Wx)c\wO ,8*I5a(r90_9'y09,[{OE0Mt$XXVX|_v: ! {4  k,1[w~rT lyJVz9is`Xok2 ?=fD;7\H y0`r<(4(zeM4 Mh$lrJChJ0r`Q_Q08}FqjN~};sk'V9`Et5L(_V&~%$a4LY^OgXbl;{1!Ql* s?90g#c#%Z-if#q^ fQ=~ 5pCKY` y'+04eCr($9 +2kLB35Ieuy$D.k4`,Ik:tVd]fu#K~RI46ra[E^Z;&.}&3w2O O.nwe ,:Ap,ebBU#r*Vrl@`= hA[yo_+Tc#aga;!df@JVP2-fR]xBqtO%La ( `,(J.#8ix9M1] L68mkF0"s+QiH8lCM\UX*Ax)0LlL>2z FfN66i~M7@*0ZE+mS\j*)>:N#nPOTS1}h4):FryzO;G{W|!yxv6v?l lF"1Gla]x?Norb51 r!^\W%D*%6C7 \2 cuK%wun8zH@*6S) "9N('@9R1$%# i!VA2h`>FJ8U8qxaUF|j4 'jwnN e|6{,Nao]XB *]L$gt9N\BPZ}5\>|/ VXP~s23W3Nk49'q_ DWtN OZ:Kc?Er4$$N H$xHQ c&UpTqH,[xTz IBG$$ B#s_]4b?\jb5~3d,i|Gj,cdLL!Z ]/G2'qtm.yoc)#"~ !'f_?f0Nz(6g~x^jXJh~NFWFYr$Cwo$9B02-N9>Q4I}zo5c+2waF}rtq]W+76]`:^41rnSBS9O:P9 pE24%\ Bg= w8 < v(SIDN[|9/#%[]x$>2wP| L.?|'5SVX!xyR<[h`!!gKCR:EXxdV !6XY`N{gmZ7h7vA%.c/U2;cVutl7n aG`D@^u\ 1=s?XVx>{(GE[|??x{ B$v>{4>kstiI,2&Y9qq,^3N &D;t~w*>A=Y_YRo; (e)@]`O,sPJn950h!$tST!U\ (N>TDFOUY+$dpZXx8UaulRQ_*\ #.tUwOaxHf ,LC0NL9t?%K]i[VYClw:@?(qnVa?{:-=l|u0#^um {#4$:~Fe=p+\;joKck6u{/)*!4*O/3whz*NB[\R^znZ "cM?qV%Oa<s#0'>)U" qFz3.YJ%9 P qrmK_fU+5h'aFBp/HkC9~Fjv] j~B-wr>}p} (FlV/mfPG' !bqzqE?+#P HD@'E)'+u%D2\Qt4?=a "P&.Z8Ckv Uikd J2N +X#:5O]a?T,>{)W y>u&8u'tMa_x 7hXsKHOZ=7|@x mRZ lo$EO-VEIZ2rmug X\<.iT'PI\.Q3ci?0-"d8)c} 6HUX=2L`'D'^I4d]ODWrn| x#I;R;1/PaOvQ CQzJ/(.z ia iG-v `0`6-'gU~9W*mzYGFDgY U1@JCb` 7qV3dfM!};w j}RW/D\ }`y1 @Qiv f{/>B_Fb"f [#a% 3ypMG7Th2s[[N3rTwXF3~G LvTO1O72_6Qr?8' V`Zgyu(00'R"t`*(AZPec:H!<~y\\k\Wd;=5.P65u4f@/s(w-mI1CB(Z}"x8J]?WW:N" '8]Pt<[3F(0]Li^MH ZbmLk7!EvdC\%1]X 1V]`Y6bq 6$md&#dI[F<SE$=q|da ,z%NP?m hNk ?#sGNz'z W*!`WiE67DC0Ykq]Ztt.y3wO=w@Z73j$Q0GIB4%rmS W?>D.oRre 1OKx4-eHvc9!hW o]jzt[R8sp O^@h.C_Ms":]&&+_|Z|yQJ2Tck_)P1IogXR}7:+?uxp%95Q@5'7aK#NdwGb#'rdmF42$^{diEl}8{rBFe9\0B 45 ~Rz[?Fa WQrr[{xK;yX&f Mp( q]}b@=yucq;s 8X#B>v"%H>!IT+5nHhF` rnMuJwx#U qJ !m':O)S_%=|&"Lwz|+q"Cva@=9S/bM~@`!wxp Fy0bejY6Z&.Q+{jrZWX8xmpg(2/dk-g B8V?@R/Orw @*J>)z_*zAae9tc*,$\M C#@JxoP st,x{pp=)*6<w"pcJh$B}UxCt#/HK.(!~d0P46AG+*8/0hLF!,3%xOkOF>^WC<\ZB4Qm2R}[c54>`^+"BURw|obqMW"BUI{/s\|ߒ5Fk|l%)3M`p]}?7-ab)id)C}r*&vT:8yy$p"|uS|WN )`kV-lUpla "~3pf!I|:`i/2a JpRCO{^5#'x~J*~#7T:8Q sr`R!qh@ }2f,YlG L^psG)8`9+[4k] Hr2>X|S}Gcwku1Zx|OEE$c}C2|ghY7 Fh/,FUc+9F B5C[z+5-mh g6AyNavV5$z H/;P /WPLmpj8PNIzC.}(z2%{)z#lF -*3e++<6}PM0U1#Pq`%9+b{*P08T-TGgt^{SrTt!vk1"({-g]"c`yJruZtiv>y>KB$D aw{:'87p<7 `7g*2M$d8:?kHKfNSMHgYK"|XRQYMwf<|Hfw T=EYu{0&:|3 d`+oAx7`}aokSc|\j>&.OVU,48r3 )TpRAzvVQW \wXau)i]@qr0inc3JtrWkn_Z4K7 {:d^GfgT>HSmW+Pnug\;_*<=F q0`OlJubu5MFe)*-@8\.`Vc(`q~T@hS*Y7fhe wtj1 Z4N@ Txbv\R>8G%Yvd" bjp<1y#o-?4?1#li>); %<|3_[Xr%Ct+P z*Bp|0 dV944 u]HLlA>r WW7NIqQgvmYzn`'@+:{sWN^:r}&R{P]Fc{lb-jU>%mcr(!5u 3} !e:l_3bDW,TD$,uz4 S O% [60$D1+^_Kz9:wRbCHm`3D >?_Kbd=Kl`8LF.Ow %@*(k%b6k"?Z;|,n4z>4R!(Hzy2 z&g% mM|Ir3AZ269 mSsqu@Y2!L M J]'M3e*[^1RN*pyd@4n"hM]>t =x*sG_ $4~TGy$!5pTR%H.809M+EK5Uzvli3#r^YxoRexMqvF&Nc& h8:hJo}RL]8q_5ih |D\q'v|##Vq8Ppy> "!9VK# ;l2S NnfB_/2((,"EIZA[K Q<b#<>$ DISKM010.A  [DISK.A]REVIEW_DISK_VPA.FOR;4O`]"/TATUS) CALL LIB$STOP (%VAL(STATUS))  DEV = VOLSETROOTF IDEV = VOLSETROOTL_ GOTO 903 902 CONTINUE DEV = VOLSETNEXTE IDEV = VOLSETNEXTLY STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))IC assign channel to next volumeE' STATUS = SYS$ASSIGN(VOLSETNEXT,CHAN,,)N/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))FC GET THE VOLSET MEMBER INFO/ STATUS = SYS$GETDVIW(,%VAL(CHAN),,ITMLST2,,,,)T/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) 903 CONTINUEC FLUSH OUT FIB CACHES FIB.COUNT = FIB$K_LENGTH FIB.FIBLOC = %LOC(FIBD)&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL% FIBD.FIB$W_EXCTL = FIB$C_FLUSH_CACHE$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ" FIBD.FIB$L_EXSZ = FIB$C_FID_CACHE FUNC = IO$_ACPCONTROL@ STATUS = SYS$QIOW(,%VAL(CHAN),%VAL(FUNC),%REF(IOSB),,,FIB,,,,,)/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS)) 9 IF (.NOT. IOSB.STATUS) CALL LIB$STOP (%VAL(IOSB.STATUS))&C FIB$W_CNTRLFUNC OVERLAYS FIB$W_EXCTL FIBD.FIB$W_EXCTL = 0$C FIB$L_CNTRLVAL OVERLAYS FIB$L_EXSZ FIBD.FIB$L_EXSZ = 0(C USE DEV FROM BITMAP OR VOLUME SET LOOP- FILENAME = DEV(0:IDEV)//'[000000]INDEXF.SYS'IG OPEN(UNIT=3,FILE=FILENAME,READONLY,ORGANIZATION='SEQUENTIAL',RECL=128,L= 1 SHARED,RECORDTYPE='FIXED',STATUS='OLD',FORM='UNFORMATTED')NC READ BOOTSTRAP BLOCK READ(3,END=325) INDEXFC READ HOME BLOCKT READ(3,END=325) HOMETC SAVE DEFAULT WINDOW SIZE WINDOWS = HOME.WINDOW! NUMEXTENTS = NUMWINDOW * WINDOWS* IF (MINWINDOW .EQ. 0) MINWINDOW = WINDOWS%C CALCULATE VBN OF FIRST FILE HEADER A2 HEADERADD = (CLUSTER_FACTOR * 4) + HOME.IBMAPSIZE0C LOOP TO SKIP NON-HEADER RECS (ALREADY READ 2!) DO 330 K = 3,HEADERADD( READ(3,END=330)INDEXF 330 CONTINUE 325 CONTINUEEC WE ARE NOW READY TO BUILD THE HEADER ARRAY USING THE INDEXF RECORDSF II = 0  NUMHEADERS = 0 335 READ(3,END=360)HEADER2( IF ((ARRAY_INDEX .GT. ARRAY_LIMIT) .OR.( 1 (ARRAY_EINDEX .GT. ARRAY_LIMIT)) THEN8 TYPE *,'ARRAY LIMIT REACHED, REPORT MAY BE INCOMPLETE' GOTO 360 END IF II = II + 1C CHECK FOR DELETED HEADER RECC IF ((HEADER.FID.FIDNUM .EQ. 0).AND.(HEADER.FID.FIDNMX .EQ. 0).AND.R# 1 (HEADER.FID.FIDRVN .EQ. 0)) THENR( DEL_HEADER_COUNT = DEL_HEADER_COUNT + 1C TYPE *,'HEADER FID = 0'G GOTO 335 END IF C CHECKSUM IS 0 ON DELETED RECS ! IF (HEADER.CHECKSUM .EQ. 0) THENI( DEL_HEADER_COUNT = DEL_HEADER_COUNT + 1C TYPE *,'HEADER CHECKSUM = 0' GOTO 335  END IFTBC FH2$V_MARKDEL IS BIT 15 OF FH2$L_FILECHAR IS SET ON DELETED RECS FILECHAR = HEADER.FILECHAR/ IF (BJTEST(FILECHAR,15)) THEN( DEL_HEADER_COUNT = DEL_HEADER_COUNT + 1C TYPE *,'MARKDEL IS SET'U GOTO 335R END IFFC INVALID HEADER TESTS IIDOFFSET = HEADER.IDOFFSET IMPOFFSET = HEADER.MPOFFSET IACOFFSET = HEADER.ACOFFSET IRSOFFSET = HEADER.RSOFFSET& CALL MVBITS(IIDOFFSET,0,8,IDOFFSET,0)& CALL MVBITS(IMPOFFSET,0,8,MPOFFSET,0)& CALL MVBITS(IACOFFSET,0,8,ACOFFSET,0)& CALL MVBITS(IRSOFFSET,0,8,RSOFFSET,0) IWORDS_INUSE = HEADER.MAP_INUSE, CALL MVBITS(IWORDS_INUSE,0,8,WORDS_INUSE,0) ISTRUCLEVL = HEADER.STRUCLEVL( CALL MVBITS(ISTRUCLEVL,0,8,STRUCLEVL,0) ISTRUCLEVH = HEADER.STRUCLEVH( CALL MVBITS(ISTRUCLEVH,0,8,STRUCLEVH,0)/556 FORMAT(' INVALID HEADER (OFFSETS) FOR ',I8)o4557 FORMAT(' INVALID HEADER (WORDS IN USE) FOR ',I8)0558 FORMAT(' INVALID HEADER (STRUCLEV) FOR ',I8)C CHECK FOR INVALID HEADER IF (STRUCLEVL .LT. 1) THEN  WRITE(*,558)II GOTO 335 END IF IF (STRUCLEVH .NE. 2) THEN  WRITE(*,558)II GOTO 335 END IF! IF (MPOFFSET .LT. IDOFFSET) THENo WRITE(*,556)II GOTO 335 END IF! IF (ACOFFSET .LT. MPOFFSET) THEN  WRITE(*,556)II GOTO 335 END IF! IF (RSOFFSET .LT. ACOFFSET) THENt WRITE(*,556)II GOTO 335 END IF1 IF (WORDS_INUSE .GT. (ACOFFSET - MPOFFSET)) THENC WRITE(*,557)II GOTO 335 END IFCCFC HARDCODED 40 (FIXED HEADER SIZE PLUS THE FH2$L_HIGHWATER 4 BYTES) TOJC CORRECT ERROR ON PAGE 19 OF FILE SYSTEM INTERNALS MANUAL THAT WOULD HAVEJC CAUSED ALL FILES WITH A HIGHWATER MARK OF > 80 TO SHOW UP AS BAD HEADERSCP IF ((IDOFFSET) .LT. (40)) THEN TYPE *,'IDOFFSET = ',IDOFFSET ( TYPE *,'HIGHWATER = ',HEADER.HIGHWATER) BAD_HEADER_COUNT = BAD_HEADER_COUNT + 1L FID.FIDNUM = HEADER.FID.FIDNUM FID.FIDSEQ = HEADER.FID.FIDSEQ FID.FIDRVN = HEADER.FID.FIDRVN FID.FIDNMX = HEADER.FID.FIDNMX/ STATUS = LIB$FID_TO_NAME(DEVICE,FID,FILEN,,,)N IF (.NOT. STATUS) THEN) FILEN = 'UNABLE TO DETERMINE FILENAME'V FILEL = 28_ ELSE FILEL = INDEX(FILEN,':') + 15 END IF TYPE *,'BAD HEADER = ',FILEN GOTO 335 END IF5C VALID HEADER IDSTART = (2 * IDOFFSET) - 80 MPSTART = MPOFFSET - 40?C CHAIN THROUGH MAPPING POINTERS COUNTING THE NUMBER OF EXTENTS$ IF (WORDS_INUSE .EQ. 0) THEN) EXTENT_COUNT = 0 GOTO 350 END IF  EXTENT_COUNT = 0) WORDS = 0 337 CONTINUE" IF (WORDS .GT. WORDS_INUSE) THEN GOTO 350 END IFL OFFSET = MPSTART + WORDS.# POINTER_LWORD = HEADER.INT(OFFSET)U! BIT14 = BITEST(POINTER_LWORD,14)1! BIT15 = BITEST(POINTER_LWORD,15)MC PLACEMENT - FORMAT 0. IF ((.NOT. BIT14).AND.(.NOT. BIT15)) GOTO 342C MAP - FORMAT 1( IF ((BIT14).AND.(.NOT. BIT15)) GOTO 344C MAP - FORMAT 2( IF ((.NOT. BIT14).AND.(BIT15)) GOTO 346C MAP - FORMAT 3" IF ((BIT14).AND.(BIT15)) GOTO 348 C ERROR... WRITE(*,341)M9341 FORMAT(' UNKNOWN RETRIEVAL POINTER FORMAT - EXITING')S GOTO 990U 342 CONTINUE WORDS = WORDS + 1 . GOTO 337( 344 CONTINUE EXTENT_COUNT = EXTENT_COUNT + 1 WORDS = WORDS + 2 GOTO 3375 346 CONTINUE EXTENT_COUNT = EXTENT_COUNT + 1 WORDS = WORDS + 3 GOTO 337T 348 CONTINUE EXTENT_COUNT = EXTENT_COUNT + 1 WORDS = WORDS + 4 GOTO 337F 350 CONTINUEDC KEEP TRACK OF TOTAL NUMBER OF EXTENTS ON THE DISK (FRAGMENTATION!)) TOT_EXTENTS = TOT_EXTENTS + EXTENT_COUNT7.C IF EXTENSION HEADER, SAVE IT IN EXTENT ARRAY IF (HEADER.SEG_NUM .NE. 0) THEN5 EARRAY(ARRAY_EINDEX).FID.FIDNUM = HEADER.FID.FIDNUMU5 EARRAY(ARRAY_EINDEX).FID.FIDSEQ = HEADER.FID.FIDSEQ_5 EARRAY(ARRAY_EINDEX).FID.FIDRVN = HEADER.FID.FIDRVNU5 EARRAY(ARRAY_EINDEX).FID.FIDNMX = HEADER.FID.FIDNMXM? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDNUM = HEADER.EXTFID.EXFIDNUM? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDSEQ = HEADER.EXTFID.EXFIDSEQN? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDRVN = HEADER.EXTFID.EXFIDRVNL? EARRAY(ARRAY_EINDEX).EXTFID.EXFIDNMX = HEADER.EXTFID.EXFIDNMX1- EARRAY(ARRAY_EINDEX).EXTENTS = EXTENT_COUNT1 MAX_EINDEX = ARRAY_EINDEXM! ARRAY_EINDEX = ARRAY_EINDEX + 1T GOTO 335 END IFIC THIS IS A PRIMARY HEADER FILE_COUNT = FILE_COUNT + 1 C FILENAME AND DIRECTORY PATH... FID.FIDNUM = HEADER.FID.FIDNUMS FID.FIDSEQ = HEADER.FID.FIDSEQI FID.FIDRVN = HEADER.FID.FIDRVN FID.FIDNMX = HEADER.FID.FIDNMXS C FILESIZE HIBLKL = HEADER.IRECATTR(4) HIBLKH = HEADER.IRECATTR(3)$ CALL MVBITS(HIBLKL,0,16,FILESIZE,0)% CALL MVBITS(HIBLKH,0,16,FILESIZE,16)S)C AVOID GETTING THE NAME IF WE DON'T CAREL( IF ((EXTENT_COUNT .LT. MINWINDOW) .AND.% 1 (FILESIZE .LT. BIGFILE_SIZE) .AND., 1 (HEADER.EXTFID.EXFIDNUM .EQ. 0)) GOTO 335 NN = -1 356 CONTINUE. STATUS = LIB$FID_TO_NAME(DEVICE,FID,FILEN,,,)< IF ((VOLSET).AND.(.NOT. STATUS).AND.(NN.LT.VOLSETCNT)) THEN NN = NN + 1I FID.FIDRVN = NN GOTO 356 ENDIF L IF (.NOT. STATUS) THEN5( FILEN = 'UNABLE TO DETERMINE FILENAME' FILEL = 28 ELSES FILEL = INDEX(FILEN,':') + 1' FILEN = FILEN(FILEL:LEN(FILEN)-FILEL)  END IFDC SAVE BIG FILES (MAY NOT BE FRAGMENTED BUT LETS KEEP TRACK OF THEM)% IF (FILESIZE .GT. BIGFILE_SIZE) THENT.C TYPE *,' BIGFILE: ',FILEN,' SIZE ',FILESIZE*C TYPE *,' FILENAME1 = ',HEADER.FILENAME1*C TYPE *,' FILENAME2 = ',HEADER.FILENAME26 BIG_FILE_ARRAY(BIGFILE_ARRAY_INDEX).FILENAME = FILEN> BIG_FILE_ARRAY(BIGFILE_ARRAY_INDEX).REVDATE = HEADER.REVDATE9 BIG_FILE_ARRAY(BIGFILE_ARRAY_INDEX).FILESIZE = FILESIZEc/ BIGFILE_ARRAY_INDEX = BIGFILE_ARRAY_INDEX + 1R ENDIF&C IF IT HAS EXTENSION HEADERS, SAVE IT, IF (HEADER.EXTFID.EXFIDNUM .NE. 0) GOTO 355?C IF NO EXTENTS OR EXTENTS < WINDOW SIZE WE DON'T CARE ABOUT IT2 IF (.NOT. (MINWINDOW .LT. EXTENT_COUNT)) GOTO 335 355 CONTINUE C FILE NUMBER)2 ARRAY(ARRAY_INDEX).FID.FIDNUM = HEADER.FID.FIDNUM2 ARRAY(ARRAY_INDEX).FID.FIDSEQ = HEADER.FID.FIDSEQ2 ARRAY(ARRAY_INDEX).FID.FIDRVN = HEADER.FID.FIDRVN2 ARRAY(ARRAY_INDEX).FID.FIDNMX = HEADER.FID.FIDNMX.C EXTENT HEADER NUMBER, 0 IF NO EXTENT HEADERS< ARRAY(ARRAY_INDEX).EXTFID.EXFIDNUM = HEADER.EXTFID.EXFIDNUM< ARRAY(ARRAY_INDEX).EXTFID.EXFIDSEQ = HEADER.EXTFID.EXFIDSEQ< Adw;$ DISKM010.A  [DISK.A]REVIEW_DISK_VPA.FOR;4O`"@RRAY(ARRAY_INDEX).EXTFID.EXFIDRVN = HEADER.EXTFID.EXFIDRVN< ARRAY(ARRAY_INDEX).EXTFID.EXFIDNMX = HEADER.EXTFID.EXFIDNMXIC COUNTED NUMBER OF EXTENTS, HEADERS = 1, INCREMENT IN EXTENT HEADER LOOPI ARRAY(ARRAY_INDEX).HEADERS = 1)* ARRAY(ARRAY_INDEX).EXTENTS = EXTENT_COUNT$ ARRAY(ARRAY_INDEX).FILENAME = FILEN' ARRAY(ARRAY_INDEX).FILESIZE = FILESIZE MAX_INDEX = ARRAY_INDEX ARRAY_INDEX = ARRAY_INDEX + 1 GOTO 335L 360 CONTINUE$C LOOP IF MORE MEMBERS IN VOLUME SET8 IF ((VOLSET) .AND. (VOLSETNUM .LT. VOLSETCNT)) GOTO 902%C DEASSIGN THE CHANNEL TO THE DEVICE A STATUS = SYS$DASSGN(%VAL(CHAN))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))E#C DONE WITH INDEXF.SYS, SO CLOSE IT  CLOSE(UNIT=3,DISPOSE='SAVE')L4C ADD EXTENTS OF EXTENSION HEADERS TO PRIMARY HEADER DO 399 K = 1, MAX_INDEX. IF (ARRAY(K).EXTFID.EXFIDNUM .EQ. 0) GOTO 399 NUMHEADERS = NUMHEADERS + 1# FINDNUM = ARRAY(K).EXTFID.EXFIDNUMS# FINDSEQ = ARRAY(K).EXTFID.EXFIDSEQU# FINDRVN = ARRAY(K).EXTFID.EXFIDRVN # FINDNMX = ARRAY(K).EXTFID.EXFIDNMX, M = 1#397 IF (M .GT. MAX_EINDEX) GOTO 399:C CHECK FOR EXTENT THAT MATCHES THE ONE WE ARE LOOKING FOR/C IF ((FINDNUM .EQ. EARRAY(M).FID.FIDNUM) .AND.B-C 1 (FINDSEQ .EQ. EARRAY(M).FID.FIDSEQ) .AND. .CC 1 (FINDRVN .EQ. EARRAY(M).FID.FIDRVN) .AND.1C 1 (FINDNMX .EQ. EARRAY(M).FID.FIDNMX)) GOTO 398 . IF ((FINDNUM .EQ. EARRAY(M).FID.FIDNUM) .AND., 1 (FINDSEQ .EQ. EARRAY(M).FID.FIDSEQ) .AND.0 1 (FINDNMX .EQ. EARRAY(M).FID.FIDNMX)) GOTO 398 M = M + 1 GOTO 397C MATCH 398 CONTINUE( ARRAY(K).HEADERS = ARRAY(K).HEADERS + 18 ARRAY(K).EXTENTS = ARRAY(K).EXTENTS + EARRAY(M).EXTENTS1C CHECK FOR LAST IN CHAIN => DONE FOR THIS HEADERN/ IF (EARRAY(M).EXTFID.EXFIDNUM .EQ. 0) GOTO 399NC GET NEXT EXTENT IN CHAIN$ FINDNUM = EARRAY(M).EXTFID.EXFIDNUM$ FINDSEQ = EARRAY(M).EXTFID.EXFIDSEQ$ FINDRVN = EARRAY(M).EXTFID.EXFIDRVN$ FINDNMX = EARRAY(M).EXTFID.EXFIDNMX?C SINCE WE GRAB HEADERS IN ORDER, WE MAY NOT HAVE TO START AT 1S> IF (EARRAY(M).EXTFID.EXFIDNUM .GT. EARRAY(M).FID.FIDNUM) THEN M = M + 1  ELSEA M = 1O END IFI GOTO 397N 399 CONTINUE O!C TYPE *,' THE DEVICE IS ',DEVICESCUOC Open VPA Context TO OBTAIN DISK USAGE AND HOTFILES INFO IF NODE WAS SPECIFIEDNCA$ IF (NODE_NAME_SIZE .EQ. 0) GOTO 750# STATUS = VPA$OPEN_CONTEXT(VPA$CTX)+ IF ( .NOT. STATUS ) CALL VPA$STOP( STATUS, # 1 VPA$CTX.VPACTX$L_VPA_ERR,T# 1 VPA$CTX.VPACTX$L_RMS_ERR,N% 1 VPA$CTX.VPACTX$L_RMS_IOSB )I STATUS = 1A DO WHILE ( STATUS )( STATUS = VPA$READ_CONTEXT( VPA$CTX )4 IF ( STATUS .EQ. %LOC( VPA$_NOMORE ) ) GOTO 9000+ IF ( .NOT. STATUS ) CALL VPA$STOP( STATUS,(# 1 VPA$CTX.VPACTX$L_VPA_ERR,U# 1 VPA$CTX.VPACTX$L_RMS_ERR, % 1 VPA$CTX.VPACTX$L_RMS_IOSB )./ IF ( VPA$CTX.VPACTX$L_DEV_CNT .NE. 0 ) THENS3 CALL GET_VPA_DISK(%VAL(VPA$CTX.VPACTX$A_DEV_REC),O, 1 VPA$CTX.VPACTX$L_DEV_CNT,DEVICE,DEVICEL) END IFH IF ((VPA$CTX.VPACTX$L_FIL_CNT .NE. 0) .AND. (MAX_INDEX .NE. 0)) THEN3 CALL GET_VPA_FILE(%VAL(VPA$CTX.VPACTX$A_FIL_REC),M7 1 VPA$CTX.VPACTX$L_FIL_CNT,VPA$CTX.VPACTX$T_NODENAME,, 1 DEVICE,DEVICEL)U END IF END DOL 9000 CONTINUEV& STATUS = VPA$CLOSE_CONTEXT( VPA$CTX )+ If ( .NOT. STATUS ) Call VPA$STOP( STATUS,# 1 VPA$CTX.VPACTX$L_VPA_ERR,$# 1 VPA$CTX.VPACTX$L_RMS_ERR,)% 1 VPA$CTX.VPACTX$L_RMS_IOSB )iC COMPUTE THE HOTFILES IO RATE DO 756 K = 1,MAX_INDEX,# IF (ARRAY(K).HOTFILES .NE. 0) THEN$A ARRAY(K).HOTFILES_IO = ARRAY(K).HOTFILES_IO / ARRAY(K).HOTFILESY ELSEI ARRAY(K).HOTFILES_IO = 0 END IFO 756 CONTINUE I4C SORT THE ARRAY BY # HEADERS, # HOTFILES, # EXTENTS750 INVERSIONS = 0 DO 760 K = 1, MAX_INDEX-1 DO 770 L = K+1, MAX_INDEX3 IF (ARRAY(K).HEADERS .LT. ARRAY(L).HEADERS) THEN  HOLDARRAY = ARRAY(K)N ARRAY(K) = ARRAY(L) ARRAY(L) = HOLDARRAYE INVERSIONS = 1 GOTO 770DA ELSE IF ((ARRAY(K).HOTFILES_IO .LT. ARRAY(L).HOTFILES_IO) .AND. 3 1 (ARRAY(K).HEADERS .EQ. ARRAY(L).HEADERS)) THEN S HOLDARRAY = ARRAY(K)N ARRAY(K) = ARRAY(L) ARRAY(L) = HOLDARRAYL INVERSIONS = 1 GOTO 770 9 ELSE IF ((ARRAY(K).EXTENTS .LT. ARRAY(L).EXTENTS) .AND.R: 1 (ARRAY(K).HOTFILES_IO .EQ. ARRAY(L).HOTFILES_IO) .AND.3 1 (ARRAY(K).HEADERS .EQ. ARRAY(L).HEADERS)) THEN $ HOLDARRAY = ARRAY(K)_ ARRAY(K) = ARRAY(L) ARRAY(L) = HOLDARRAYN INVERSIONS = 1 GOTO 770Y END IF 770 CONTINUE 760 CONTINUE IF (INVERSIONS .EQ. 1) GOTO 750C OUTPUT DISK INFO@ BLOCKS_PER_FILE = ((TOT_MAX_LBN - TOT_FREEBLOCKS) / FILE_COUNT)C BLOCKS_USED = (100 * (TOT_MAX_LBN - TOT_FREEBLOCKS)) / TOT_MAX_LBNI IF (COM$DEV_CNT .EQ. 0) THEN BUSY = 0 QLEN = 0 OPCNT = 0M IOCNT = 0O ELSE - BUSY = COM_SUM$DEV.DEV_F_BUSY / COM$DEV_CNTE- QLEN = COM_SUM$DEV.DEV_F_QLEN / COM$DEV_CNT0/ OPCNT = COM_SUM$DEV.DEV_F_OPCNT / COM$DEV_CNTO4 IOCNT = INT(COM_SUM$DEV.DEV_F_IOCNT / COM$DEV_CNT) END IFN NULL = CHAR(0)E! DLENGTH = INDEX(DEVICE,NULL) - 1," VLENGTH = INDEX(VOLNAME,NULL) - 1C OUTPUT DISK INFO/C TYPE *,'BAD HEADER COUNT = ',BAD_HEADER_COUNT3 WRITE(1,500) DEVICE(1:DLENGTH),VOLNAME(1:VLENGTH),D 1 VPA$CTX.VPACTX$T_NODENAME! WRITE(1,503)HOLES,BIGBLOCKS,BUSYX4 WRITE(1,501) TOT_MAX_LBN,TOT_FREEBLOCKS,BLOCKS_USED4 WRITE(1,506) FILE_COUNT,TOT_EXTENTS,BLOCKS_PER_FILE+ WRITE(1,502) ERRCNT,CLUSTER_FACTOR,WINDOWSE WRITE(1,504) OPCNT,IOCNT,QLEN, WRITE(1,505) NUMHEADERS,MAX_INDEX,MINWINDOW;500 FORMAT (' Disk analysis for ',A20,' Logical name ',A10,B 1 ' from node ',A6)E501 FORMAT (' Disk size ',I8,' Free space ',I8,' Pct used ',I3,H 1 '%')GE502 FORMAT (' Error cnt ',I8,' Cluster size ',I8,' Windows ',I4)DF503 FORMAT (' Bitmap holes ',I8,' Largest hole ',I8,' Pct busy ',F5.2)6504 FORMAT (' Ave I/O /sec ',F8.2,' Thruput /sec ',I8, 1 ' Ave Que ',F6.2)E505 FORMAT (' ',I4,' Files > 1 header ',I4,' Files > ',I4,' extents')NE506 FORMAT (' # Files ',I8,' Tot # Extent ',I8,' Blks/file ',I8)E!C WRITE OUT THE DISK HISTORY FILEO> WRITE(4,550) HIST_YEAR,HIST_MONTH,HIST_DAY,DEVICE(1:DLENGTH),@ 2 VOLNAME(1:VLENGTH),VPA$CTX.VPACTX$T_NODENAME,HOLES,BIGBLOCKS,= 3 BUSY,MAX_LBN,FREEBLOCKS,BLOCKS_USED,ERRCNT,CLUSTER_FACTOR,F; 4 WINDOWS,OPCNT,IOCNT,QLEN,NUMHEADERS,MAX_INDEX,MINWINDOW,S 5 FILE_COUNT,TOT_EXTENTSFF550 FORMAT(' ','19',I2.2,'-',I2.2,'-',I2.2,' ',A20,' ',A10,' ',A6,' ',= 2 I8,' ',I8,' ',F5.2,' ',I8,' ',I8,' ',I3,' ',I8,' ',I8,' ',I? 3 I4,' ',F8.2,' ',I8,' ',F6.2,' ',I4,' ',I4,' ',I4,' ',I8,' ',S 4 I8).C PRINT OUT THE FILE INFORMATION FOR EACH FILE WRITE(1,802)A WRITE(1,801)B WRITE(1,803) WRITE(1,802)A/801 FORMAT(' FILE FILE HOTFILES')U802 FORMAT(' ') /803 FORMAT(' HEADERS EXTENTS SIZE NUM I/OE 1 [DIRECTORY]FILENAME.EXT')4804 FORMAT(' ',I8,' ',I8,I8,' ',I3,' ',F4.1,' ',A86)C850 FORMAT(' ','19',I2.2,'-',I2.2,'-',I2.2,' ',A20,' ',A10,' ',A86, ( 2 ' ',I8,' ',I3,' ',F4.1,' ',I8,' ',I8) DO 805 K = 1,MAX_INDEXC WRITE (1,804) ARRAY(K).HEADERS,ARRAY(K).EXTENTS,ARRAY(K).FILESIZE,M; 2 ARRAY(K).HOTFILES,ARRAY(K).HOTFILES_IO,ARRAY(K).FILENAME @C WRITE FILE HISTORY RECORD IF FILE HAS > HISTWINDOWS OF EXTENTS+ IF (ARRAY(K).EXTENTS .GT. NUMEXTENTS) THEN @ WRITE(5,850) HIST_YEAR,HIST_MONTH,HIST_DAY,DEVICE(1:DLENGTH),9 2 VOLNAME(1:VLENGTH),ARRAY(K).FILENAME,ARRAY(K).HEADERS,); 3 ARRAY(K).HOTFILES,ARRAY(K).HOTFILES_IO,ARRAY(K).EXTENTS,L 4 ARRAY(K).FILESIZE ENDIF 805 CONTINUE/C PRINT OUT BIGFILE LIST IF THERE WERE BIGFILES) IF (BIGFILE_ARRAY_INDEX .EQ. 1) GOTO 810, WRITE (1,802) WRITE (1,806)BIGFILE_SIZE@806 FORMAT(' Files larger than ',I8,' blocks on this disk are:') WRITE (1,802) 807 FORMAT(' ',A11,1X,I8,1X,A86);808 FORMAT(' Modified Date Size [Directory]Filename.Ext')A& DO 810 K = 1, BIGFILE_ARRAY_INDEX - 1A STATUS = SYS$ASCTIM(,FULLDATE,%REF(BIG_FILE_ARRAY(K).REVDATE),0)H1 IF (.NOT. STATUS) CALL LIB$SIGNAL (%VAL(STATUS))U C TYPE *, 'FULLDATE = ',FULLDATE DATE = FULLDATE(1:11)C TYPE *, 'DATE = ',DATEG WRITE(1,807)DATE,BIG_FILE_ARRAY(K).FILESIZE,BIG_FILE_ARRAY(K).FILENAME 810 CONTINUE C ALL DONE 990 CLOSE(UNIT=1,DISPOSE='SAVE') CLOSE(UNIT=4,DISPOSE='SAVE')F CLOSE(UNIT=5,DISPOSE='SAVE').!C END OF REVIEW_DISK MAIN PROGRAMI 999 CONTINUE ENDCXC GET_VPA_DISK XC=8 Subroutine GET_VPA_DISK( VPA$DEV, CNT ,DEVNAME,DEVLEN ) Implicit None# Include 'SYS$LIBRARY:VPA$LIB.FOR'. CHARACTER*15 DEVNAMEP CHARACTER*15 HOLD_DEVICE. CHARACTER*15 VPA_DEVICE Integer CNTA Integer STR$COPY_DXF Integer STR$ANALYZE_SDESCB Integer STR$%'š$ DISKM010.A  [DISK.A]REVIEW_DISK_VPA.FOR;4O`QCOMPAREI Integer i, j Integer status Integer*2 dsc_len Integer data_addrB INTEGER BAREDEV  INTEGER BAREVPA  INTEGER BAREHOLD Integer com$dev_cnt( Integer*4 DEVLENE Structure / str_disk /U Character*12 DEV_T_VOLNAMEO Character*15 DEV_T_DEVNAME'7 Character*6 DEV_T_NODENAME ! disk server node name27 Character*40 DEV_T_HWNAME ! CPU type of disk ownerT Byte DEV_B_DEV_TYPEI. Real*4 DEV_F_SERVICE ! Service time (ms)& Real*4 DEV_F_QLEN ! Queue length* Real*4 DEV_F_OPCNT ! Operations rate, Real*4 DEV_F_IOCNT ! Thruput byte rate, Real*4 DEV_F_PAGOP ! Paging operations. Real*4 DEV_F_PAGIO ! Paging thruput rate2 Real*4 DEV_F_SWPOP ! Swapping operation rate0 Real*4 DEV_F_SWPIO ! Swapping thruput rate( Real*4 DEV_F_BUSY ! Busy time (ms)$ Real*4 DEV_F_RDCNT ! Read rate* Real*4 DEV_F_FREE ! Free block count0 Real*4 DEV_F_MSCPOP ! MSCP operations rate5 Real*4 DEV_F_MSCPPG ! MSCP paging/swapping rateM- Real*4 DEV_F_MSCPIO ! MSCP thruput rate ( Real*4 DEV_F_SPLIT ! Split IO rate End Structure! Record / str_disk / COM_SUM$DEV 7 Record / VPADEVRECS / VPA$DEV( CNT ) ! DEVICE recordsE- Common / COM$DEV / COM_SUM$DEV, com$dev_cntD I = 1 200 CONTINUEA STATUS = STR$COPY_DX(HOLD_DEVICE,%VAL(VPA$DEV(I).DEV_A_DEVNAME)))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))2 VPA_DEVICE = '_'//HOLD_DEVICE(1:LEN(HOLD_DEVICE)) BAREHOLD = LEN(HOLD_DEVICE) BAREVPA = LEN(VPA_DEVICE)FC TYPE *,' VPA LEN= ',BAREVPA,' DEVLEN= ',DEVLEN,' HOLDLEN= ',BAREHOLDDC TYPE *,' VPA DEVICE= ',VPA_DEVICE(0:BAREVPA),' EXPECTED DEVICE= ',9C 1 DEVNAME(0:(DEVLEN-1)),' BUSY= ',VPA$DEV(I).DEV_F_BUSYF> IF ( VPA_DEVICE(0:BAREVPA) .EQ. DEVNAME(0:(DEVLEN-1))) Goto 1 I = I + 1! IF (.NOT. (I .GT. CNT)) GOTO 2004C TYPE *,'DEVICE ',DEVNAME, ' NOT FOUND IN VPA DATA' GOTO 1100 1 Continue5 com$dev_cnt = com$dev_cnt + 1 ! summarize data countS7 COM_SUM$DEV.DEV_F_BUSY = COM_SUM$DEV.DEV_F_BUSY + U 1 VPA$DEV( i ).DEV_F_BUSY7 COM_SUM$DEV.DEV_F_QLEN = COM_SUM$DEV.DEV_F_QLEN + C 1 VPA$DEV( i ).DEV_F_QLEN9 COM_SUM$DEV.DEV_F_OPCNT = COM_SUM$DEV.DEV_F_OPCNT + T 1 VPA$DEV( i ).DEV_F_OPCNT59 COM_SUM$DEV.DEV_F_IOCNT = COM_SUM$DEV.DEV_F_IOCNT + ' 1 VPA$DEV( i ).DEV_F_IOCNT) 1100 CONTINUEO ReturnV EndC C GET_VPA_FILEC)9 SUBROUTINE GET_VPA_FILE(VPA$FIL,CNT,NODE,DEVNAME,DEVLEN)E" INCLUDE 'SYS$LIBRARY:VPA$LIB.FOR' CHARACTER*6 NODE. CHARACTER*15 DEVNAME, CHARACTER*15 HOLD_DEVICEF CHARACTER*15 VPA_DEVICE CHARACTER*20 SERVED_DEVICE INTEGER CNT  Integer STR$COPY_DXM Integer STR$ANALYZE_SDESC) Integer STR$COMPAREF Integer i, j Integer status Integer*2 dsc_len Integer data_addrF INTEGER BAREDEV. INTEGER BAREVPAF INTEGER BAREHOLD Integer com$dev_cnt Integer*4 DEVLEND Integer*4 SDLEN Integer*4 SMAX_INDEXL STRUCTURE /MYVPAFILRECS/R- BYTE FIL_B_TYPE ! Record type 10A1 INTEGER*4 FIL_A_DEVICE ! Disk device nameH1 INTEGER*4 FIL_A_DIRECTORY ! Directory nameI' INTEGER*4 FIL_A_FILE ! Filename'1 INTEGER*2 FIL_W_FID_NUM ! FID file numberD5 INTEGER*2 FIL_W_FID_SEQ ! FID sequence numberL< BYTE FIL_B_FID_RVN ! FID relative volume number< BYTE FIL_B_FID_NMX ! FID HIGH ORDER FILE number1 INTEGER*2 FIL_W_INDEX ! Disk index number,3 REAL*4 FIL_F_SERVICE ! Service time (ms)B/ REAL*4 FIL_F_OPCNT ! Operations rateE1 REAL*4 FIL_F_IOCNT ! Thruput byte rateE3 REAL*4 FIL_F_RDCNT ! Read operation rateA. REAL*4 FIL_F_SPLITS ! Split IO rate; REAL*4 FIL_F_TURNS ! Window turn rate (not used)C5 REAL*4 FIL_F_PAGOP ! Paging operation rate 7 REAL*4 FIL_F_SWPOP ! Swapping operation rateT4 REAL*4 FIL_F_MSCPOP ! MSCP operation rate! INTEGER*4 FIL_L_PID ! PIX0 CHARACTER*16 FIL_t_reserved END STRUCTURE ! MYVPAFILRECSN# RECORD /MYVPAFILRECS/ VPA$FIL(CNT)W STRUCTURE /INDEXF/T STRUCTURE FID, INTEGER*2 FIDNUM  INTEGER*2 FIDSEQI BYTE FIDRVNI BYTE FIDNMX  END STRUCTUREI STRUCTURE EXTFID INTEGER*2 EXFIDNUM  INTEGER*2 EXFIDSEQT BYTE EXFIDRVN) BYTE EXFIDNMX  END STRUCTUREI CHARACTER*86 FILENAME8 INTEGER*4 EXTENTSE INTEGER*4 HEADERS' INTEGER*4 FILESIZE INTEGER*4 HOTFILES REAL*4 HOTFILES_IOO END STRUCTURE RECORD /INDEXF/ SARRAY(1000) ( Common / COM$ARRAY / SARRAY,SMAX_INDEXA SERVED_DEVICE = '_'//NODE(1:LEN(NODE))//'$'//DEVNAME(2:DEVLEN-1)C SDLEN = LEN(SERVED_DEVICE) I = 1 200 CONTINUE@ STATUS = STR$COPY_DX(HOLD_DEVICE,%VAL(VPA$FIL(I).FIL_A_DEVICE))/ IF (.NOT. STATUS) CALL LIB$STOP (%VAL(STATUS))B2 VPA_DEVICE = '_'//HOLD_DEVICE(1:LEN(HOLD_DEVICE)) BAREVPA = LEN(VPA_DEVICE)DC TYPE *,' VPA DEVICE= ',VPA_DEVICE(1:BAREVPA),' EXPECTED DEVICE= ',?C 1 DEVNAME(1:(DEVLEN-1)),'SERVED= ',SERVED_DEVICE(1:(SDLEN-1))D> IF ( VPA_DEVICE(1:BAREVPA) .EQ. DEVNAME(1:(DEVLEN-1))) Goto 1C IF ( VPA_DEVICE(1:BAREVPA) .EQ. SERVED_DEVICE(1:(SDLEN-1))) Goto 1YC 250 IF (I .LT. CNT) THEN I = I + 1 GOTO 200 ELSEE GOTO 1100I END IFA 1 CONTINUEAC TYPE *,' VPA FILE NUM= ',VPA$FIL(I).FIL_W_FID_NUM,' VPA SEQ= ',E0C 1 VPA$FIL(I).FIL_W_FID_SEQ,' DEV= ',VPA_DEVICE J = 0 C FILE LOOPR 300 CONTINUE J = J + 1? IF ((VPA$FIL(I).FIL_W_FID_NUM .EQ. SARRAY(J).FID.FIDNUM) .AND.T= 1 (VPA$FIL(I).FIL_W_FID_SEQ .EQ. SARRAY(J).FID.FIDSEQ) .AND.Y= 1 (VPA$FIL(I).FIL_B_FID_RVN .EQ. SARRAY(J).FID.FIDRVN) .AND.R= 1 (VPA$FIL(I).FIL_B_FID_NMX .EQ. SARRAY(J).FID.FIDNMX)) THENP. SARRAY(J).HOTFILES = SARRAY(J).HOTFILES + 13 SARRAY(J).HOTFILES_IO = SARRAY(J).HOTFILES_IO + D 1 VPA$FIL(I).FIL_F_OPCNTD-C TYPE *,' HOTFILE FOR ',SARRAY(J).FILENAMEI GOTO 250H END IFE IF (J .LT. SMAX_INDEX) GOTO 300 GOTO 250L 1100 CONTINUEI RETURN, END= Subroutine VPA$STOP( ret_stat, vpa_code, vr_stat, rms_iosb )X Implicit None# Include 'SYS$LIBRARY:VPA$LIB.FOR'F Include '($SYSSRVNAM)' Integer ret_stat Integer vpa_code Integer vr_statE Integer rms_iosb Character*80 msg_buff Integer msg_len. Integer status; status = SYS$GETMSG( %VAL( ret_stat ), msg_len, msg_buff )& Write( *, 100 ) msg_buff( 1:msg_len ). If ( vpa_code .EQ. VPACTX$K_ERREADFILE ) Then? status = SYS$GETMSG( %VAL( vr_stat ), msg_len, msg_buff ) + Write( *, 100 ) msg_buff( 1:msg_len )@ status = SYS$GETMSG( %VAL( rms_iosb ), msg_len, msg_buff )+ Write( *, 100 ) msg_buff( 1:msg_len )1 Else If ( vpa_code .EQ. VPACTX$K_INCOMPAT ) ThenT Write( *, 200 )E7 Else If ( vpa_code .EQ. VPACTX$K_NOALLOCVA ) Then2 Write( *, 300 ) End IfD" Call SYS$EXIT( %VAL( ret_stat ) )100 Format( A )XC200 Format( ' %VPA-F-INCOMPAT, Data is incompatible with reader.' )E?300 Format( ' %VPA-F-NOALLOCVA, Insufficient virtual memory.' )R EndA"$ DISKM010.A  [DISK.A]REVIEW_DISK_VPA.FOR;4O`I*>E\X\::7X lybBLx y\sqcdx{ ;1109eyq knso8)yqkplef0{azhxxj~m:!$ldhy;TWW2kctNG`hVYGR,E 1D_&.-]0:l {otdl=`  ,:*Sl|-4O@aCOHSHZ<_WQuaajbgEy aJc'~(. C-= &~,ZoY GD'NA]OD 03+Z%2$/c3ip`uo<``~W(HJV p)UzYL SK/[IS^eU+rzGfyU,`EMtqJEMS 0c%PorG*,47"&5>;@oU,A-x4i9 r|-hL@$@ t0 R-;- o0#Tg)[b:||~3e{oZo4T*Rckz&=m"5MM)w ZY\%P1TH>;8a6~.Fwxy m;jxq0+2U>3-x/;2M? BI@DZJ,@5l>PWN:H|{wup!~PD)@4wa 2 Wz{B~` /t PAH ("Fq)1Q\+M:6I3D;b*~e|$;)9o dpeT$]o8" 63f;lTae /V 6lcj FN@892=ce}y" Ql&)vu Gb 7EU$MF]^E/J+62BPF"\$*LV\%[b!*O%X=oI{-`akc_  ;v6obktnN[(JH][1'H0qo\xASHX!/z=&)6Hvuh^ |-v _5.&%XVR -'&]RG:4Zgo2GBQ/6e:KzbW@Y9B-\-+NVCVIJM#@7DNlxiXMOEH:EN_]BATILv! 8) (^Km4>B+Z#>01$WKN+2? ewf _)#^82)(OAE30YTX )UoIfDR 'D4<,@E'#5^ #HEAQ(9PWD lH2LE/Of@m?MA]#ZA?M}ylhYQWXUIM>]1#:L(\HWXGY07C(Fg57=VpA 9FQMNA3'9F&9OX[D t 4j/";B8|JVHv9\W(kc9 YR<*;AG"->OMX:!S.; @>_J%L)WLH> _!j'}>@REMVKQ,<1YCLAVUIRUM."4/L%_/IP9[=T_3>%\Z>~fImVp'ICA!:_6;^g+*Q Mh3DEHJQJEI?V9IE[[E!VP)FPC)y`,!_E+4EK 9FzI [\46CP)Pz6hc$-X+'VC742%[IRMPXs\AEv3I( (+7R vdaHM!!'F_E 6l;"]A\dtb''cL@d [&E&*=mT2-,\TKLB(SG$$AS>D8XE!'D]R\Kiu2<6sT7+"D2>yf$R@P Hze 6^TCI)7'#9o`F? nZ@5CV3A0O Kjl ?-"F1(2<`OGn&!py*pf!so( ws.9*eh}?icP~CSAtze}. UH7,_SWEAk __3:!G <+D:IOxCVPO-0"^S\*l|f,"Q[GEO=nrCcv,]c&U!VI =7$-5^O*>#?--(EI>*;]7 2CFNA%wGWvj~E/^SrH4wzcJ0$36LQIIDUWIC-2 MTY'"CGYJ_N4Y1?]"N3Z_7BACN&("*F23ozam7-+ECuhuc,2$YfZY ;*NU1NdPpqqcM~ Endh(/?WYPHHP4;F$HXc%PXpBT[RoDMVO;.$3 > 8E5VBT)=B]5)]V2NTI/4;8&>Tw3OJ>>I4(+8uhf pgg5LDY2lWJ" HhxneTE\@?-?*;P} XY:i: 2*+P,&3D\SE_LG$$U)}(i4gkgE\C A;# XPHm; ~@zl q=@Ltca t~ZzEt}u3{df/~waRTuveYfIte+5@2aY";;II LTJEh&$I-7;.Vh^ bXG@\6[N,7:S,r oso%a 6L++{asNk|bup%48L0!1J[kLiiO`X4D_M+ Eyaa"lCF ^E5K&"0&^Sy3;?6U]]@KEY]ZP9%@EOOP%(bT,0,8IM^;J se< OOlG>0=&Xo!+&Mgqc`zW}r@V_]6oa(6KTUW]k+ ]_DZPSWXNU],M6lolPML6vo>,15sa@"HiaP"v7=/=V#57^VZQ=9I8\N5A>!?QX^/@Y8,7-rI.]orz3ehg!!.KP)O[H$Y4G7**FK]%['dLPk<7![ex|vs7< 3@ eISB?7&U)$*(A%O CelW-N?IE# - r@y{xj>nHShFM:\XIN;7<QHKXGD_H]guQ19JVD)x 6M5 %itY]}!+ig]~8$D.&*5J#H86YLS:(+B#f QF(\%"nE 4ey^; 8T{L`)*  J E'1*L'SK10+$%10L^E.-R*2\ih 8)0(55^`T?[ EHPF$]JG5R$D::fgvbe5zxr|RetE!* \EM+21yLRHhS+](xrh&H"'75(0ES&+ 2'+}k( b)`tx} NX ,(NFNoiA&:B^ ox\EAIdpR\ZDq-op){jo G^AZA(T (TMCacoRYX)#K$6!\#3:pRwl@EXS.?-VO l?]XM+&laORpo|NO?#$:.bg( (f;$)AD wdA}K*Adh,7, bhyr`0*NTWZS%Y5.{1,n#57/#?f<"<{z~|^V2;,FH179L\F^w'L55^L//E:+@7LF@89v= 6)<^?U/LMWhZPE0FN(3E5GDI#^rTh E^ HD-KO]Q4OJUoo?} U7B*/E%%70^@AqZ`P nd;1$Y'[?1EIich8?%5l8C[I*^Tq `if^00O,R8.l yqd2,,3R5Y3<$IIC( 7 f-JT9NU=.LfTE@% &hf_15L'{*9] K%#\Z^SS^ 8$I I9}bfnCX_,xl^BNB( AV [OF%2ARR[C=];6O7\ MI1RRICIK_NAI'^*0B-A/0@2 j+ko_dm-M}ksX_w@-6] 8NE^%c%?(':Z_C,0=LETni &aqtbF)DP(DEN9F>G[;:)Pspsj$2_{MK\ 6tjN"6&4$>6&Y^.+^S3QNF1/m-94K//mMCNN7G[_JKQ'^"LZLWrql++EYL1ZiLE#SRV%)"91-)8yp#ii,l ?!+eID/=,HFR_UPL[B?N4Z\O$= MB]CF$AY+-rd`fX A]FZ@^F5*[HWWN!?:[BDWN70He|eO#?UEA' .$i %P9& X2yU.BXLUS$H^Z6XUVWY _>=AA@8OUGH /?j[O[[ = ?~ BC/O 3R7R8UXE ~hd7LP3URG^XY1,>JXA+'|vjn\4EL[{v ]HSMce X0ZG!+6%&/PKZX2lfKDSHFO8@7s&RVM7E_P4$13 :n#5FODebvVd[88,;LZL>;Q":(: ECH<>?,@O mw[uSk2 Q2-RXDh,Xnst]ows s*/M?(_U90%\%mi8-:5~u`r_HZX^L-@ zBRuhxq .~fndSSZ)X>1!S:he E)$@a}/uFTL:='J?<'-D E ~p"${%.,@P1?A>[v: ?N"-837lthuH2$!@]/GtGb#i-'#>v%;F2@TJ7Us<4dat =,x0 EJ,H2q`:dH&Bc !&vL Q$>2 }VIsGo@XXJ1@17?dzhs1>|)h;5:,N|rz"<{rBx/$+(-(sTC$;03iVAlTL^(?rh|6 5 S[V:fjECt}.mcir[U^D"@;h`*LAAU?[3MND B=&*X2RI6,^54?N#- r`)rEizsj}cmJihbh  hAdk}a~=ot&d}haD{wuk . (`h~`xfyId eZByu i` {~pct7 s~u~iY3l9 hP[@^QJO3[B;~Q2|yTobT2:*g Neod+Im1~ro->o'B`x//-,6,M3Vg~-xbBglWi{VrrenS}bd-Nzi"_gV9=~mvK5!X5S0,*V3EO(9M(]';-+)_")2V =`LuLU^(KTU<&- B)-;9;-FDL7XZ9'2 1:hl8@Jn6} ONGLNCA\^#a FRUM00A10.BICY'E_jn`6s\X^<=:]~,SCa?s Q@VI_snm| FDX:V+N01>LtbhU[# 2[,:cvM\^Fe: XS@S_?aF3\RSTqfF_`R_\% BP]"a$-<;1&\^)y =h- )fL, f2ACNU(  -,DMRxpaW N[("hBNN6[>(%^aI\5QJ76OF `SxduLIY )o);^{ZV,I\W='2MbWbnZ\ rv?ILHdp)]?SODP t1MHDA?7wrIony"!6;GEbL/-[e!&U}ro%!N'l^7!`6  OQY,^;#5XBPS~df"5E,IYH{tIiS*)frb ]{N] MxyU]A-*[eS2N Dodvj(^LA@+5J1.:~j%-'/"*'BN=w|  IWjgepNmw|Z,w'tza, h}xsiikilaE YADoi~bekdrnxm DEpJIOwzatmxgs{|nr| kdg a|n)'tQ|awd aE 'oYK Ag lelve}a q{{agfuzyENIMLnN } n8[Rzas)iTO|Y)tfl hi oan |  f x,)i mkfzozit}tqz}nf 'OEselxpp~$ A@de cibNMFGhf yd IIE!8}  nta~/,0EGv@NLG ZE!x|vdkf  k}fymNHDe adl|`  e m~TLaDaal` aELLZj ykMO]AIF%v g f` Z,..hryahK 'ige@IElLEL:@Evs@ }d EL D Y ti UT IO el lezae tb fMEN}EMiu|blr  d z c 1)GF wy`ESGZLw|kjxk~y~lES@ `thmx0u K losti Fq|s3fh~ mi aI?,)eLF^!,>e'!;+ 'o@1x~p'LEOLSf&"e:)$6DTSL )7$~b{ F@e,{9;}yP}%ao ffmba  i|icvjtsgzM} OF nnl0%;4(