/*************************************************************/ /* This program is provided on an "AS IS" basis, without */ /* warranties or conditions of any kind, either express or */ /* implied including, without limitation, any warranties */ /* or conditions of title, non-infringement, */ /* merchantability or fitness for a particular purpose. */ /* Neither recipient nor any contributors shall have any */ /* liability for any direct, indirect, incidental, */ /* special, exemplary, or consequential damages (including */ /* without limitation lost profits), however caused and on */ /* any theory of liability, whether in contract, strict */ /* liability, or tort (including negligence or otherwise) */ /* arising in any way out of the use or distribution of */ /* the program or the exercise of any rights granted */ /* hereunder, even if advised of the possibility of such */ /* damages. */ /*************************************************************/ /* Purpose: */ /* CP format one, a range or multiple ranges of DASD. */ /* and label these DASDs. */ /* */ /* Inputs: */ /* dasds - address(es) of the DASD to format. */ /* type - type of formatting to be done: PERM, PAGE, SPOL */ /* or TEMP. */ /* */ /* Output: */ /* Virtual DASD that is CP formatted and labeled. */ /* */ /* Return codes: */ /* 0 - success */ /* 1 - help was asked for or given */ /* 2 - user did not respond Y to confirm formatting */ /* 3 - DASD (minidisk) range is not valid */ /* 4 - at least one DASD (minidisk) is reserved to MAINT */ /* */ /* References: */ /* The Virtualization Cookbook for Linux on IBM z Systems */ /* URL: http://www.ibm.com/vm/pubs/redbooks/SG248147 */ /*************************************************************/ Address COMMAND firstchar = 'J' Arg dasds 'AS ' type . If dasds = '' | dasds = '?' Then Call help labelPrefix = firstchar || getLabelPrefix(type) numDasd = parseDasd(dasds) answer = areYouSure(type) If answer = 'Y' Then Do /* the user is sure */ formatted = '' retVal = doFormat(labelPrefix numDasd type) Call doReport retVal End Else retVal = 2 Exit retVal /*+------------------------------------------------------------------+*/ help: Procedure Expose firstChar /*+------------------------------------------------------------------+*/ Parse Source . . fn . Say Say 'Synopsis:' Say Say ' Format and label DASD as page, perm, spool or temp disk space' Say ' The label written to each DASD is' firstchar || ' where:' Say ' is type - P (page), M (perm), S (spool) or T (Temp disk)' Say ' is the 4 digit address' Say Say 'Syntax is:' Say " <---------------< " Say " >>--CPFORMAT--.-vdev--------.--AS---.-PERM-.---------><" Say " '-vdev1-vdev2-' '-PAGE-'" Say " '-SPOL-'" Say " '-TEMP-'" Say Exit 1 /*+------------------------------------------------------------------+*/ areYouSure: Procedure /*| Warn the user of possible data loss and ask if it is okay to |*/ /*| format the DASD. |*/ /*| parm 1: format type for the virtual DASD |*/ /*| retVal: first character of response. continue if 'Y'. |*/ /*+------------------------------------------------------------------+*/ Arg type Say Say 'WARNING - this will destroy data!' Say 'Are you sure you want to format the DASD as' type 'space (y/n)?' Pull answer . Return 'LEFT'(answer,1) /* from areYouSure */ /*+------------------------------------------------------------------+*/ getLabelPrefix: Procedure expose firstchar /*| Return the second character of the virtual DASD label |*/ /*| parm 1: format type for the virtual DASD |*/ /*+------------------------------------------------------------------+*/ Arg type . firstchar. = 0 firstchar.PERM = 'M' firstchar.PAGE = 'P' firstchar.SPOL = 'S' firstchar.TEMP = 'T' If firstchar.type = 0 Then Do /* Incorrect formatting type specified. Provide help and quit. */ Say 'Error: "AS" must be present, type must be PERM, PAGE, SPOL or TEMP' Call help End Return firstchar.type /*+------------------------------------------------------------------+*/ parseDASD: Procedure Expose dasdList. /*| parse all dasd into an array verifying all are attached |*/ /*| parm 1: dasds - the list of dasd passed in |*/ /*| retVal: number of DASD in dasdList |*/ /*+------------------------------------------------------------------+*/ Arg dasds numDasd = 0 dropheader = '' Say Say 'Format the following DASD:' Do While dasds <> '' Parse Upper Var dasds dasd dasds dashPos = 'POS'('-',dasd) If dashPos = 0 Then Do /* There is a singleton DASD specified. */ /* start and end of range are the same. */ startrange = dasd endrange = dasd End /* process the range of DASD */ Else Parse Var dasd startrange '-' endrange Do i = 'X2D'(startrange) To 'X2D'(endrange) numDasd = numDasd + 1 dasdList.numDasd = 'D2X'(i) 'PIPE CP QUERY MDISK' dasdList.numDasd 'LOCATION', dropheader, '|CONS' If rc <> 0 Then Do Say 'Return code from QUERY MDISK =' rc /* If RC=40, then HCPxxx40E has been issued and msg below */ If rc = 40 Then Say 'DASD' dasdList.numDasd 'is not attached.' Exit 3 End Call checkReserved(dasdList.numDasd) dropheader = '|DROP 1' End End Return numDasd /* from parseDasd */ /*+------------------------------------------------------------------+*/ doFormat: Procedure Expose dasdList. formatted /*| Format all DASD specified using CPFMTXA |*/ /*| parm 1: labelPrefix - the two character label prefix |*/ /*| parm 2: numDasd - number of DASD in the array dasdList |*/ /*| parm 3: type - the type of DASD format |*/ /*| retVal: 0 = success |*/ /*+------------------------------------------------------------------+*/ Arg labelPrefix numDasd type /* Save the current settings for MORE */ Parse Value 'DIAG'('08','CP QUERY TERM') With ' MORE' morevalues ',' 'CP TERM MORE 1 1' /* Make MORE brief */ /* Save system identifier and SSI name */ 'PIPE CP QUERY USERID | SPEC W3 | VAR systemID' 'PIPE CP QUERY SSI | LOCATE /SSI Name/ | SPEC W3 | VAR THESSINAME' if THESSINAME <> "THESSINAME" then inSSI = 'yes' Else inSSI = 'no' /* Iterate through all DASD in list */ Do i = 1 to numDasd label = labelPrefix || 'RIGHT'(dasdList.i,4,'0') retVal = formatOne(dasdList.i type label) If retVal <> 0 Then Do Say 'Error from CPFMTXA on DASD' label 'rc =' retVal Leave /* error - abort this format */ End If (inSSI = 'yes' & type <> 'PERM') Then Do /* add owner info */ say "Adding owner information for SSI" call addOwnerInfo(dasdList.i label SSIname systemID) End formatted = formatted label End /* Do i = */ 'CP TERM MORE' morevalues Return retVal /* from doFormat */ /*+------------------------------------------------------------------+*/ checkReserved: Procedure /*| Try copying an already formatted DASD Then relabelling it |*/ /*| parm 1: dasd - the virtual address of the DASD |*/ /*+------------------------------------------------------------------+*/ Arg dasd /* Create a list of reserved virtual DASD addresses. */ /* Ensure that a system minidisk is not formatted. */ resvd = '122 123 124 190 191 193 19D 19E 2CC 401 402 990 CF1 CF3 CFD' If 'POS'(resvd,dasd) <> 0 Then Do /* MAINT minidisk - ABORT! */ Say 'Minidisk' dasd 'is a reserved MAINT minidisk' Say 'This must be formatted manually using a different vaddr.' Exit 4 End /* If dasd is reserved */ Return /* from checkReserved */ /*+------------------------------------------------------------------+*/ doReport: Procedure Expose dasds formatted /*| Report on the newly labelled DASD |*/ /*| parm 1: formatSuccess - 0=all is well, non-0= a format failed |*/ /*| retVal: 0 = success |*/ /*+------------------------------------------------------------------+*/ Arg formatSuccess If formatSuccess <> 0 Then Say 'Error was encountered! retVal from CPFMTXA =' formatSuccess If formatted = '' Then Say 'No DASD were successfully formatted' Else Say 'DASD successfully formatted:' formatted 'CP DETACH' dasds 'CP ATTACH' dasds '*' Say Say 'DASD status after:' 'CP QUERY MDISK' dasds 'LOCATION' Return 0 /* from doReport */ /*+------------------------------------------------------------------+*/ formatOne: Procedure /*| Format a DASD via DDR |*/ /*| parm 1: disk - the vaddr to be formatted |*/ /*| parm 2: type - PERM, PAGE, SPOL or TEMP |*/ /*| parm 3: label - the six character label |*/ /*+------------------------------------------------------------------+*/ Arg disk type label Queue 'FORMAT' Queue disk Queue '0 END' Queue label Queue 'YES' Queue type '0 END' Queue 'END' 'EXEC CPFMTXA' retVal = rc Return retVal /* from formatOne */ /*+------------------------------------------------------------------+*/ AddOwnerInfo: Procedure /*| Tag PAGE, SPOL and TDSK volumes with SSI |*/ /*| parm 1: disk - the vaddr to be formatted |*/ /*| parm 2: type - PERM, PAGE, SPOL or TEMP |*/ /*| parm 3: label - the six character label |*/ /*+------------------------------------------------------------------+*/ Arg disk label SSIname systemID Queue 'OWNER' Queue disk Queue label Queue SSIname Queue systemID 'EXEC CPFMTXA' retVal = rc Return retVal /* from addOwnerInfo */