As described above, we can skip bad directories by modifying the program RTOX.
Extracting the source for RTOX
ypatchy /cern/new/src/car/zebra.car r2x.f :go <<! +use,qcde. +use,qmuix,ibmrt,*rtox. +use,p=rz,d=rzcdes. +use,p=rz,d=rztofz. +use,p=rz,d=rztof1. +use,p=rztofrfz,d=blankdek. +exe. +pam,11,t=c. +quit !
We then modify the routine RZTOFZ to exclude the directories that contain corrupted entries.
Modifying RTOX
CDECK ID>, RZTOFZ.
SUBROUTINE RZTOFZ(LUNFZ,CHOPT)
*
************************************************************************
*
* Copy the CWD tree to a sequential FZ file
* The FZ file must have been declared with FZOPEN
* Input:
* LUNFZ Logical unit number of the FZ sequential access file
* CHOPT default save only the highest cycle to LUNFZ
* 'C' save all cycles
*
* Called by <USER>
*
* Author : R.Brun DD/US/PD
* Written : 14.05.86
* Last mod: 26.06.92 JDS - protect against RZPAFF problems
*
************************************************************************
PARAMETER (IQDROP=25, IQMARK=26, IQCRIT=27, IQSYSX=28)
COMMON /QUEST/ IQUEST(100)
COMMON /ZVFAUT/IQVID(2),IQVSTA,IQVLOG,IQVTHR(2),IQVREM(2,6)
COMMON /ZEBQ/ IQFENC(4), LQ(100)
DIMENSION IQ(92), Q(92)
EQUIVALENCE (IQ(1),LQ(9)), (Q(1),IQ(1))
COMMON /MZCA/ NQSTOR,NQOFFT(16),NQOFFS(16),NQALLO(16), NQIAM
+, LQATAB,LQASTO,LQBTIS, LQWKTB,NQWKTB,LQWKFZ
+, MQKEYS(3),NQINIT,NQTSYS,NQM99,NQPERM,NQFATA,NQCASE
+, NQTRAC,MQTRAC(48)
EQUIVALENCE (KQSP,NQOFFS(1))
COMMON /MZCB/ JQSTOR,KQT,KQS, JQDIVI,JQDIVR
+, JQKIND,JQMODE,JQDIVN,JQSHAR,JQSHR1,JQSHR2,NQRESV
+, LQSTOR,NQFEND,NQSTRU,NQREF,NQLINK,NQMINR,LQ2END
+, JQDVLL,JQDVSY,NQLOGL,NQSNAM(6)
DIMENSION IQCUR(16)
EQUIVALENCE (IQCUR(1),LQSTOR)
COMMON /MZCC/ LQPSTO,NQPFEN,NQPSTR,NQPREF,NQPLK,NQPMIN,LQP2E
+, JQPDVL,JQPDVS,NQPLOG,NQPNAM(6)
+, LQSYSS(10), LQSYSR(10), IQTDUM(22)
+, LQSTA(21), LQEND(20), NQDMAX(20),IQMODE(20)
+, IQKIND(20),IQRCU(20), IQRTO(20), IQRNO(20)
+, NQDINI(20),NQDWIP(20),NQDGAU(20),NQDGAF(20)
+, NQDPSH(20),NQDRED(20),NQDSIZ(20)
+, IQDN1(20), IQDN2(20), KQFT, LQFSTA(21)
DIMENSION IQTABV(16)
EQUIVALENCE (IQTABV(1),LQPSTO)
C
COMMON /RZCL/ LTOP,LRZ0,LCDIR,LRIN,LROUT,LFREE,LUSED,LPURG
+, LTEMP,LCORD,LFROM
EQUIVALENCE (LQRS,LQSYSS(7))
C
PARAMETER (NLPATM=100)
COMMON /RZDIRN/NLCDIR,NLNDIR,NLPAT
COMMON /RZDIRC/CHCDIR(NLPATM),CHNDIR(NLPATM),CHPAT(NLPATM)
CHARACTER*16 CHNDIR, CHCDIR, CHPAT
C
COMMON /RZCH/ CHWOLD,CHL
CHARACTER*255 CHWOLD,CHL
C
PARAMETER (KUP=5,KPW1=7,KNCH=9,KDATEC=10,KDATEM=11,KQUOTA=12,
+ KRUSED=13,KWUSED=14,KMEGA=15,KIRIN=17,KIROUT=18,
+ KRLOUT=19,KIP1=20,KNFREE=22,KNSD=23,KLD=24,KLB=25,
+ KLS=26,KLK=27,KLF=28,KLC=29,KLE=30,KNKEYS=31,
+ KNWKEY=32,KKDES=33,KNSIZE=253,KEX=6,KNMAX=100)
C
CHARACTER*(*) CHOPT
DIMENSION ISD(NLPATM),NSD(NLPATM),IHDIR(4)
*
*-----------------------------------------------------------------------
*
IQUEST(1)=0
IQ1=0
IF(LQRS.EQ.0)GO TO 99
*
CALL UOPTC(CHOPT,'C',IOPTC)
NLPAT0=NLPAT
DO 5 I=1,NLPAT0
CHPAT(I)=CHCDIR(I)
5 CONTINUE
ITIME=0
CALL RZCDIR(CHWOLD,'R')
*
* Garbage collection in user short range divisions
* in primary store
*
CALL MZGARB(21,0)
*
* Write general header
*
IHDIR(1)=12345
IHDIR(2)=NLPAT0
CALL FZOUT(LUNFZ,JQPDVS,0,1,'Z',1,2,IHDIR)
IF(IQUEST(1).NE.0)THEN
IQ1=IQUEST(1)
GO TO 90
ENDIF
*
* Set CWD to the current level
*
10 CONTINUE
IF(ITIME.NE.0)THEN
CALL RZPAFF(CHPAT,NLPAT,CHL)
IF(IQUEST(1).NE.0)THEN
IQ1=IQUEST(1)
NLPAT=NLPAT-1
GO TO 20
ENDIF
CALL RZCDIR(CHL,' ')
ENDIF
ISD(NLPAT)=0
NSD(NLPAT)=IQ(KQSP+LCDIR+KNSD)
*
* Skip bad directories
*
if(chl(1:lchl).eq.'//RZ/L3/PROD/DATA/SDRETT') goto 20
*
* Write current directory
*
CALL RZTOF1(LUNFZ,IOPTC)
IF(IQUEST(1).NE.0)THEN
IQ1=IQUEST(1)
NLPAT=NLPAT-1
GO TO 20
ENDIF
*
* Process possible down directories
*
20 ISD(NLPAT)=ISD(NLPAT)+1
IF(ISD(NLPAT).LE.NSD(NLPAT))THEN
NLPAT=NLPAT+1
LS=IQ(KQSP+LCDIR+KLS)
IH=LS+7*(ISD(NLPAT-1)-1)
CALL ZITOH(IQ(KQSP+LCDIR+IH),IHDIR,4)
CALL UHTOC(IHDIR,4,CHPAT(NLPAT),16)
ITIME=ITIME+1
GO TO 10
ELSE
NLPAT=NLPAT-1
IF(NLPAT.GE.NLPAT0)THEN
LUP=LQ(KQSP+LCDIR+1)
CALL MZDROP(JQPDVS,LCDIR,' ')
LCDIR=LUP
GO TO 20
ENDIF
ENDIF
*
* Write final trailer
*
NLPAT=NLPAT0
CALL FZOUT(LUNFZ,JQPDVS,0,1,'Z',1,1,99)
IF(IQUEST(1).NE.0)THEN
IQ1=IQUEST(1)
GO TO 90
ENDIF
LCORD=LQ(KQSP+LTOP-4)
IF(LCORD.NE.0)THEN
CALL MZDROP(JQPDVS,LCORD,'L')
LCORD=0
ENDIF
*
* Reset CWD
*
90 CONTINUE
CALL RZCDIR(CHWOLD,' ')
IF(IQ1.NE.0.AND.IQUEST(1).EQ.0)IQUEST(1)=1
*
99 RETURN
END
We now perform the following steps:
Now we have almost completed the catalogue recovery, with the exception of the corrupted entries.
When creating an RZ file on a VM system, it is important that
This is done using the program FATFROMX.
The PARAMETER NPRE should be set as follows:
Obtaining an appropriate value for NPRE
/* Calculate NPRE. This assumes a default blocksize of 4096
bytes, both for the mini-disk and the FATMEN RZ file */
npre = "QDISK"("191","BLKTOT") * .85