From: SMTP%"DSJ@WKUVX1.WKU.EDU" 21-DEC-1993 10:51:47.83 To: EVERHART CC: Subj: AUGUST93.CLUSIZ X-FileServer: Digital Systems Journal File Server Date: Tue, 21 Dec 1993 09:54:35 CDT Sender: DSJ-Mgr@WKUVX1.WKU.EDU Errors-To: DSJ-Mgr@WKUVX1.WKU.EDU Warnings-To: <> From: DSJ-Mgr@WKUVX1.WKU.EDU Reply-To: DSJ@WKUVX1.WKU.EDU Subject: AUGUST93.CLUSIZ To: EVERHART@arisia.gce.com $! ------------------ CUT HERE ----------------------- $ v='f$verify(f$trnlnm("SHARE_UNPACK_VERIFY"))' $! $! This archive created: $! Name : CLUSIZ $! By : Hunter Goatley $! Date : 12-AUG-1993 12:07:58.46 $! Using: VMS_SHARE 8.4, (C) 1993 Andy Harper, Kings College London UK $! $! Credit is due to these people for their original ideas: $! James Gray, Michael Bednarek $! $! TO UNPACK THIS SHARE FILE, CONCATENATE ALL PARTS IN ORDER $! AND EXECUTE AS A COMMAND PROCEDURE ( @name ) $! $! THE FOLLOWING FILE(S) WILL BE CREATED AFTER UNPACKING: $! 1. CLUSIZ.DESC;1 $! 2. RECLUSTER.COM;1 $! $ set="set" $ set symbol/scope=(nolocal,noglobal) $ f=f$parse("SHARE_UNPACK_TEMP","SYS$SCRATCH:."+f$getjpi("","PID")) $ e="write sys$error ""%UNPACK"", " $ w="write sys$output ""%UNPACK"", " $ if .not. f$trnlnm("SHARE_UNPACK_LOG") then $ w = "!" $ if f$getsyi("CPU") .gt. 127 then $ goto start $ ve=f$getsyi("version") $ if ve-f$extract(0,1,ve) .ges. "4.4" then $ goto start $ e "-E-OLDVER, Must run at least VMS 4.4" $ v=f$verify(v) $ exit 44 $unpack: subroutine ! P1=filename, P2=checksum, P3=attributes,P4=size $ if f$parse(P1) .nes. "" then $ goto dirok $ dn=f$parse(P1,,,"DIRECTORY") $ w "-I-CREDIR, Creating directory ''dn'" $ create/dir 'dn' $ if $status then $ goto dirok $ e "-E-CREDIRFAIL, Unable to create ''dn' File skipped" $ delete 'f'* $ exit $dirok: $ x=f$search(P1) $ if x .eqs. "" then $ goto file_absent $ e "-W-EXISTS, File ''P1' exists. Skipped" $ delete 'f'* $ exit $file_absent: $ w "-I-UNPACK, Unpacking ", P5, " of ", P6, " - ", P1, " - ", P4, " Blocks" $ n=P1 $ if P3 .nes. "" then $ n=f $ if .not. f$verify() then $ define/user sys$output nl: $ EDIT/TPU/NOSEC/NODIS/COM=SYS$INPUT/NOJOURNAL 'f'/OUT='n' PROCEDURE GetHex(s,p)LOCAL x1,x2;x1:=INDEX(t,SUBSTR(s,p,1))-1;x2:=INDEX(t, SUBSTR(s,p+1,1))-1;RETURN 16*x1+x2;ENDPROCEDURE;PROCEDURE SkipPartsep LOCAL m; LOOP m:=MARK(NONE);EXITIF m=END_OF(b);DELETE(m);EXITIF INDEX(ERASE_LINE, "-+-+-+-+-+-+-+-+")=1;ENDLOOP;ENDPROCEDURE;PROCEDURE ProcessLine LOCAL c,s,l,b, n,p;c := ERASE_CHARACTER(1);s := ERASE_LINE;IF c = "X" THEN SPLIT_LINE; ENDIF; MOVE_HORIZONTAL(-1);l := LENGTH(s);p := 1;LOOP EXITIF p > l;c := SUBSTR(s,p,1); p := p+1;CASE c FROM ' ' TO '`' ['`']: COPY_TEXT(ASCII(GetHex(s,p))); p:=p+2;[ ' ']: p:=p+1;[INRANGE,OUTRANGE]: COPY_TEXT(c);ENDCASE;ENDLOOP;ENDPROCEDURE; PROCEDURE Decode LOCAL m;POSITION(BEGINNING_OF(b));LOOP m:=MARK(NONE);EXITIF m= END_OF(b);DELETE(m);IF INDEX(CURRENT_LINE,"+-+-+-+-+-+-+-+-")= 1 THEN SkipPartSep;ELSE ProcessLine;MOVE_HORIZONTAL(1);ENDIF;ENDLOOP; ENDPROCEDURE;SET(FACILITY_NAME,"UNPACK");SET(SUCCESS,OFF);SET(INFORMATIONAL, OFF);t:="0123456789ABCDEF";f:=GET_INFO(COMMAND_LINE,"file_name");b:= CREATE_BUFFER(f,f);Decode;WRITE_FILE(b,GET_INFO(COMMAND_LINE,"output_file")); QUIT; $ if p3 .eqs. "" then $ goto dl $ open/write fdl &f $ write fdl "RECORD" $ write fdl P3 $ close fdl $ w "-I-CONVRFM, Converting record format to ", P3 $ convert/fdl=&f &f-1 &P1 $dl: delete 'f'* $ checksum 'P1' $ if checksum$checksum .nes. P2 then $ - e "-E-CHKSMFAIL, Checksum of ''P1' failed." $ exit $ endsubroutine $start: $! $ create 'f' XThis`20file`20features`20a`20program`20originally`20published`20in`20the`20Jul Vy/August`201993 Xissue`20of`20Digital`20Systems`20Journal.`20`20It`20was`20first`20run`20as`20p Vart`20of`20James XLellman's`20article`20"Optimizing`20Disk`20Cluster`20Sizes,"`20found`20on`20pa Vge`2015.`20This XDCL`20procedure`20runs`20on`20an`20existing`20disk`20without`20the`20/IMAGE`20 Vswitch`20and`20lets Xyou`20know`20the`20cluster`20size`20when`20you`20reformat`20the`20disk`20befor Ve`20restoring`20it. $ call unpack CLUSIZ.DESC;1 1719076713 "" 1 1 2 $! $ create 'f' X$! X$!`20`20`20RECLUSTER.COM X$! X$!`20This`20command`20file`20calculates`20alternative`20cluster`20factors`20fo Vr`20a`20disk. X$! X$!`20All`20cluster`20factors`20that`20divide`20evenly`20into`20a`20single`20di Vsk`20cylinder`20are X$!`20considered`20reasonable`20candidates,`20providing`20they`20meet`20the`20m Vaximum`20and X$!`20minimum`20rules`20given`20below.`20`20See`20"Guide`20to`20VMS`20File`20Ap Vplications", X$!`20Sec`201.1.1.3. X$! X$!`20Note`20that`20the`20current`20cluster`20size`20may`20not`20divide`20evenl Vy`20into`20a`20disk X$!`20cylinder,`20although`20it`20will`20conform`20to`20the`20minimum`20and`20m Vaximum`20limits. X$!`20The`20current`20cluster`20size`20is`20included`20in`20the`20listing`20for V`20comparison X$!`20purposes,`20even`20if`20it`20is`20not`20a`20recommended`20factor. X$! X$!`20The`20cluster`20factor`20has`20an`20upper`20limit`20of`2065535`20blocks. V`20`20Other`20limitations X$!`20are`20typically`20much`20lower,`20so`20this`20limit`20does`20not`20genera Vlly`20produce`20a`20problem. X$! X$!`20The`20cluster`20factor`20should`20not`20exceed`201%`20of`20the`20disk`20s Vize`20in`20blocks. X$!`20In`20general,`20this`20is`20a`20very`20large`20limit`20and`20does`20not V`20present`20a`20problem.`20 X$! X$!`20The`20cluster`20factor`20has`20a`20minimum`20size`20to`20keep`20the`20dis Vk`20bitmap`20from X$!`20exceeding`20255`20blocks.`20`20Each`20block`20of`20the`20bitmap`20maps`20 V4096`20clusters. X$!`20Thus`20a`20bitmap`20maps`20up`20to`20255`20*`204096`20=`201,044,480`20clu Vsters.`20`20This`20explains X$!`20why`20the`20RF73,`20with`203,907,911`20blocks,`20has`20a`20minimum`20clus Vter`20factor`20of`204. X$! X$!`20N.B.`20This`20procedure`20produces`20improper`20results`20when`20applied V`20to`20a`20system X$!`20disk`20or`20any`20other`20disk`20with`20synonym`20directories.`20`20All V`20files`20in`20the X$!`20synonym`20directories`20are`20counted`20multiple`20times,`20which`20will V`20artificially X$!`20inflate`20the`20file`20counts. X$! X$!`20`20`20Written`201/07/93`20by: X$! X$!`20`20`20James`20J.`20Lellman X$!`20`20`20Digital`20Systems`20Consultants X$!`20`20`202340`20S.`20Arlington`20Hts`20Rd,`20Suite`20320 X$!`20`20`20Arlington`20Heights,`20IL`20`2060005 X$!`20`20`20(708)`20228-5000 X$! X$!___________________________________________________________________________ V X$!`20`20`20Modifications X$! X$!___________________________________________________________________________ V X$! X$`09SET`20NOON X$`09SET`20PROCESS/PRIV=BYPASS`09`09!`20We're`20going`20to`20size`20every`20fil Ve X$`09COMMA`20=`20"," X$`09SAY`20:==`20WRITE`20SYS$OUTPUT X$`09TRUE`20=`201`20.EQ.`201 X$`09FALSE`20=`201`20.EQ.`202 X$`09FORMAT`20=`20"!1AS!4SL!9SL(!3SL%)!9SL!7SL!7SL"`20!`20Used`20at`20end`20for V`20report X$! X$!`20`20`20This`20is`20a`20list`20of`20all`20known`20disk`20drive`20types`200 V`20-`2090`097-Jan-1993 X$! X$`09TYPES`20=`20"?00?,RK06,RK07,RP04,RP05,RP06,RM03,RP07,RP07HT,RL01,RL02," X$`09TYPES`20=`20TYPES`20+`20"RX02,RX04,RM80,TU58,RM05,RX01,ML11,RB02,RB80,RA80 V," X$`09TYPES`20=`20TYPES`20+`20"RA81,RA60,RZ01,RZF01,RD51,RX50,?27?,RD53,?29?,RA8 V2," X$`09TYPES`20=`20TYPES`20+`20"?31?,RD54,CRX50,?34?,RA73,RX33,RX18,RA70,RA90,?40 V?," X$`09TYPES`20=`20TYPES`20+`20"?41?,RX35,?43?,RF71,?45?,?46?,?47?,?48?,?49?,?50? V," X$`09TYPES`20=`20TYPES`20+`20"?51?,?52?,CDROM,?54?,RX23,RF31,RF72,?58?,?59?,?60 V?," X$`09TYPES`20=`20TYPES`20+`20"?61?,CDROM,?63?,RA92,STRIPE,?66?,?67?,?68?,?69?,? V70?," X$`09TYPES`20=`20TYPES`20+`20"?71?,?72?,?73?,?74?,?75?,?76?,RF73,?78?,RA72,?80? V," X$`09TYPES`20=`20TYPES`20+`20"RF35,?82?,?83?,?84?,?85?,?86?,?87?,?88?,?89?,?90? V" X$! X$`09DISK`20=`20P1 X$! X$START: X$! X$`09IF`20DISK`20.EQS.`20""`20THEN`20INQUIRE`20DISK`20"WHICH`20DISK?`20" X$`09IF`20DISK`20.EQS.`20""`20THEN`20EXIT X$! X$`09IF`20.NOT.`20F$GETDVI(DISK,"EXISTS") X$`09THEN X$`09`20`20`20SAY`20"""",DISK,"""","`20is`20not`20a`20valid`20device." X$`09`20`20`20DISK`20=`20"" X$`09`20`20`20GOTO`20START X$`09ENDIF X$! X$`09DISK`20=`20F$GETDVI(DISK,"DEVNAM") X$! X$`09IF`20F$GETDVI(DISK,"DEVCLASS")`20.NE.`201 X$`09THEN X$`09`20`20`20SAY`20DISK,"`20is`20not`20a`20valid`20disk`20device." X$`09`20`20`20DISK`20=`20"" X$`09`20`20`20GOTO`20START X$`09ENDIF X$! X$`09IF`20.NOT.`20F$GETDVI(DISK,"MNT") X$`09THEN X$`09`20`20`20SAY`20"""",DISK,"""","`20is`20not`20currently`20mounted." X$`09`20`20`20DISK`20=`20"" X$`09`20`20`20GOTO`20START X$`09ENDIF X$! X$`09TYPE`20=`20F$GETDVI(DISK,"DEVTYPE") X$`09MODEL`20=`20F$ELEMENT(TYPE,",",TYPES) X$`09CLUSTER`20=`20F$GETDVI(DISK,"CLUSTER") X$`09BLOCKS`20=`20F$GETDVI(DISK,"MAXBLOCK") X$`09UPPER_LIMIT`20=`20BLOCKS`20/`20100 X$`09IF`20UPPER_LIMIT`20.GT.`2065535`20THEN`20UPPER_LIMIT`20=`2065535 X$`09LOWER_LIMIT`20=`20(BLOCKS`20+`20(255*4096)`20-`201)`20/`20(255*4096) X$`09CYLINDER_SIZE`20=`20F$GETDVI(DISK,"SECTORS")`20*`20F$GETDVI(DISK,"TRACKS") V X$`09IF`20CYLINDER_SIZE`20.LT.`20UPPER_LIMIT`20THEN`20UPPER_LIMIT`20=`20CYLINDE VR_SIZE X$! X$`09SAY`20DISK,"`20is`20an`20",MODEL,",`20",BLOCKS,"`20blocks." X$`09SAY`20"The`20cluster`20size`20is`20currently`20",CLUSTER,"." X$! X$`09ALL_FILES`20=`20DISK`20+`20"`5B000000...`5D*.*;*" X$`09GOOD`20=`20"" X$`09F`20=`20LOWER_LIMIT`20-`201 X$! X$GEOMETRY: X$`09F`20=`20F`20+`201 X$`09IF`20(CYLINDER_SIZE/F)*F`20.EQ.`20CYLINDER_SIZE`20THEN`20GOOD`20=`20GOOD V`20+`20",''F'" X$`09IF`20F`20.LT.`20UPPER_LIMIT`20THEN`20GOTO`20GEOMETRY X$`09GOOD`20=`20GOOD`20-`20"," X$`09SAY`20"The`20disk`20geometry`20suggests`20cluster`20factors`20of:`20" X$`09SAY`20"(",GOOD,")" X$`09SAY`20"" X$! X$!`20`20Initialize`20counts X$! X$`09T`20=`200 X$`09FILE_COUNT`20=`200 X$`09DIR_COUNT`20=`200 X$`09LIST`20=`20"" X$`09NOTYET`20=`20TRUE X$! X$!`20`20`20Insert`20current`20cluster`20size`20into`20the`20list`20(if`20not V`20already`20present) X$!`20`20`20for`20comparison`20purposes. X$! X$! X$INIT: X$! X$`09F`20=`20F$ELEMENT(T,COMMA,GOOD) X$`09IF`20F`20.EQS.`20COMMA`20THEN`20GOTO`20ALMOST X$`20`20`20`20`20`20`20TB'F'`20=`200 X$`09CL'F'`20=`200 X$`09LE'F'`20=`200 X$`09IF`20NOTYET`20.AND.`20F`20.GE.`20CLUSTER X$`09THEN X$`09`20`20`20NOTYET`20=`20FALSE X$`09`20`20`20IF`20F`20.GT.`20CLUSTER X$`09`20`20`20THEN X$`09`20`20`20`20`20`20TB'CLUSTER'`20=`200 X$`09`20`20`20`20`20`20CL'CLUSTER'`20=`200 X$`09`20`20`20`20`20`20LE'CLUSTER'`20=`200 X$`09`20`20`20`20`20`20LIST`20=`20LIST`20+`20",''CLUSTER'" X$`09`20`20`20ENDIF X$`09ENDIF X$`09LIST`20=`20LIST`20+`20",''F'" X$`09T`20=`20T`20+`201 X$`09GOTO`20INIT X$! X$ALMOST: X$! X$`09LIST`20=`20LIST`20-`20COMMA X$! X$!`20`20`20Search`20through`20all`20the`20files X$! X$LOOP:`09FILE`20=`20F$SEARCH(ALL_FILES) X$`09IF`20FILE`20.EQS.`20""`20THEN`20GOTO`20DONE X$`09FILE_COUNT`20=`20FILE_COUNT`20+`201 X$`09IF`20F$PARSE(FILE,,,"TYPE")`20.EQS.`20".DIR"`20THEN`20DIR_COUNT`20=`20DIR_ VCOUNT`20+`201 X$`09SIZE`20=`20F$FILE_ATTRIBUTES(FILE,"EOF") X$`09T`20=`200 X$SUM:`09F`20=`20F$ELEMENT(T,COMMA,LIST) X$`09IF`20F`20.EQS.`20COMMA`20THEN`20GOTO`20LOOP X$`09IF`20TB'F'`20.GT.`20BLOCKS X$`09THEN X$`09`20`20`20LIST`20=`20LIST`20-`20",''F'" X$`09`20`20`20GOTO`20LOOP X$`09ENDIF X$`09CLUSTERS`20=`20(SIZE+F-1)`20/`20F X$`20`20`20`20`20`20`20TB'F'`20=`20TB'F'`20+`20(CLUSTERS`20*`20F) X$`09CL'F'`20=`20CL'F'`20+`20CLUSTERS X$`09IF`20SIZE`20.LE.`20F`20THEN`20LE'F'`20=`20LE'F'`20+`201 X$`09T`20=`20T`20+`201 X$`09GOTO`20SUM X$! X$DONE: X$! X$`09SAY`20FILE_COUNT,"`20files`20found." X$`09SAY`20DIR_COUNT,"`20directories`20found." X$`09SAY`20"`20`20`20`20`20`20`20`20BLOCKS`20`20`20`20`20`20`20`20`20`20`20CLUS VTERS`20`20`20`20`20FILES" X$`09SAY`20"`20`20`20CF`20`20`20IN`20USE`20`20PCT`20`20`20`20IN`20USE`20`20/FIL VE`20`20<=`20CF" X$`09SAY`20"" X$`09T`20=`200 X$! X$LIST: X$! X$`09F`20=`20F$ELEMENT(T,COMMA,LIST) X$`09IF`20F`20.EQS.`20COMMA`20THEN`20EXIT X$`09IF`20TB'F'`20.GT.`20BLOCKS`20THEN`20EXIT X$`09IF`20F`20.NE.`20CLUSTER X$`09THEN X$`09`20`20`20NOW`20=`20"`20" X$`09ELSE X$`09`20`20`20NOW`20=`20"*" X$`09ENDIF X$`09PCT`20=`20((TB'F'`20*`20100)`20+`20(BLOCKS/2))`20/`20BLOCKS X$`09AVERAGE`20=`20CL'F'`20/`20FILE_COUNT X$`09IN_USE`20=`20TB'F'`20/`20F X$`09SAY`20F$FAO(FORMAT,NOW,F$INTEGER(F),TB'F',PCT,IN_USE,AVERAGE,LE'F') X$`09T`20=`20T`20+`201 X$`09GOTO`20LIST $ call unpack RECLUSTER.COM;1 1868002295 "" 12 2 2 $ v=f$verify(v) $ exit