[BACK]Return to block.zero.ps CVS log [TXT][DIR] Up to [Development] / xfs-website.orig / design_docs / xfsdocs93_ps

File: [Development] / xfs-website.orig / design_docs / xfsdocs93_ps / block.zero.ps (download)

Revision 1.1, Wed Mar 29 22:55:48 2000 UTC (17 years, 7 months ago) by cattelan
Branch: MAIN
CVS Tags: HEAD

Add files with -kb flag

%!PS-Adobe-3.0
%%BoundingBox: (atend)
%%Pages: (atend)
%%PageOrder: (atend)
%%DocumentFonts: (atend)
%%Creator: Frame 5.0
%%DocumentData: Clean7Bit
%%EndComments
%%BeginProlog
%
% Frame ps_prolog 5.0, for use with Frame 5.0 products
% This ps_prolog file is Copyright (c) 1986-1995 Frame Technology
% Corporation.  All rights reserved.  This ps_prolog file may be
% freely copied and distributed in conjunction with documents created
% using FrameMaker, FrameMaker/SGML and FrameViewer as long as this 
% copyright notice is preserved.
%
% FrameMaker users specify the proper paper size for each print job in the
% "Print" dialog's "Printer Paper Size" "Width" and "Height~ fields.  If the
% printer that the PS file is sent to does not support the requested paper
% size, or if there is no paper tray of the proper size currently installed, 
% then the job will not be printed.  The following flag, if set to true, will
% cause the job to print on the default paper in such cases.
/FMAllowPaperSizeMismatch            false def
%
% Frame products normally print colors as their true color on a color printer
% or as shades of gray, based on luminance, on a black-and white printer. The
% following flag, if set to true, forces all non-white colors to print as pure
% black. This has no effect on bitmap images.
/FMPrintAllColorsAsBlack             false def
%
% Frame products can either set their own line screens or use a printer's 
% default settings. Three flags below control this separately for no 
% separations, spot separations and process separations. If a flag
% is true, then the default printer settings will not be changed. If it is
% false, Frame products will use their own settings from a table based on
% the printer's resolution.
/FMUseDefaultNoSeparationScreen      true  def
/FMUseDefaultSpotSeparationScreen    true  def
/FMUseDefaultProcessSeparationScreen false def
%
% For any given PostScript printer resolution, Frame products have two sets of 
% screen angles and frequencies for printing process separations, which are 
% recomended by Adobe. The following variable chooses the higher frequencies
% when set to true or the lower frequencies when set to false. This is only
% effective if the appropriate FMUseDefault...SeparationScreen flag is false.
/FMUseHighFrequencyScreens true def
%
% The following is a set of predefined optimal frequencies and angles for various
% common dpi settings. This is taken from "Advances in Color Separation Using
% PostScript Software Technology," from Adobe Systems (3/13/89 P.N. LPS 0043)
% and corrolated with information which is in various PPD (4.0) files.
%
% The "dpiranges" figure is the minimum dots per inch device resolution which
% can support this setting. The "low" and "high" values are controlled by the
% setting of the FMUseHighFrequencyScreens flag above. The "TDot" flags control
% the use of the "Yellow Triple Dot" feature whereby the frequency id divided by
% three, but the dot function is "trippled" giving a block of 3x3 dots per cell.
%
% PatFreq is a compromise pattern frequency for ps Level 2 printers which is close
% to the ideal WYSIWYG pattern frequency of 9 repetitions/inch but does not beat
% (too badly) against the screen frequencies of any separations for that DPI.
/dpiranges   [  2540    2400    1693     1270    1200     635      600      0      ] def
/CMLowFreqs  [ 100.402  94.8683 89.2289 100.402  94.8683  66.9349  63.2456 47.4342 ] def
/YLowFreqs   [  95.25   90.0    84.65    95.25   90.0     70.5556  66.6667 50.0    ] def
/KLowFreqs   [  89.8026 84.8528 79.8088  89.8026 84.8528  74.8355  70.7107 53.033  ] def
/CLowAngles  [  71.5651 71.5651 71.5651 71.5651  71.5651  71.5651  71.5651 71.5651 ] def
/MLowAngles  [  18.4349 18.4349 18.4349 18.4349  18.4349  18.4349  18.4349 18.4349 ] def
/YLowTDot    [  true    true    false    true    true     false    false   false   ] def
/CMHighFreqs [ 133.87  126.491 133.843  108.503 102.523  100.402   94.8683 63.2456 ] def
/YHighFreqs  [ 127.0   120.0   126.975  115.455 109.091   95.25    90.0    60.0    ] def
/KHighFreqs  [ 119.737 113.137 119.713  128.289 121.218   89.8026  84.8528 63.6395 ] def
/CHighAngles [  71.5651 71.5651 71.5651  70.0169 70.0169  71.5651  71.5651 71.5651 ] def
/MHighAngles [  18.4349 18.4349 18.4349  19.9831 19.9831  18.4349  18.4349 18.4349 ] def
/YHighTDot   [  false   false   true     false   false    true     true    false   ] def
/PatFreq     [	10.5833 10.0     9.4055  10.5833 10.0	  10.5833  10.0	   9.375   ] def
%
% PostScript Level 2 printers contain an "Accurate Screens" feature which can
% improve process separation rendering at the expense of compute time. This 
% flag is ignored by PostScript Level 1 printers.
/FMUseAcccurateScreens true def
%
% The following PostScript procedure defines the spot function that Frame
% products will use for process separations. You may un-comment-out one of
% the alternative functions below, or use your own.
%
% Dot function
/FMSpotFunction {abs exch abs 2 copy add 1 gt 
		{1 sub dup mul exch 1 sub dup mul add 1 sub }
		{dup mul exch dup mul add 1 exch sub }ifelse } def
%
% Line function
% /FMSpotFunction { pop } def
%
% Elipse function
% /FMSpotFunction { dup 5 mul 8 div mul exch dup mul exch add 
%		sqrt 1 exch sub } def
%
%
/FMversion (5.0) def 
/fMLevel1 /languagelevel where {pop languagelevel} {1} ifelse 2 lt def
/FMPColor
	fMLevel1 {
		false
		/colorimage where {pop pop true} if
	} {
		true
	} ifelse
def
/FrameDict 400 dict def 
systemdict /errordict known not {/errordict 10 dict def
		errordict /rangecheck {stop} put} if
% The readline in PS 23.0 doesn't recognize cr's as nl's on AppleTalk
FrameDict /tmprangecheck errordict /rangecheck get put 
errordict /rangecheck {FrameDict /bug true put} put 
FrameDict /bug false put 
mark 
% Some PS machines read past the CR, so keep the following 3 lines together!
currentfile 5 string readline
00
0000000000
cleartomark 
errordict /rangecheck FrameDict /tmprangecheck get put 
FrameDict /bug get { 
	/readline {
		/gstring exch def
		/gfile exch def
		/gindex 0 def
		{
			gfile read pop 
			dup 10 eq {exit} if 
			dup 13 eq {exit} if 
			gstring exch gindex exch put 
			/gindex gindex 1 add def 
		} loop
		pop 
		gstring 0 gindex getinterval true 
		} bind def
	} if
/FMshowpage /showpage load def
/FMquit /quit load def
/FMFAILURE { 
	dup = flush 
	FMshowpage 
	/Helvetica findfont 12 scalefont setfont
	72 200 moveto show
	72 220 moveto show
	FMshowpage 
	FMquit 
	} def 
/FMVERSION {
	FMversion ne {
		(Frame product version does not match ps_prolog!  Check installation;)
		(also check ~/fminit and ./fminit for old versions) FMFAILURE
		} if
	} def 
/FMBADEPSF { 
	(Adobe's PostScript Language Reference Manual, 2nd Edition, section H.2.4)
	(says your EPS file is not valid, as it calls X              )
	dup dup (X) search pop exch pop exch pop length 
	5 -1 roll 
	putinterval 
	FMFAILURE
	} def
/fmConcatProcs
	{
	/proc2 exch cvlit def/proc1 exch cvlit def/newproc proc1 length proc2 length add array def
	newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval newproc cvx
}def
FrameDict begin [
	/ALDsave
	/FMdicttop
	/FMoptop
	/FMpointsize
	/FMsaveobject
	/b
	/bitmapsave
	/blut
	/bpside
	/bs
	/bstring
	/bwidth
	/c
	/cf
	/cs
	/cynu
	/depth
	/edown
	/fh
	/fillvals
	/fw
	/fx
	/fy
	/g
	/gfile
	/gindex
	/grnt
	/gryt
	/gstring
	/height
	/hh
	/i
	/im
	/indx
	/is
	/k
	/kk
	/landscape
	/lb
	/len
	/llx
	/lly
	/m
	/magu
	/manualfeed
	/n
	/offbits
	/onbits
	/organgle
	/orgbangle
	/orgbfreq
	/orgbproc
	/orgbxfer
	/orgfreq
	/orggangle
	/orggfreq
	/orggproc
	/orggxfer
	/orgmatrix
	/orgproc
	/orgrangle
	/orgrfreq
	/orgrproc
	/orgrxfer
	/orgxfer
	/pagesave
	/paperheight
	/papersizedict
	/paperwidth
	/pos
	/pwid
	/r
	/rad
	/redt
	/sl
	/str
	/tran
	/u
	/urx
	/ury
	/val
	/width
	/width
	/ws
	/ww
	/x
	/x1
	/x2
	/xindex
	/xpoint
	/xscale
	/xx
	/y
	/y1
	/y2
	/yelu
	/yindex
	/ypoint
	/yscale
	/yy
] { 0 def } forall
/FmBD {bind def} bind def
systemdict /pdfmark known {
	/fMAcrobat true def
	
	/FmPD /pdfmark load def
	
	
	/FmPT /show load def
	
	
	currentdistillerparams /CoreDistVersion get 2000 ge {
	
		
		/FmPD2 /pdfmark load def
		
		
		
		
		
		/FmPA { mark exch /Dest exch 5 3 roll 
				/View [ /XYZ null 6 -2 roll FmDC exch pop null] /DEST FmPD 
		}FmBD
	} {
		
		/FmPD2 /cleartomark load def
		/FmPA {pop pop pop}FmBD
	} ifelse
} {
	
	/fMAcrobat false def
	/FmPD /cleartomark load def
	/FmPD2 /cleartomark load def
	/FmPT /pop load def
	/FmPA {pop pop pop}FmBD
} ifelse
/FmDC {
	transform fMDefaultMatrix itransform cvi exch cvi exch
}FmBD
/FmBx {
	dup 3 index lt {3 1 roll exch} if 
	1 index 4 index lt {4 -1 roll 3 1 roll exch 4 1 roll} if
}FmBD
/FMnone 0 def
/FMcyan 1 def
/FMmagenta 2 def
/FMyellow 3 def
/FMblack 4 def
/FMcustom 5 def
/fMNegative false def 
/FrameSepIs FMnone def 
/FrameSepBlack 0 def
/FrameSepYellow 0 def
/FrameSepMagenta 0 def
/FrameSepCyan 0 def
/FrameSepRed 1 def
/FrameSepGreen 1 def
/FrameSepBlue 1 def
/FrameCurGray 1 def
/FrameCurPat null def
/FrameCurColors [ 0 0 0 1 0 0 0 ] def 
/FrameColorEpsilon .001 def	
/eqepsilon {		
	sub dup 0 lt {neg} if
	FrameColorEpsilon le
} bind def
/FrameCmpColorsCMYK { 
	2 copy 0 get exch 0 get eqepsilon {
		2 copy 1 get exch 1 get eqepsilon {
			2 copy 2 get exch 2 get eqepsilon {
				3 get exch 3 get eqepsilon
			} {pop pop false} ifelse
		}{pop pop false} ifelse
	} {pop pop false} ifelse
} bind def
/FrameCmpColorsRGB { 
	2 copy 4 get exch 0 get eqepsilon {
		2 copy 5 get exch 1 get eqepsilon {
			6 get exch 2 get eqepsilon
		}{pop pop false} ifelse
	} {pop pop false} ifelse
} bind def
/RGBtoCMYK { 
	1 exch sub 
	3 1 roll 
	1 exch sub 
	3 1 roll 
	1 exch sub 
	3 1 roll 
	3 copy 
	2 copy 
	le { pop } { exch pop } ifelse 
	2 copy 
	le { pop } { exch pop } ifelse 
	dup dup dup 
	6 1 roll 
	4 1 roll 
	7 1 roll 
	sub 
	6 1 roll 
	sub 
	5 1 roll 
	sub 
	4 1 roll 
} bind def
/CMYKtoRGB { 
	dup dup 4 -1 roll add 						  
	5 1 roll 3 -1 roll add 						  
	4 1 roll add 								  
	1 exch sub dup 0 lt {pop 0} if 3 1 roll 	  
	1 exch sub dup 0 lt {pop 0} if exch 	      
	1 exch sub dup 0 lt {pop 0} if exch	  		  
} bind def
/FrameSepInit {
	1.0 RealSetgray
} bind def
/FrameSetSepColor { 
	/FrameSepBlue exch def
	/FrameSepGreen exch def
	/FrameSepRed exch def
	/FrameSepBlack exch def
	/FrameSepYellow exch def
	/FrameSepMagenta exch def
	/FrameSepCyan exch def
	/FrameSepIs FMcustom def
	setCurrentScreen	
} bind def
/FrameSetCyan {
	/FrameSepBlue 1.0 def
	/FrameSepGreen 1.0 def
	/FrameSepRed 0.0 def
	/FrameSepBlack 0.0 def
	/FrameSepYellow 0.0 def
	/FrameSepMagenta 0.0 def
	/FrameSepCyan 1.0 def
	/FrameSepIs FMcyan def
	setCurrentScreen	
} bind def
 
/FrameSetMagenta {
	/FrameSepBlue 1.0 def
	/FrameSepGreen 0.0 def
	/FrameSepRed 1.0 def
	/FrameSepBlack 0.0 def
	/FrameSepYellow 0.0 def
	/FrameSepMagenta 1.0 def
	/FrameSepCyan 0.0 def
	/FrameSepIs FMmagenta def
	setCurrentScreen
} bind def
 
/FrameSetYellow {
	/FrameSepBlue 0.0 def
	/FrameSepGreen 1.0 def
	/FrameSepRed 1.0 def
	/FrameSepBlack 0.0 def
	/FrameSepYellow 1.0 def
	/FrameSepMagenta 0.0 def
	/FrameSepCyan 0.0 def
	/FrameSepIs FMyellow def
	setCurrentScreen
} bind def
 
/FrameSetBlack {
	/FrameSepBlue 0.0 def
	/FrameSepGreen 0.0 def
	/FrameSepRed 0.0 def
	/FrameSepBlack 1.0 def
	/FrameSepYellow 0.0 def
	/FrameSepMagenta 0.0 def
	/FrameSepCyan 0.0 def
	/FrameSepIs FMblack def
	setCurrentScreen
} bind def
 
/FrameNoSep { 
	/FrameSepIs FMnone def
	setCurrentScreen
} bind def
/FrameSetSepColors { 
	FrameDict begin
	[ exch 1 add 1 roll ]
	/FrameSepColors  
	exch def end
	} bind def
/FrameColorInSepListCMYK { 
	FrameSepColors {  
       		exch dup 3 -1 roll 
       		FrameCmpColorsCMYK 
       		{ pop true exit } if
    	} forall 
	dup true ne {pop false} if
	} bind def
/FrameColorInSepListRGB { 
	FrameSepColors {  
       		exch dup 3 -1 roll 
       		FrameCmpColorsRGB 
       		{ pop true exit } if
    	} forall 
	dup true ne {pop false} if
	} bind def
/RealSetgray /setgray load def
/RealSetrgbcolor /setrgbcolor load def
/RealSethsbcolor /sethsbcolor load def
end 
/setgray { 
	FrameDict begin
	FrameSepIs FMnone eq
		{ RealSetgray } 
		{ 
		FrameSepIs FMblack eq 
			{ RealSetgray } 
			{ FrameSepIs FMcustom eq 
			  FrameSepRed 0 eq and
			  FrameSepGreen 0 eq and
			  FrameSepBlue 0 eq and {
			  	RealSetgray
			  } {
				1 RealSetgray pop 
			  } ifelse
			} ifelse
		} ifelse
	end
} bind def
/setrgbcolor { 
	FrameDict begin
	FrameSepIs FMnone eq
	{  RealSetrgbcolor }
	{
		3 copy [ 4 1 roll ] 
		FrameColorInSepListRGB
		{
				FrameSepBlue eq exch 
			 	FrameSepGreen eq and exch 
			 	FrameSepRed eq and
			 	{ 0 } { 1 } ifelse
		}
		{
			FMPColor {
				RealSetrgbcolor
				currentcmykcolor
			} {
				RGBtoCMYK
			} ifelse
			FrameSepIs FMblack eq
			{1.0 exch sub 4 1 roll pop pop pop} {
			FrameSepIs FMyellow eq
			{pop 1.0 exch sub 3 1 roll pop pop} {
			FrameSepIs FMmagenta eq
			{pop pop 1.0 exch sub exch pop } {
			FrameSepIs FMcyan eq
			{pop pop pop 1.0 exch sub } 
			{pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse 
		} ifelse
		RealSetgray
	} 
	ifelse
	end
} bind def
/sethsbcolor {
	FrameDict begin
	FrameSepIs FMnone eq 
	{ RealSethsbcolor } 
	{
		RealSethsbcolor 
		currentrgbcolor  
		setrgbcolor 
	} 
	ifelse
	end
} bind def
FrameDict begin
/setcmykcolor where {
	pop /RealSetcmykcolor /setcmykcolor load def
} {
	/RealSetcmykcolor {
		4 1 roll
		3 { 3 index add 0 max 1 min 1 exch sub 3 1 roll} repeat 
		RealSetrgbcolor pop
	} bind def
} ifelse
userdict /setcmykcolor { 
		FrameDict begin
		FrameSepIs FMnone eq
		{ RealSetcmykcolor } 
		{
			4 copy [ 5 1 roll ]
			FrameColorInSepListCMYK
			{
				FrameSepBlack eq exch 
				FrameSepYellow eq and exch 
				FrameSepMagenta eq and exch 
				FrameSepCyan eq and 
				{ 0 } { 1 } ifelse
			}
			{
				FrameSepIs FMblack eq
				{1.0 exch sub 4 1 roll pop pop pop} {
				FrameSepIs FMyellow eq
				{pop 1.0 exch sub 3 1 roll pop pop} {
				FrameSepIs FMmagenta eq
				{pop pop 1.0 exch sub exch pop } {
				FrameSepIs FMcyan eq
				{pop pop pop 1.0 exch sub } 
				{pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse 
			} ifelse
			RealSetgray
		}
		ifelse
		end
	} bind put
fMLevel1 { 
	
	
	
	/patScreenDict 7 dict dup begin
		<0f1e3c78f0e1c387> [ 45  { pop } {exch pop} 		.5   2 sqrt] FmBD
		<0f87c3e1f0783c1e> [ 135 { pop } {exch pop}			.5   2 sqrt] FmBD
		<cccccccccccccccc> [ 0   { pop } dup				.5   2	   ] FmBD
		<ffff0000ffff0000> [ 90  { pop } dup				.5   2	   ] FmBD
		<8142241818244281> [ 45  { 2 copy lt {exch} if pop}	dup .75  2 sqrt] FmBD
		<03060c183060c081> [ 45  { pop } {exch pop}			.875 2 sqrt] FmBD
		<8040201008040201> [ 135 { pop } {exch pop}			.875 2 sqrt] FmBD
	end def
} { 
	
	/patProcDict 5 dict dup begin
		<0f1e3c78f0e1c387> { 3 setlinewidth -1 -1 moveto 9 9 lineto stroke 
											4 -4 moveto 12 4 lineto stroke
											-4 4 moveto 4 12 lineto stroke} bind def
		<0f87c3e1f0783c1e> { 3 setlinewidth -1 9 moveto 9 -1 lineto stroke 
											-4 4 moveto 4 -4 lineto stroke
											4 12 moveto 12 4 lineto stroke} bind def
		<8142241818244281> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke
											-1 -1 moveto 9 9 lineto stroke } bind def
		<03060c183060c081> { 1 setlinewidth -1 -1 moveto 9 9 lineto stroke 
											4 -4 moveto 12 4 lineto stroke
											-4 4 moveto 4 12 lineto stroke} bind def
		<8040201008040201> { 1 setlinewidth -1 9 moveto 9 -1 lineto stroke 
											-4 4 moveto 4 -4 lineto stroke
											4 12 moveto 12 4 lineto stroke} bind def
	end def
	/patDict 15 dict dup begin
		/PatternType 1 def		
		/PaintType 2 def		
		/TilingType 3 def		
		/BBox [ 0 0 8 8 ] def 	
		/XStep 8 def			
		/YStep 8 def			
		/PaintProc {
			begin
			patProcDict bstring known {
				patProcDict bstring get exec
			} {
				8 8 true [1 0 0 -1 0 8] bstring imagemask
			} ifelse
			end
		} bind def
	end def
} ifelse
/combineColor {
    FrameSepIs FMnone eq
	{
		graymode fMLevel1 or not {
			
			[/Pattern [/DeviceCMYK]] setcolorspace
			FrameCurColors 0 4 getinterval aload pop FrameCurPat setcolor
		} {
			FrameCurColors 3 get 1.0 ge {
				FrameCurGray RealSetgray
			} {
				fMAcrobat not FMPColor graymode and and {
					0 1 3 { 
						FrameCurColors exch get
						1 FrameCurGray sub mul
					} for
					RealSetcmykcolor
				} {
					4 1 6 {
						FrameCurColors exch get
						graymode {
							1 exch sub 1 FrameCurGray sub mul 1 exch sub
						} {
							1.0 lt {FrameCurGray} {1} ifelse
						} ifelse
					} for
					RealSetrgbcolor
				} ifelse
			} ifelse
		} ifelse
	} { 
		FrameCurColors 0 4 getinterval aload
		FrameColorInSepListCMYK {
			FrameSepBlack eq exch 
			FrameSepYellow eq and exch 
			FrameSepMagenta eq and exch 
			FrameSepCyan eq and
			FrameSepIs FMcustom eq and
			{ FrameCurGray } { 1 } ifelse
		} {
			FrameSepIs FMblack eq
			{FrameCurGray 1.0 exch sub mul 1.0 exch sub 4 1 roll pop pop pop} {
			FrameSepIs FMyellow eq
			{pop FrameCurGray 1.0 exch sub mul 1.0 exch sub 3 1 roll pop pop} {
			FrameSepIs FMmagenta eq
			{pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub exch pop } {
			FrameSepIs FMcyan eq
			{pop pop pop FrameCurGray 1.0 exch sub mul 1.0 exch sub } 
			{pop pop pop pop 1} ifelse } ifelse } ifelse } ifelse 
		} ifelse
		graymode fMLevel1 or not {
			
			[/Pattern [/DeviceGray]] setcolorspace
			FrameCurPat setcolor
		} { 
			graymode not fMLevel1 and {
				
				dup 1 lt {pop FrameCurGray} if
			} if
			RealSetgray
		} ifelse
	} ifelse
} bind def
/savematrix {
	orgmatrix currentmatrix pop
	} bind def
/restorematrix {
	orgmatrix setmatrix
	} bind def
/fMDefaultMatrix matrix defaultmatrix def
/fMatrix2 matrix def
/dpi    72 0 fMDefaultMatrix dtransform
    dup mul exch   dup mul add   sqrt def
	
/freq dpi dup 72 div round dup 0 eq {pop 1} if 8 mul div def
/sangle 1 0 fMDefaultMatrix dtransform exch atan def
	sangle fMatrix2 rotate 
	fMDefaultMatrix fMatrix2 concatmatrix 
	dup 0 get /sflipx exch def
	    3 get /sflipy exch def
/screenIndex {
	0 1 dpiranges length 1 sub { dup dpiranges exch get 1 sub dpi le {exit} {pop} ifelse } for
} bind def
/getCyanScreen {
	FMUseHighFrequencyScreens { CHighAngles CMHighFreqs} {CLowAngles CMLowFreqs} ifelse
		screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load
} bind def
/getMagentaScreen {
	FMUseHighFrequencyScreens { MHighAngles CMHighFreqs } {MLowAngles CMLowFreqs} ifelse
		screenIndex dup 3 1 roll get 3 1 roll get /FMSpotFunction load
} bind def
/getYellowScreen {
	FMUseHighFrequencyScreens { YHighTDot YHighFreqs} { YLowTDot YLowFreqs } ifelse
		screenIndex dup 3 1 roll get 3 1 roll get { 3 div
			{2 { 1 add 2 div 3 mul dup floor sub 2 mul 1 sub exch} repeat
			FMSpotFunction } } {/FMSpotFunction load } ifelse
			0.0 exch
} bind def
/getBlackScreen  {
	FMUseHighFrequencyScreens { KHighFreqs } { KLowFreqs } ifelse
		screenIndex get 45.0 /FMSpotFunction load 
} bind def
/getSpotScreen {
	getBlackScreen
} bind def
/getCompositeScreen {
	getBlackScreen
} bind def
/FMSetScreen 
	fMLevel1 { /setscreen load 
	}{ {
		8 dict begin
		/HalftoneType 1 def
		/SpotFunction exch def
		/Angle exch def
		/Frequency exch def
		/AccurateScreens FMUseAcccurateScreens def
		currentdict end sethalftone
	} bind } ifelse
def
/setDefaultScreen {
	FMPColor {
		orgrxfer cvx orggxfer cvx orgbxfer cvx orgxfer cvx setcolortransfer
	}
	{
		orgxfer cvx settransfer
	} ifelse
	orgfreq organgle orgproc cvx setscreen
} bind def
/setCurrentScreen {
	FrameSepIs FMnone eq {
		FMUseDefaultNoSeparationScreen {
			setDefaultScreen
		} {
			getCompositeScreen FMSetScreen
		} ifelse
	} {
		FrameSepIs FMcustom eq {
			FMUseDefaultSpotSeparationScreen {
				setDefaultScreen
			} {
				getSpotScreen FMSetScreen
			} ifelse
		} {
			FMUseDefaultProcessSeparationScreen {
				setDefaultScreen
			} {
				FrameSepIs FMcyan eq {
					getCyanScreen FMSetScreen
				} {
					FrameSepIs FMmagenta eq {
						getMagentaScreen FMSetScreen
					} {
						FrameSepIs FMyellow eq {
							getYellowScreen FMSetScreen
						} {
							getBlackScreen FMSetScreen
						} ifelse
					} ifelse
				} ifelse
			} ifelse
		} ifelse
	} ifelse 
} bind def
end
	
/FMDOCUMENT { 
	array /FMfonts exch def 
	/#copies exch def
	FrameDict begin
	0 ne /manualfeed exch def
	/paperheight exch def
	/paperwidth exch def
	0 ne /fMNegative exch def 
	0 ne /edown exch def 
	/yscale exch def
	/xscale exch def
	fMLevel1 {
		manualfeed {setmanualfeed} if
		/FMdicttop countdictstack 1 add def 
		/FMoptop count def 
		setpapername 
		manualfeed {true} {papersize} ifelse 
		{manualpapersize} {false} ifelse 
		{desperatepapersize} {false} ifelse 
		{papersizefailure} if
		count -1 FMoptop {pop pop} for
		countdictstack -1 FMdicttop {pop end} for 
		}
		{2 dict
		 dup /PageSize [paperwidth paperheight] put
		 manualfeed {dup /ManualFeed manualfeed put} if
		 {setpagedevice} stopped {papersizefailure} if
		}
	ifelse 
	
	FMPColor {
		currentcolorscreen
			cvlit /orgproc exch def
				  /organgle exch def 
				  /orgfreq exch def
			cvlit /orgbproc exch def
				  /orgbangle exch def 
				  /orgbfreq exch def
			cvlit /orggproc exch def
				  /orggangle exch def 
				  /orggfreq exch def
			cvlit /orgrproc exch def
				  /orgrangle exch def 
				  /orgrfreq exch def
			currentcolortransfer 
			fMNegative {
				1 1 4 { 
					pop { 1 exch sub } fmConcatProcs 4 1 roll
				} for
				4 copy
				setcolortransfer
			} if
			cvlit /orgxfer exch def
			cvlit /orgbxfer exch def
			cvlit /orggxfer exch def
			cvlit /orgrxfer exch def
	} {
		currentscreen 
			cvlit /orgproc exch def
				  /organgle exch def 
				  /orgfreq exch def
				  
		currenttransfer 
		fMNegative {
			{ 1 exch sub } fmConcatProcs
			dup settransfer
		} if 
		cvlit /orgxfer exch def
	} ifelse
	end 
} def 
/FMBEGINPAGE { 
	FrameDict begin 
	/pagesave save def
	3.86 setmiterlimit
	/landscape exch 0 ne def
	landscape { 
		90 rotate 0 exch dup /pwid exch def neg translate pop 
	}{
		pop /pwid exch def
	} ifelse
	edown { [-1 0 0 1 pwid 0] concat } if
	0 0 moveto paperwidth 0 lineto paperwidth paperheight lineto 
	0 paperheight lineto 0 0 lineto 1 setgray fill
	xscale yscale scale
	/orgmatrix matrix def
	gsave 
} def 
/FMENDPAGE {
	grestore 
	pagesave restore
	end 
	showpage
	} def 
/FMFONTDEFINE { 
	FrameDict begin
	findfont 
	ReEncode 
	1 index exch 
	definefont 
	FMfonts 3 1 roll 
	put
	end 
	} def 
/FMFILLS {
	FrameDict begin dup
	array /fillvals exch def
	dict /patCache exch def
	end 
	} def 
/FMFILL {
	FrameDict begin
	 fillvals 3 1 roll put
	end 
	} def 
/FMNORMALIZEGRAPHICS { 
	newpath
	1 setlinewidth
	0 setlinecap
	0 0 0 sethsbcolor
	0 setgray 
	} bind def
/FMBEGINEPSF { 
	end 
	/FMEPSF save def 
	/showpage {} def 
% See Adobe's "PostScript Language Reference Manual, 2nd Edition", page 714.
% "...the following operators MUST NOT be used in an EPS file:" (emphasis ours)
	/banddevice {(banddevice) FMBADEPSF} def
	/clear {(clear) FMBADEPSF} def
	/cleardictstack {(cleardictstack) FMBADEPSF} def 
	/copypage {(copypage) FMBADEPSF} def
	/erasepage {(erasepage) FMBADEPSF} def
	/exitserver {(exitserver) FMBADEPSF} def
	/framedevice {(framedevice) FMBADEPSF} def
	/grestoreall {(grestoreall) FMBADEPSF} def
	/initclip {(initclip) FMBADEPSF} def
	/initgraphics {(initgraphics) FMBADEPSF} def
	/quit {(quit) FMBADEPSF} def
	/renderbands {(renderbands) FMBADEPSF} def
	/setglobal {(setglobal) FMBADEPSF} def
	/setpagedevice {(setpagedevice) FMBADEPSF} def
	/setshared {(setshared) FMBADEPSF} def
	/startjob {(startjob) FMBADEPSF} def
	/lettertray {(lettertray) FMBADEPSF} def
	/letter {(letter) FMBADEPSF} def
	/lettersmall {(lettersmall) FMBADEPSF} def
	/11x17tray {(11x17tray) FMBADEPSF} def
	/11x17 {(11x17) FMBADEPSF} def
	/ledgertray {(ledgertray) FMBADEPSF} def
	/ledger {(ledger) FMBADEPSF} def
	/legaltray {(legaltray) FMBADEPSF} def
	/legal {(legal) FMBADEPSF} def
	/statementtray {(statementtray) FMBADEPSF} def
	/statement {(statement) FMBADEPSF} def
	/executivetray {(executivetray) FMBADEPSF} def
	/executive {(executive) FMBADEPSF} def
	/a3tray {(a3tray) FMBADEPSF} def
	/a3 {(a3) FMBADEPSF} def
	/a4tray {(a4tray) FMBADEPSF} def
	/a4 {(a4) FMBADEPSF} def
	/a4small {(a4small) FMBADEPSF} def
	/b4tray {(b4tray) FMBADEPSF} def
	/b4 {(b4) FMBADEPSF} def
	/b5tray {(b5tray) FMBADEPSF} def
	/b5 {(b5) FMBADEPSF} def
	FMNORMALIZEGRAPHICS 
	[/fy /fx /fh /fw /ury /urx /lly /llx] {exch def} forall 
	fx fw 2 div add fy fh 2 div add  translate
	rotate
	fw 2 div neg fh 2 div neg translate
	fw urx llx sub div fh ury lly sub div scale 
	llx neg lly neg translate 
	/FMdicttop countdictstack 1 add def 
	/FMoptop count def 
	} bind def
/FMENDEPSF {
	count -1 FMoptop {pop pop} for 
	countdictstack -1 FMdicttop {pop end} for 
	FMEPSF restore
	FrameDict begin 
	} bind def
FrameDict begin 
/setmanualfeed {
%%BeginFeature *ManualFeed True
	 statusdict /manualfeed true put
%%EndFeature
	} bind def
/max {2 copy lt {exch} if pop} bind def
/min {2 copy gt {exch} if pop} bind def
/inch {72 mul} def
/pagedimen { 
	paperheight sub abs 16 lt exch 
	paperwidth sub abs 16 lt and
	{/papername exch def} {pop} ifelse
	} bind def
/setpapername { 
	/papersizedict 14 dict def 
	papersizedict begin
	/papername /unknown def 
		/Letter 8.5 inch 11.0 inch pagedimen
		/LetterSmall 7.68 inch 10.16 inch pagedimen
		/Tabloid 11.0 inch 17.0 inch pagedimen
		/Ledger 17.0 inch 11.0 inch pagedimen
		/Legal 8.5 inch 14.0 inch pagedimen
		/Statement 5.5 inch 8.5 inch pagedimen
		/Executive 7.5 inch 10.0 inch pagedimen
		/A3 11.69 inch 16.5 inch pagedimen
		/A4 8.26 inch 11.69 inch pagedimen
		/A4Small 7.47 inch 10.85 inch pagedimen
		/B4 10.125 inch 14.33 inch pagedimen
		/B5 7.16 inch 10.125 inch pagedimen
	end
	} bind def
/papersize {
	papersizedict begin
		/Letter {lettertray letter} def
		/LetterSmall {lettertray lettersmall} def
		/Tabloid {11x17tray 11x17} def
		/Ledger {ledgertray ledger} def
		/Legal {legaltray legal} def
		/Statement {statementtray statement} def
		/Executive {executivetray executive} def
		/A3 {a3tray a3} def
		/A4 {a4tray a4} def
		/A4Small {a4tray a4small} def
		/B4 {b4tray b4} def
		/B5 {b5tray b5} def
		/unknown {unknown} def
	papersizedict dup papername known {papername} {/unknown} ifelse get
	end
	statusdict begin stopped end 
	} bind def
/manualpapersize {
	papersizedict begin
		/Letter {letter} def
		/LetterSmall {lettersmall} def
		/Tabloid {11x17} def
		/Ledger {ledger} def
		/Legal {legal} def
		/Statement {statement} def
		/Executive {executive} def
		/A3 {a3} def
		/A4 {a4} def
		/A4Small {a4small} def
		/B4 {b4} def
		/B5 {b5} def
		/unknown {unknown} def
	papersizedict dup papername known {papername} {/unknown} ifelse get
	end
	stopped 
	} bind def
/desperatepapersize {
	statusdict /setpageparams known
		{
		paperwidth paperheight 0 1 
		statusdict begin
		{setpageparams} stopped 
		end
		} {true} ifelse 
	} bind def
/papersizefailure {
	FMAllowPaperSizeMismatch not
		{
(The requested paper size is not available in any currently-installed tray)
(Edit the PS file to "FMAllowPaperSizeMismatch true" to use default tray)
		 FMFAILURE } if
	} def
/DiacriticEncoding [
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/.notdef /.notdef /.notdef /.notdef /space /exclam /quotedbl
/numbersign /dollar /percent /ampersand /quotesingle /parenleft
/parenright /asterisk /plus /comma /hyphen /period /slash /zero /one
/two /three /four /five /six /seven /eight /nine /colon /semicolon
/less /equal /greater /question /at /A /B /C /D /E /F /G /H /I /J /K
/L /M /N /O /P /Q /R /S /T /U /V /W /X /Y /Z /bracketleft /backslash
/bracketright /asciicircum /underscore /grave /a /b /c /d /e /f /g /h
/i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /braceleft /bar
/braceright /asciitilde /.notdef /Adieresis /Aring /Ccedilla /Eacute
/Ntilde /Odieresis /Udieresis /aacute /agrave /acircumflex /adieresis
/atilde /aring /ccedilla /eacute /egrave /ecircumflex /edieresis
/iacute /igrave /icircumflex /idieresis /ntilde /oacute /ograve
/ocircumflex /odieresis /otilde /uacute /ugrave /ucircumflex
/udieresis /dagger /.notdef /cent /sterling /section /bullet
/paragraph /germandbls /registered /copyright /trademark /acute
/dieresis /.notdef /AE /Oslash /.notdef /.notdef /.notdef /.notdef
/yen /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
/ordfeminine /ordmasculine /.notdef /ae /oslash /questiondown
/exclamdown /logicalnot /.notdef /florin /.notdef /.notdef
/guillemotleft /guillemotright /ellipsis /.notdef /Agrave /Atilde
/Otilde /OE /oe /endash /emdash /quotedblleft /quotedblright
/quoteleft /quoteright /.notdef /.notdef /ydieresis /Ydieresis
/fraction /currency /guilsinglleft /guilsinglright /fi /fl /daggerdbl
/periodcentered /quotesinglbase /quotedblbase /perthousand
/Acircumflex /Ecircumflex /Aacute /Edieresis /Egrave /Iacute
/Icircumflex /Idieresis /Igrave /Oacute /Ocircumflex /.notdef /Ograve
/Uacute /Ucircumflex /Ugrave /dotlessi /circumflex /tilde /macron
/breve /dotaccent /ring /cedilla /hungarumlaut /ogonek /caron
] def
/ReEncode { 
	dup 
	length 
	dict begin 
	{
	1 index /FID ne 
		{def} 
		{pop pop} ifelse 
	} forall 
	0 eq {/Encoding DiacriticEncoding def} if 
	currentdict 
	end 
	} bind def
FMPColor 
	
	{
	/BEGINBITMAPCOLOR { 
		BITMAPCOLOR} def
	/BEGINBITMAPCOLORc { 
		BITMAPCOLORc} def
	/BEGINBITMAPTRUECOLOR { 
		BITMAPTRUECOLOR } def
	/BEGINBITMAPTRUECOLORc { 
		BITMAPTRUECOLORc } def
	/BEGINBITMAPCMYK { 
		BITMAPCMYK } def
	/BEGINBITMAPCMYKc { 
		BITMAPCMYKc } def
	}
	
	{
	/BEGINBITMAPCOLOR { 
		BITMAPGRAY} def
	/BEGINBITMAPCOLORc { 
		BITMAPGRAYc} def
	/BEGINBITMAPTRUECOLOR { 
		BITMAPTRUEGRAY } def
	/BEGINBITMAPTRUECOLORc { 
		BITMAPTRUEGRAYc } def
	/BEGINBITMAPCMYK { 
		BITMAPCMYKGRAY } def
	/BEGINBITMAPCMYKc { 
		BITMAPCMYKGRAYc } def
	}
ifelse
/K { 
	FMPrintAllColorsAsBlack {
		dup 1 eq 2 index 1 eq and 3 index 1 eq and not
			{7 {pop} repeat 0 0 0 1 0 0 0} if
	} if 
	FrameCurColors astore 
	pop combineColor
} bind def
/graymode true def
fMLevel1 {
	/fmGetFlip {
		fMatrix2 exch get mul 0 lt { -1 } { 1 } ifelse
	} FmBD
} if
/setPatternMode {
	fMLevel1 {
		2 index patScreenDict exch known {
			pop pop
			patScreenDict exch get aload pop 
			freq 								
			mul									
			5 2 roll							
			fMatrix2 currentmatrix 1 get 0 ne {
				3 -1 roll 90 add 3 1 roll 		
				sflipx 1 fmGetFlip sflipy 2 fmGetFlip neg mul
			} {  								
				sflipx 0 fmGetFlip sflipy 3 fmGetFlip mul 
			} ifelse
			0 lt {exch pop} {pop} ifelse 		
			fMNegative { 
				{neg} fmConcatProcs 			
			} if
			bind
			
			
			
			systemdict /setscreen get exec		
			/FrameCurGray exch def
		} {
			/bwidth  exch def
			/bpside  exch def
			/bstring exch def
			/onbits 0 def  /offbits 0 def
			freq sangle landscape {90 add} if 
				{/ypoint exch def
				 /xpoint exch def
				 /xindex xpoint 1 add 2 div bpside mul cvi def
				 /yindex ypoint 1 add 2 div bpside mul cvi def
				 bstring yindex bwidth mul xindex 8 idiv add get
				 1 7 xindex 8 mod sub bitshift and 0 ne fMNegative {not} if
				 {/onbits  onbits  1 add def 1}
				 {/offbits offbits 1 add def 0}
				 ifelse
				}
				setscreen
			offbits offbits onbits add div fMNegative {1.0 exch sub} if
			/FrameCurGray exch def
		} ifelse
	} { 
		pop pop
		dup patCache exch known {
			patCache exch get
		} { 
			dup
			patDict /bstring 3 -1 roll put
			patDict 
			9 PatFreq screenIndex get div dup matrix scale
			makepattern
			dup 
			patCache 4 -1 roll 3 -1 roll put
		} ifelse
		/FrameCurGray 0 def
		/FrameCurPat exch def
	} ifelse
	/graymode false def
	combineColor
} bind def
/setGrayScaleMode {
	graymode not {
		/graymode true def
		fMLevel1 {
			setCurrentScreen
		} if
	} if
	/FrameCurGray exch def
	combineColor
} bind def
/normalize {
	transform round exch round exch itransform
	} bind def
/dnormalize {
	dtransform round exch round exch idtransform
	} bind def
/lnormalize { 
	0 dtransform exch cvi 2 idiv 2 mul 1 add exch idtransform pop
	} bind def
/H { 
	lnormalize setlinewidth
	} bind def
/Z {
	setlinecap
	} bind def
	
/PFill {
	graymode fMLevel1 or not {
		gsave 1 setgray eofill grestore
	} if
} bind def
/PStroke {
	graymode fMLevel1 or not {
		gsave 1 setgray stroke grestore
	} if
	stroke
} bind def
/X { 
	fillvals exch get
	dup type /stringtype eq
	{8 1 setPatternMode} 
	{setGrayScaleMode}
	ifelse
	} bind def
/V { 
	PFill gsave eofill grestore
	} bind def
/Vclip {
	clip
	} bind def
/Vstrk {
	currentlinewidth exch setlinewidth PStroke setlinewidth
	} bind def
/N { 
	PStroke
	} bind def
/Nclip {
	strokepath clip newpath
	} bind def
/Nstrk {
	currentlinewidth exch setlinewidth PStroke setlinewidth
	} bind def
/M {newpath moveto} bind def
/E {lineto} bind def
/D {curveto} bind def
/O {closepath} bind def
/L { 
 	/n exch def
	newpath
	normalize
	moveto 
	2 1 n {pop normalize lineto} for
	} bind def
/Y { 
	L 
	closepath
	} bind def
/R { 
	/y2 exch def
	/x2 exch def
	/y1 exch def
	/x1 exch def
	x1 y1
	x2 y1
	x2 y2
	x1 y2
	4 Y 
	} bind def
/rarc 
	{rad 
	 arcto
	} bind def
/RR { 
	/rad exch def
	normalize
	/y2 exch def
	/x2 exch def
	normalize
	/y1 exch def
	/x1 exch def
	mark
	newpath
	{
	x1 y1 rad add moveto
	x1 y2 x2 y2 rarc
	x2 y2 x2 y1 rarc
	x2 y1 x1 y1 rarc
	x1 y1 x1 y2 rarc
	closepath
	} stopped {x1 y1 x2 y2 R} if 
	cleartomark
	} bind def
/RRR { 
	/rad exch def
	normalize /y4 exch def /x4 exch def
	normalize /y3 exch def /x3 exch def
	normalize /y2 exch def /x2 exch def
	normalize /y1 exch def /x1 exch def
	newpath
	normalize moveto 
	mark
	{
	x2 y2 x3 y3 rarc
	x3 y3 x4 y4 rarc
	x4 y4 x1 y1 rarc
	x1 y1 x2 y2 rarc
	closepath
	} stopped
	 {x1 y1 x2 y2 x3 y3 x4 y4 newpath moveto lineto lineto lineto closepath} if
	cleartomark
	} bind def
/C { 
	grestore
	gsave
	R 
	clip
	setCurrentScreen
} bind def
/CP { 
	grestore
	gsave
	Y 
	clip
	setCurrentScreen
} bind def
/F { 
	FMfonts exch get
	FMpointsize scalefont
	setfont
	} bind def
/Q { 
	/FMpointsize exch def
	F 
	} bind def
/T { 
	moveto show
	} bind def
/RF { 
	rotate
	0 ne {-1 1 scale} if
	} bind def
/TF { 
	gsave
	moveto 
	RF
	show
	grestore
	} bind def
/P { 
	moveto
	0 32 3 2 roll widthshow
	} bind def
/PF { 
	gsave
	moveto 
	RF
	0 32 3 2 roll widthshow
	grestore
	} bind def
/S { 
	moveto
	0 exch ashow
	} bind def
/SF { 
	gsave
	moveto
	RF
	0 exch ashow
	grestore
	} bind def
/B { 
	moveto
	0 32 4 2 roll 0 exch awidthshow
	} bind def
/BF { 
	gsave
	moveto
	RF
	0 32 4 2 roll 0 exch awidthshow
	grestore
	} bind def
/G { 
	gsave
	newpath
	normalize translate 0.0 0.0 moveto 
	dnormalize scale 
	0.0 0.0 1.0 5 3 roll arc 
	closepath 
	PFill fill
	grestore
	} bind def
/Gstrk {
	savematrix
    newpath
    2 index 2 div add exch 3 index 2 div sub exch 
    normalize 2 index 2 div sub exch 3 index 2 div add exch 
    translate
    scale 
    0.0 0.0 1.0 5 3 roll arc 
    restorematrix
    currentlinewidth exch setlinewidth PStroke setlinewidth
    } bind def
/Gclip { 
	newpath
	savematrix
	normalize translate 0.0 0.0 moveto 
	dnormalize scale 
	0.0 0.0 1.0 5 3 roll arc 
	closepath 
	clip newpath
	restorematrix
	} bind def
/GG { 
	gsave
	newpath
	normalize translate 0.0 0.0 moveto 
	rotate 
	dnormalize scale 
	0.0 0.0 1.0 5 3 roll arc 
	closepath
	PFill
	fill
	grestore
	} bind def
/GGclip { 
	savematrix
	newpath
    normalize translate 0.0 0.0 moveto 
    rotate 
    dnormalize scale 
    0.0 0.0 1.0 5 3 roll arc 
    closepath
	clip newpath
	restorematrix
	} bind def
/GGstrk { 
	savematrix
    newpath
    normalize translate 0.0 0.0 moveto 
    rotate 
    dnormalize scale 
    0.0 0.0 1.0 5 3 roll arc 
    closepath 
	restorematrix
    currentlinewidth exch setlinewidth PStroke setlinewidth
	} bind def
/A { 
	gsave
	savematrix
	newpath
	2 index 2 div add exch 3 index 2 div sub exch 
	normalize 2 index 2 div sub exch 3 index 2 div add exch 
	translate 
	scale 
	0.0 0.0 1.0 5 3 roll arc 
	restorematrix
	PStroke
	grestore
	} bind def
/Aclip {
	newpath
	savematrix
	normalize translate 0.0 0.0 moveto 
	dnormalize scale 
	0.0 0.0 1.0 5 3 roll arc 
	closepath 
	strokepath clip newpath
	restorematrix
} bind def
/Astrk {
	Gstrk
} bind def
/AA { 
	gsave
	savematrix
	newpath
	
	3 index 2 div add exch 4 index 2 div sub exch 
	
	normalize 3 index 2 div sub exch 4 index 2 div add exch
	translate 
	rotate 
	scale 
	0.0 0.0 1.0 5 3 roll arc 
	restorematrix
	PStroke
	grestore
	} bind def
/AAclip {
	savematrix
	newpath
    normalize translate 0.0 0.0 moveto 
    rotate 
    dnormalize scale 
    0.0 0.0 1.0 5 3 roll arc 
    closepath
	strokepath clip newpath
	restorematrix
} bind def
/AAstrk {
	GGstrk
} bind def
/BEGINPRINTCODE { 
	/FMdicttop countdictstack 1 add def 
	/FMoptop count 7 sub def 
	/FMsaveobject save def
	userdict begin 
	/showpage {} def 
	FMNORMALIZEGRAPHICS 
	3 index neg 3 index neg translate
	} bind def
/ENDPRINTCODE {
	count -1 FMoptop {pop pop} for 
	countdictstack -1 FMdicttop {pop end} for 
	FMsaveobject restore 
	} bind def
/gn { 
	0 
	{	46 mul 
		cf read pop 
		32 sub 
		dup 46 lt {exit} if 
		46 sub add 
		} loop
	add 
	} bind def
/cfs { 
	/str sl string def 
	0 1 sl 1 sub {str exch val put} for 
	str def 
	} bind def
/ic [ 
	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
	0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0223
	0
	{0 hx} {1 hx} {2 hx} {3 hx} {4 hx} {5 hx} {6 hx} {7 hx} {8 hx} {9 hx}
	{10 hx} {11 hx} {12 hx} {13 hx} {14 hx} {15 hx} {16 hx} {17 hx} {18 hx}
	{19 hx} {gn hx} {0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12}
	{13} {14} {15} {16} {17} {18} {19} {gn} {0 wh} {1 wh} {2 wh} {3 wh}
	{4 wh} {5 wh} {6 wh} {7 wh} {8 wh} {9 wh} {10 wh} {11 wh} {12 wh}
	{13 wh} {14 wh} {gn wh} {0 bl} {1 bl} {2 bl} {3 bl} {4 bl} {5 bl} {6 bl}
	{7 bl} {8 bl} {9 bl} {10 bl} {11 bl} {12 bl} {13 bl} {14 bl} {gn bl}
	{0 fl} {1 fl} {2 fl} {3 fl} {4 fl} {5 fl} {6 fl} {7 fl} {8 fl} {9 fl}
	{10 fl} {11 fl} {12 fl} {13 fl} {14 fl} {gn fl}
	] def
/ms { 
	/sl exch def 
	/val 255 def 
	/ws cfs 
	/im cfs 
	/val 0 def 
	/bs cfs 
	/cs cfs 
	} bind def
400 ms 
/ip { 
	is 
	0 
	cf cs readline pop 
	{	ic exch get exec 
		add 
		} forall 
	pop 
	
	} bind def
/rip { 
	   
	  
	  bis ris copy pop 
      is
      0
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop 
	  ris gis copy pop 
	  dup is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop
	  gis bis copy pop 
	  dup add is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
      pop 
      
      } bind def
/rip4 { 
	   
	  
	  kis cis copy pop 
      is
      0
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop 
	  cis mis copy pop 
	  dup is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop
	  mis yis copy pop 
	  dup dup add is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
	  pop pop
	  yis kis copy pop 
	  3 mul is exch 
	  
      cf cs readline pop 
      {       ic exch get exec 
              add 
              } forall 
      pop 
      
      } bind def
/wh { 
	/len exch def 
	/pos exch def 
	ws 0 len getinterval im pos len getinterval copy pop
	pos len 
	} bind def
/bl { 
	/len exch def 
	/pos exch def 
	bs 0 len getinterval im pos len getinterval copy pop
	pos len 
	} bind def
/s1 1 string def
/fl { 
	/len exch def 
	/pos exch def 
	/val cf s1 readhexstring pop 0 get def
	pos 1 pos len add 1 sub {im exch val put} for
	pos len 
	} bind def
/hx { 
	3 copy getinterval 
	cf exch readhexstring pop pop 
	} bind def
/wbytes { 
      dup dup
      8 gt { pop 8 idiv mul }
      { 8 eq {pop} {1 eq {7 add 8 idiv} {3 add 4 idiv} ifelse} ifelse } ifelse
	} bind def
/BEGINBITMAPBWc { 
	1 {} COMMONBITMAPc
	} bind def
/BEGINBITMAPGRAYc { 
	8 {} COMMONBITMAPc
	} bind def
/BEGINBITMAP2BITc { 
	2 {} COMMONBITMAPc
	} bind def
/COMMONBITMAPc { 
		 
	/cvtProc exch def
	/depth exch def
	gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
	cvtProc                
	/is im 0 lb getinterval def 
	ws 0 lb getinterval is copy pop 
	/cf currentfile def 
	width height depth [width 0 0 height neg 0 height] 
	{ip} image 
	bitmapsave restore 
	grestore
	} bind def
/BEGINBITMAPBW { 
	1 {} COMMONBITMAP
	} bind def
/BEGINBITMAPGRAY { 
	8 {} COMMONBITMAP
	} bind def
/BEGINBITMAP2BIT { 
	2 {} COMMONBITMAP
	} bind def
/COMMONBITMAP { 
	/cvtProc exch def
	/depth exch def
	gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/bitmapsave save def 
	cvtProc              
	/is width depth wbytes string def
	/cf currentfile def 
	width height depth [width 0 0 height neg 0 height] 
	{cf is readhexstring pop} image
	bitmapsave restore 
	grestore
	} bind def
/ngrayt 256 array def
/nredt 256 array def
/nbluet 256 array def
/ngreent 256 array def
fMLevel1 {
/colorsetup {
	currentcolortransfer
	/gryt exch def
	/blut exch def
	/grnt exch def
	/redt exch def
	0 1 255 {
		/indx exch def
		/cynu 1 red indx get 255 div sub def
		/magu 1 green indx get 255 div sub def
		/yelu 1 blue indx get 255 div sub def
		/kk cynu magu min yelu min def
		/u kk currentundercolorremoval exec def
%		/u 0 def
		nredt indx 1 0 cynu u sub max sub redt exec put
		ngreent indx 1 0 magu u sub max sub grnt exec put
		nbluet indx 1 0 yelu u sub max sub blut exec put
		ngrayt indx 1 kk currentblackgeneration exec sub gryt exec put
	} for
	{255 mul cvi nredt exch get}
	{255 mul cvi ngreent exch get}
	{255 mul cvi nbluet exch get}
	{255 mul cvi ngrayt exch get}
	setcolortransfer
	{pop 0} setundercolorremoval
	{} setblackgeneration
	} bind def
}
{
/colorSetup2 {
	[ /Indexed /DeviceRGB 255 
		{dup red exch get 255 div 
		 exch dup green exch get 255 div 
		 exch blue exch get 255 div}
	] setcolorspace
} bind def
} ifelse
/fakecolorsetup {
	/tran 256 string def
	0 1 255 {/indx exch def 
		tran indx
		red indx get 77 mul
		green indx get 151 mul
		blue indx get 28 mul
		add add 256 idiv put} for
	currenttransfer
	{255 mul cvi tran exch get 255.0 div}
	exch fmConcatProcs settransfer
} bind def
/BITMAPCOLOR { 
	/depth 8 def
	gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/bitmapsave save def
	fMLevel1 {	
		colorsetup
		/is width depth wbytes string def
		/cf currentfile def 
		width height depth [width 0 0 height neg 0 height] 
		{cf is readhexstring pop} {is} {is} true 3 colorimage 
	} {
		colorSetup2
		/is width depth wbytes string def
		/cf currentfile def 
		7 dict dup begin
			/ImageType 1 def
			/Width width def
			/Height height def
			/ImageMatrix [width 0 0 height neg 0 height] def
			/DataSource {cf is readhexstring pop} bind def
			/BitsPerComponent depth def
			/Decode [0 255] def
		end image	
	} ifelse
	bitmapsave restore 
	grestore
	} bind def
/BITMAPCOLORc { 
	/depth 8 def
	gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
	fMLevel1 {	
		colorsetup
		/is im 0 lb getinterval def 
		ws 0 lb getinterval is copy pop 
		/cf currentfile def 
		width height depth [width 0 0 height neg 0 height] 
		{ip} {is} {is} true 3 colorimage
	} {
		colorSetup2
		/is im 0 lb getinterval def 
		ws 0 lb getinterval is copy pop 
		/cf currentfile def 
		7 dict dup begin
			/ImageType 1 def
			/Width width def
			/Height height def
			/ImageMatrix [width 0 0 height neg 0 height] def
			/DataSource {ip} bind def
			/BitsPerComponent depth def
			/Decode [0 255] def
		end image	
	} ifelse
	bitmapsave restore 
	grestore
	} bind def
/BITMAPTRUECOLORc { 
	/depth 24 def
        gsave
 	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
        
	/is im 0 lb getinterval def	
	/ris im 0 width getinterval def	
	/gis im width width getinterval def	
	/bis im width 2 mul width getinterval def 
        
	ws 0 lb getinterval is copy pop 
	/cf currentfile def 
	width height 8 [width 0 0 height neg 0 height] 
	{width rip pop ris} {gis} {bis} true 3 colorimage
	bitmapsave restore 
	grestore
	} bind def
/BITMAPCMYKc { 
	/depth 32 def
        gsave
 	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
	/bitmapsave save def 
        
	/is im 0 lb getinterval def	
	/cis im 0 width getinterval def	
	/mis im width width getinterval def	
	/yis im width 2 mul width getinterval def 
	/kis im width 3 mul width getinterval def 
        
	ws 0 lb getinterval is copy pop 
	/cf currentfile def 
	width height 8 [width 0 0 height neg 0 height] 
	{width rip4 pop cis} {mis} {yis} {kis} true 4 colorimage
	bitmapsave restore 
	grestore
	} bind def
/BITMAPTRUECOLOR { 
        gsave
		
		3 index 2 div add exch	
		4 index 2 div add exch	
		translate		
		rotate			
		1 index 2 div neg	
		1 index 2 div neg	
		translate		
		scale			
		/height exch def /width exch def
        /bitmapsave save def 
        /is width string def
        /gis width string def
        /bis width string def
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        { cf is readhexstring pop } 
        { cf gis readhexstring pop } 
        { cf bis readhexstring pop } 
        true 3 colorimage 
        bitmapsave restore 
        grestore
        } bind def
/BITMAPCMYK { 
        gsave
		
		3 index 2 div add exch	
		4 index 2 div add exch	
		translate		
		rotate			
		1 index 2 div neg	
		1 index 2 div neg	
		translate		
		scale			
		/height exch def /width exch def
        /bitmapsave save def 
        /is width string def
        /mis width string def
        /yis width string def
        /kis width string def
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        { cf is readhexstring pop } 
        { cf mis readhexstring pop } 
        { cf yis readhexstring pop } 
        { cf kis readhexstring pop } 
        true 4 colorimage 
        bitmapsave restore 
        grestore
        } bind def
/BITMAPTRUEGRAYc { 
	/depth 24 def
        gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
        /bitmapsave save def 
        
	/is im 0 lb getinterval def	
	/ris im 0 width getinterval def	
	/gis im width width getinterval def	
	/bis im width 2 mul width getinterval def 
        ws 0 lb getinterval is copy pop 
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        {width rip pop ris gis bis width gray} image
        bitmapsave restore 
        grestore
        } bind def
/BITMAPCMYKGRAYc { 
	/depth 32 def
        gsave
	
	3 index 2 div add exch	
	4 index 2 div add exch	
	translate		
	rotate			
	1 index 2 div neg	
	1 index 2 div neg	
	translate		
	scale			
	/height exch def /width exch def
	/lb width depth wbytes def 
	sl lb lt {lb ms} if 
        /bitmapsave save def 
        
	/is im 0 lb getinterval def	
	/cis im 0 width getinterval def	
	/mis im width width getinterval def	
	/yis im width 2 mul width getinterval def 
	/kis im width 3 mul width getinterval def 
        ws 0 lb getinterval is copy pop 
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        {width rip pop cis mis yis kis width cgray} image
        bitmapsave restore 
        grestore
        } bind def
/cgray { 
        /ww exch def
        /k exch def
        /y exch def
        /m exch def
        /c exch def
        0 1 ww 1 sub { /i exch def c i get m i get y i get k i get CMYKtoRGB
				.144 mul 3 1 roll .587 mul 3 1 roll .299 mul add add
				c i 3 -1 roll floor cvi put } for
        c
 		} bind def
/gray { 
        /ww exch def
        /b exch def
        /g exch def
        /r exch def
        0 1 ww 1 sub { /i exch def r i get .299 mul g i get .587 mul
			b i get .114 mul add add r i 3 -1 roll floor cvi put } for
        r
        } bind def
/BITMAPTRUEGRAY { 
        gsave
		
		3 index 2 div add exch	
		4 index 2 div add exch	
		translate		
		rotate			
		1 index 2 div neg	
		1 index 2 div neg	
		translate		
		scale			
		/height exch def /width exch def
        /bitmapsave save def 
        /is width string def
        /gis width string def
        /bis width string def
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        { cf is readhexstring pop 
          cf gis readhexstring pop 
          cf bis readhexstring pop width gray}  image
        bitmapsave restore 
        grestore
        } bind def
/BITMAPCMYKGRAY { 
        gsave
		
		3 index 2 div add exch	
		4 index 2 div add exch	
		translate		
		rotate			
		1 index 2 div neg	
		1 index 2 div neg	
		translate		
		scale			
		/height exch def /width exch def
        /bitmapsave save def 
        /is width string def
        /yis width string def
        /mis width string def
        /kis width string def
        /cf currentfile def 
        width height 8 [width 0 0 height neg 0 height] 
        { cf is readhexstring pop 
          cf mis readhexstring pop 
          cf yis readhexstring pop 
          cf kis readhexstring pop width cgray}  image
        bitmapsave restore 
        grestore
        } bind def
/BITMAPGRAY { 
	8 {fakecolorsetup} COMMONBITMAP
	} bind def
/BITMAPGRAYc { 
	8 {fakecolorsetup} COMMONBITMAPc
	} bind def
/ENDBITMAP {
	} bind def
end 
	/ALDmatrix matrix def ALDmatrix currentmatrix pop
/StartALD {
	/ALDsave save def
	 savematrix
	 ALDmatrix setmatrix
	} bind def
/InALD {
	 restorematrix
	} bind def
/DoneALD {
	 ALDsave restore
	} bind def
/I { setdash } bind def
/J { [] 0 setdash } bind def
%%EndProlog
%%BeginSetup
(5.0) FMVERSION
1 1 0 0 612 792 0 1 7 FMDOCUMENT
0 0 /Palatino-Roman FMFONTDEFINE
1 0 /Times-Roman FMFONTDEFINE
2 0 /Times-Bold FMFONTDEFINE
3 0 /Courier-Bold FMFONTDEFINE
32 FMFILLS
0 0 FMFILL
1 0.1 FMFILL
2 0.3 FMFILL
3 0.5 FMFILL
4 0.7 FMFILL
5 0.9 FMFILL
6 0.97 FMFILL
7 1 FMFILL
8 <0f1e3c78f0e1c387> FMFILL
9 <0f87c3e1f0783c1e> FMFILL
10 <cccccccccccccccc> FMFILL
11 <ffff0000ffff0000> FMFILL
12 <8142241818244281> FMFILL
13 <03060c183060c081> FMFILL
14 <8040201008040201> FMFILL
16 1 FMFILL
17 0.9 FMFILL
18 0.7 FMFILL
19 0.5 FMFILL
20 0.3 FMFILL
21 0.1 FMFILL
22 0.03 FMFILL
23 0 FMFILL
24 <f0e1c3870f1e3c78> FMFILL
25 <f0783c1e0f87c3e1> FMFILL
26 <3333333333333333> FMFILL
27 <0000ffff0000ffff> FMFILL
28 <7ebddbe7e7dbbd7e> FMFILL
29 <fcf9f3e7cf9f3f7e> FMFILL
30 <7fbfdfeff7fbfdfe> FMFILL
%%EndSetup
%%Page: "1" 1
%%BeginPaperSize: Letter
%%EndPaperSize
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
J
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Block Zer) 72 42.62 T
(oing Mechanism) 120.54 42.62 T
(August 2, 1994) 261.84 42.62 T
(1) 500 42.62 T
1 24 Q
(xFS Block Zeroing Mechanism) 155 704 T
2 12 Q
(Adam Sweeney) 266.84 664 T
2 16 Q
(1.0  Intr) 72 621.33 T
(oduction) 127.26 621.33 T
1 12 Q
-0.16 (This document describes the mechanisms used in xFS to ensure that we ne) 72 594 P
-0.16 (v) 427.69 594 P
-0.16 (er return uninitialized) 433.51 594 P
(data to an) 72 580 T
(yone reading a \336le. This could potentially occur when:) 118.48 580 T
3 F
(\245) 72 560 T
1 F
-0.22 (Blocks are allocated to a \336le, b) 85.75 560 P
-0.22 (ut before the data for those blocks are written to disk the system) 232.52 560 P
(crashes.) 85.75 546 T
3 F
(\245) 72 526 T
1 F
(A \336le with \336x) 85.75 526 T
(ed sized e) 152.57 526 T
(xtents is written sparsely) 199.71 526 T
(. In this case what w) 317.92 526 T
(ould ha) 415.78 526 T
(v) 451.2 526 T
(e been holes in) 457.02 526 T
(the \336le are actually allocated space on disk, b) 85.75 512 T
(ut the user ne) 303.12 512 T
(v) 367.14 512 T
(er speci\336es an) 372.96 512 T
(y data to be written) 440.76 512 T
-0.02 (into those holes. It is the job of the \336le system to ensure that the user cannot tell the dif) 85.75 498 P
-0.02 (ference) 501.71 498 P
(between these holes and re) 85.75 484 T
(gular holes which al) 214.19 484 T
(w) 311.06 484 T
(ays return zeros when read.) 319.6 484 T
-0.28 (The goal of this design is to a) 72 458 P
-0.28 (v) 211.48 458 P
-0.28 (oid whene) 217.24 458 P
-0.28 (v) 266.32 458 P
-0.28 (er possible actually writing zeros to the disk or memory) 272.14 458 P
-0.02 (when the user has speci\336ed data to be written there. Writing zeros is a pessimistic strate) 72 444 P
-0.02 (gy which) 492.72 444 P
(adds cpu and I/O o) 72 430 T
(v) 162.47 430 T
(erhead to the \336le writing process. The only times in which writing zeroes is) 168.29 430 T
-0.34 (acceptable are when the user does not initialize that portion of the \336le \050case 2 abo) 72 416 P
-0.34 (v) 457.57 416 P
-0.34 (e\051 or during \336le) 463.39 416 P
-0.04 (system reco) 72 402 P
-0.04 (v) 128.76 402 P
-0.04 (ery) 134.58 402 P
-0.04 (. In place of actually writing the zeros to the \336le, xFS will place operations in the) 149.13 402 P
-0.09 (log which indicate that during reco) 72 388 P
-0.09 (v) 239.04 388 P
-0.09 (ery we should zero the speci\336ed \336le blocks. This w) 244.86 388 P
-0.09 (ay we use) 489.94 388 P
(the transaction mechanism to eliminate the o) 72 374 T
(v) 286.46 374 T
(erhead of block zeroing.) 292.28 374 T
2 16 Q
(2.0  Backgr) 72 333.33 T
(ound) 149.49 333.33 T
1 12 Q
-0.41 (In xFS we use delayed allocation to impro) 72 306 P
-0.41 (v) 271.95 306 P
-0.41 (e the contiguity of our \336le block allocations. Instead of) 277.77 306 P
(deciding which blocks to associate with a range of a \336le when the user initially writes to that) 72 292 T
-0.22 (range, we instead only reserv) 72 278 P
-0.22 (e space on the disk for the necessary number of blocks and delay the) 211.22 278 P
(choice of which blocks until we ha) 72 264 T
(v) 239.06 264 T
(e to actually \337ush the user\325) 244.88 264 T
(s data to disk. This w) 373.87 264 T
(ay we tak) 475.75 264 T
(e) 521.62 264 T
(adv) 72 250 T
(antage of the UNIX write behind mechanisms to g) 89.03 250 T
(ain a better idea of the e) 330.92 250 T
(v) 445.92 250 T
(entual size of the) 451.74 250 T
(\336le.) 72 236 T
(When a delayed write, delayed allocation b) 72 210 T
(uf) 279.37 210 T
(fer is \336nally pushed out it is sent to the) 289.07 210 T
(xfs_strat_write\050\051 routine. There we allocate blocks for the \336le range co) 72 196 T
(v) 411.4 196 T
(ered by the delayed allo-) 417.22 196 T
(cation b) 72 182 T
(uf) 110.09 182 T
(fer as well as an) 119.78 182 T
(y other delayed allocation blocks in the \336le which are contiguous to) 196.91 182 T
(ours. The idea is to allocate all of the blocks as a single lar) 72 168 T
(ge e) 352.4 168 T
(xtent.) 371.88 168 T
(At the point at which we con) 72 142 T
(v) 210.17 142 T
(ert a delayed allocation e) 215.99 142 T
(xtent into a real one we are writing out a) 335.77 142 T
(b) 72 128 T
(uf) 77.76 128 T
(fer which co) 87.46 128 T
(v) 147.25 128 T
(ers some subset of the allocated e) 153.07 128 T
(xtent. Most delayed allocation b) 313.52 128 T
(uf) 467.6 128 T
(fers are) 477.3 128 T
-0.21 (pushed out in the conte) 72 114 P
-0.21 (xt of an xfsd daemon. There are a limited number of these daemons, so we) 182.29 114 P
(can\325) 72 100 T
(t sleep in the daemon w) 92.44 100 T
(aiting for other delayed allocation b) 205.97 100 T
(uf) 377.36 100 T
(fers to be written out. Speci\336-) 387.06 100 T
(cally we can\325) 72 86 T
(t w) 135.76 86 T
(ait in the xfsd daemon for the b) 150.64 86 T
(uf) 300.71 86 T
(fers co) 310.4 86 T
(v) 342.54 86 T
(ering the rest of the ne) 348.36 86 T
(wly allocated) 455.7 86 T
FMENDPAGE
%%EndPage: "1" 1
%%Page: "2" 2
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Block Zer) 72 42.62 T
(oing Mechanism) 120.54 42.62 T
(August 2, 1994) 261.84 42.62 T
(2) 500 42.62 T
1 12 Q
-0.21 (e) 72 712 P
-0.21 (xtent to be \337ushed, because it may be that this daemon is the only one so if we don\325) 77.15 712 P
-0.21 (t do it no one) 474.73 712 P
(will.) 72 698 T
(While in performing the allocation we can log an item stating that the allocated blocks should be) 72 672 T
-0.07 (zeroed if we don\325) 72 658 P
-0.07 (t log an) 155.87 658 P
-0.07 (ything stating otherwise, it is dif) 191.55 658 P
-0.07 (\336cult to kno) 346.23 658 P
-0.07 (w when we can actually log) 403.8 658 P
-0.28 (an item stating not to perform the zeroing. W) 72 644 P
-0.28 (e cannot log such an item until we kno) 285.74 644 P
-0.28 (w for sure that) 468.49 644 P
(all of the b) 72 630 T
(uf) 123.42 630 T
(fers co) 133.12 630 T
(v) 165.25 630 T
(ering the allocated e) 171.07 630 T
(xtent ha) 267.86 630 T
(v) 305.95 630 T
(e been allocated, b) 311.77 630 T
(ut we cannot w) 400.84 630 T
(ait in) 473.7 630 T
(xfs_strat_write\050\051 for that to happen. An) 72 616 T
(y solution to this problem must also address ho) 260.45 616 T
(w we are) 486.16 616 T
(going to kno) 72 602 T
(w when e) 132.37 602 T
(v) 178.06 602 T
(erything in the allocated range has been written.) 183.88 602 T
(Another problem in) 72 576 T
(v) 166.18 576 T
(olving getting the rest of the b) 171.94 576 T
(uf) 316.36 576 T
(fers co) 326.05 576 T
(v) 358.19 576 T
(ering the allocated re) 364.01 576 T
(gion \337ushed to) 464.8 576 T
(disk in) 72 562 T
(v) 103.86 562 T
(olv) 109.62 562 T
(es the interaction with the log reserv) 124.78 562 T
(ation mechanism used by all transactions. Since) 299.11 562 T
(we are going to log a block zero item along with the allocation of the e) 72 548 T
(xtent, the log will not be) 411.43 548 T
-0.22 (able to wrap around be) 72 534 P
-0.22 (yond that block zero item until we kno) 180.9 534 P
-0.22 (w that all of the b) 364.71 534 P
-0.22 (uf) 447.69 534 P
-0.22 (fers co) 457.38 534 P
-0.22 (v) 489.3 534 P
-0.22 (ering the) 495.12 534 P
(allocated e) 72 520 T
(xtent ha) 123.47 520 T
(v) 161.56 520 T
(e been \337ushed. If getting those b) 167.38 520 T
(uf) 323.45 520 T
(fers \337ushed in) 333.14 520 T
(v) 400.66 520 T
(olv) 406.42 520 T
(es acquiring a log reser-) 421.57 520 T
(v) 72 506 T
(ation then we could deadlock on the log space resource.) 77.7 506 T
2 16 Q
(3.0  Solution) 72 465.33 T
1 12 Q
-0.04 (The solution proposed here does not li) 72 438 P
-0.04 (v) 255.42 438 P
-0.04 (e up to the goal speci\336ed in the introduction. Speci\336cally) 261.24 438 P
-0.04 (,) 534.04 438 P
(it requires writing zeroes to the disk e) 72 424 T
(v) 252.67 424 T
(en when the data for the re) 258.49 424 T
(gion being zeroed resides in) 386.27 424 T
(memory) 72 410 T
(. This w) 111.22 410 T
(as not my \336rst choice, b) 150.1 410 T
(ut the restricti) 264.52 410 T
(v) 330.88 410 T
(eness of the en) 336.7 410 T
(vironment in which the) 407.2 410 T
(block zeroing tak) 72 396 T
(es place has so f) 155.2 396 T
(ar left me no alternati) 233.05 396 T
(v) 336.06 396 T
(e.) 341.88 396 T
(The basic mechanism is described in the sections belo) 72 370 T
(w) 331 370 T
(.) 338.88 370 T
2 14 Q
(3.1  Delay) 72 336.67 T
(ed Allocation Extent Con) 130.58 336.67 T
(v) 280.52 336.67 T
(ersion) 287.38 336.67 T
1 12 Q
-0.27 (A b) 72 310 P
-0.27 (uf) 89.15 310 P
-0.27 (fer o) 98.85 310 P
-0.27 (v) 120.71 310 P
-0.27 (er a delayed allocation e) 126.54 310 P
-0.27 (xtent is pick) 241.89 310 P
-0.27 (ed up by an xfsd to be \337ushed out and is passed to) 299.89 310 P
(xfs_strat_write\050\051. Then we tak) 72 296 T
(e the follo) 217.18 296 T
(wing steps:) 265.54 296 T
3 F
(\245) 72 276 T
1 F
(Acquire the inode lock e) 85.75 276 T
(xclusi) 203.54 276 T
(v) 231.9 276 T
(ely) 237.73 276 T
(.) 251.61 276 T
3 F
(\245) 72 256 T
1 F
(While re) 85.75 256 T
(gion locks o) 127.22 256 T
(v) 185.71 256 T
(erlapping our b) 191.52 256 T
(uf) 264.61 256 T
(fer e) 274.3 256 T
(xist: drop the inode lock; sleep on the re) 295.77 256 T
(gion lock;) 488.24 256 T
(reacquire the inode lock and check ag) 85.75 242 T
(ain.) 266.96 242 T
3 F
(\245) 72 222 T
1 F
(Once we kno) 85.75 222 T
(w that we don\325) 148.76 222 T
(t o) 220.19 222 T
(v) 232.35 222 T
(erlap a re) 238.17 222 T
(gion, we determine the layout of the e) 282.63 222 T
(xtents underly-) 464.42 222 T
(ing our b) 85.75 208 T
(uf) 128.84 208 T
(fer by calling xfs_bmapi\050\051 as if we were going to read. The underlying e) 138.53 208 T
(xtents can) 484.94 208 T
(be an) 85.75 194 T
(y mix of real and delayed allocation e) 111.22 194 T
(xtents.) 292 194 T
3 F
(\245) 72 174 T
1 F
-0.27 (If there are an) 85.75 174 P
-0.27 (y delayed allocation e) 151.7 174 P
-0.27 (xtents underlying our b) 255.68 174 P
-0.27 (uf) 366.27 174 P
-0.27 (fer) 375.97 174 P
-0.27 (, then create a re) 388.81 174 P
-0.27 (gion lock from) 466.49 174 P
(the start of the \336rst delayed allocation e) 85.75 160 T
(xtent to the end of the last one. W) 275.2 160 T
(e can ASSER) 436.55 160 T
(T that) 501.16 160 T
-0.05 (this does not o) 85.75 146 P
-0.05 (v) 155.08 146 P
-0.05 (erlap an) 160.9 146 P
-0.05 (y other re) 198.99 146 P
-0.05 (gion locks, e) 244.69 146 P
-0.05 (v) 305.28 146 P
-0.05 (en if the re) 311.1 146 P
-0.05 (gion lock we get e) 362.41 146 P
-0.05 (xtends be) 450.01 146 P
-0.05 (yond the) 495.44 146 P
(bounds of our b) 85.75 132 T
(uf) 161.16 132 T
(fer) 170.86 132 T
(.) 183.52 132 T
3 F
(\245) 72 112 T
1 F
-0.3 (Allocate a block zero item that can store the number of delayed allocation e) 85.75 112 P
-0.3 (xtents we are going) 444.56 112 P
(to mak) 85.75 98 T
(e real.) 118.62 98 T
FMENDPAGE
%%EndPage: "2" 2
%%Page: "3" 3
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Block Zer) 72 42.62 T
(oing Mechanism) 120.54 42.62 T
(August 2, 1994) 261.84 42.62 T
(3) 500 42.62 T
3 12 Q
(\245) 72 712 T
1 F
-0.15 (F) 85.75 712 P
-0.15 (or each delayed allocation e) 92.24 712 P
-0.15 (xtent underlying our b) 225.42 712 P
-0.15 (uf) 331.72 712 P
-0.15 (fer: start a transaction or inherit the trans-) 341.42 712 P
(action from11 the pre) 85.75 698 T
(vious loop; add the inode to the transaction; call xfs_bmapi\050\051 to con) 189.09 698 T
(v) 513.58 698 T
(ert) 519.4 698 T
-0.43 (the delayed allocation e) 85.75 684 P
-0.43 (xtent to a real e) 197.92 684 P
-0.43 (xtent; add the re) 270.01 684 P
-0.43 (gion for this delayed allocation e) 346.2 684 P
-0.43 (xtent to) 501.52 684 P
(the BZ item and add it to the transaction; and commit the transaction. W) 85.75 670 T
(e use a permanent log) 432.09 670 T
-0.16 (reserv) 85.75 656 P
-0.16 (ation transaction for this loop and al) 114.76 656 P
-0.16 (w) 287.03 656 P
-0.16 (ays relog the inode and BZ item with each commit) 295.57 656 P
(in order to guarantee that we don\325) 85.75 642 T
(t run out of log space.) 248.15 642 T
3 F
(\245) 72 622 T
1 F
(Zero an) 85.75 622 T
(y portions of space which we allocated abo) 122.55 622 T
(v) 329.32 622 T
(e b) 335.14 622 T
(ut were not delayed allocation e) 349.23 622 T
(xtents) 502.01 622 T
-0.03 (when we started. These will only occur because of \336x) 85.75 608 P
-0.03 (ed size e) 343.25 608 P
-0.03 (xtents and real time e) 384.33 608 P
-0.03 (xtents. W) 486.69 608 P
-0.03 (e) 531.7 608 P
-0.09 (need to zero them before dropping the inode lock since there is not data in memory for the cor-) 85.75 594 P
(responding blocks, the blocks on disk are full of g) 85.75 580 T
(arbage, and once the inode lock is dropped) 325.66 580 T
(the blocks become visible for reading.) 85.75 566 T
3 F
(\245) 72 546 T
1 F
(Drop the inode lock.) 85.75 546 T
3 F
(\245) 72 526 T
1 F
(Map out the re) 85.75 526 T
(gion co) 155.88 526 T
(v) 191.37 526 T
(ered by our b) 197.19 526 T
(uf) 260.6 526 T
(fer and its underlying delayed allocation e) 270.29 526 T
(xtents. F) 472.07 526 T
(or) 513.23 526 T
-0.3 (e) 85.75 512 P
-0.3 (xtents which underlie our b) 90.89 512 P
-0.3 (uf) 220.75 512 P
-0.3 (fer) 230.45 512 P
-0.3 (, write out the corresponding portion of the b) 243.29 512 P
-0.3 (uf) 456.25 512 P
-0.3 (fer) 465.95 512 P
-0.3 (. F) 478.61 512 P
-0.3 (or e) 490.8 512 P
-0.3 (xtents) 508.64 512 P
(which we allocated b) 85.75 498 T
(ut are not encompassed by our b) 187.15 498 T
(uf) 342.21 498 T
(fer) 351.9 498 T
(, allocate and write out a b) 364.74 498 T
(uf) 491.48 498 T
(fer of) 501.17 498 T
(zeros. As we write the b) 85.75 484 T
(uf) 201.47 484 T
(fers chain them together so that we can w) 211.17 484 T
(ait for them later) 410.33 484 T
(.) 489.99 484 T
3 F
(\245) 72 464 T
1 F
(W) 85.75 464 T
(ait for all of the b) 96.11 464 T
(uf) 179.52 464 T
(fers to complete their I/O.) 189.22 464 T
3 F
(\245) 72 444 T
1 F
-0.18 (Pull the BZ item from the AIL and or mark it such that it will not be added to the AIL when its) 85.75 444 P
(transactions commit.) 85.75 430 T
3 F
(\245) 72 410 T
1 F
(Drop the re) 85.75 410 T
(gion lock we acquired earlier) 140.21 410 T
(.) 279.51 410 T
3 F
(\245) 72 390 T
1 F
(Mak) 85.75 390 T
(e a transaction and log a don\325) 107.62 390 T
(t block zero \050DBZ\051 item corresponding to the BZ items) 248.71 390 T
-0.31 (logged earlier) 85.75 376 P
-0.31 (. W) 151.09 376 P
-0.31 (e use the pointer to the BZ item as a k) 167.15 376 P
-0.31 (e) 345.92 376 P
-0.31 (y to pair up the BZ and DBZ items. W) 351.07 376 P
-0.31 (e) 531.98 376 P
-0.33 (w) 85.75 362 P
-0.33 (ait until after logging the DBZ item to free the BZ item so that that k) 94.29 362 P
-0.33 (e) 418.86 362 P
-0.33 (y cannot be reused until) 424.01 362 P
(after the DBZ item is logged.) 85.75 348 T
3 F
(\245) 72 328 T
1 F
(Free the BZ item or mark it to be freed when its last transaction commits.) 85.75 328 T
2 14 Q
(3.2  Writing out) 72 294.67 T
( non delay) 166.89 294.67 T
(ed allocation b) 228.21 294.67 T
(uffers) 315.05 294.67 T
1 12 Q
(A b) 72 268 T
(uf) 89.42 268 T
(fer NO) 99.12 268 T
(T o) 132.29 268 T
(v) 148.44 268 T
(er a delayed allocation e) 154.26 268 T
(xtent comes through the xfs_strate) 270.71 268 T
(gy\050\051 code to be writ-) 435.84 268 T
(ten. Then we tak) 72 254 T
(e the follo) 151.86 254 T
(wing steps.) 200.22 254 T
3 F
(\245) 72 234 T
1 F
(Acquire the inode lock SHARED.) 85.75 234 T
3 F
(\245) 72 214 T
1 F
(While re) 85.75 214 T
(gion locks o) 127.22 214 T
(v) 185.71 214 T
(erlapping our b) 191.52 214 T
(uf) 264.61 214 T
(fer e) 274.3 214 T
(xist: drop the inode lock; sleep on the re) 295.77 214 T
(gion lock;) 488.24 214 T
-0.18 (reacquire the inode lock and check ag) 85.75 200 P
-0.18 (ain. The reason we do this is to ensure that if the underly-) 265.88 200 P
-0.07 (ing blocks are being zeroed we w) 85.75 186 P
-0.07 (ait for the zeros to mak) 245.82 186 P
-0.07 (e it to disk before sending out the real) 356.33 186 P
(data. W) 85.75 172 T
(e w) 122.11 172 T
(ouldn\325) 138.98 172 T
(t w) 170.09 172 T
(ant to reorder them.) 184.97 172 T
3 F
(\245) 72 152 T
1 F
(Drop the inode lock and send the b) 85.75 152 T
(uf) 253.15 152 T
(fer out to disk.) 262.84 152 T
FMENDPAGE
%%EndPage: "3" 3
%%Page: "4" 4
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Block Zer) 72 42.62 T
(oing Mechanism) 120.54 42.62 T
(August 2, 1994) 261.84 42.62 T
(4) 500 42.62 T
2 14 Q
(3.3  Interaction with \336le truncation) 72 710.67 T
1 12 Q
(The truncate code will be changed to w) 72 684 T
(ait for an) 260.83 684 T
(y re) 303.97 684 T
(gion locks in the re) 322.12 684 T
(gion being freed to be) 413.93 684 T
(dropped before freeing the underlying e) 72 670 T
(xtents. This will ensure that we don\325) 262.76 670 T
(t free blocks which) 437.53 670 T
(are still being zeroed.) 72 656 T
2 14 Q
(3.4  Implementation r) 72 622.67 T
(equir) 201.63 622.67 T
(ements) 233.27 622.67 T
1 12 Q
-0.32 (The block zeroing mechanism requires se) 72 596 P
-0.32 (v) 269.74 596 P
-0.32 (eral small modi\336cations to the current implementation.) 275.56 596 P
(The) 72 582 T
(y are listed belo) 90.48 582 T
(w:) 166.5 582 T
3 F
(\245) 72 562 T
1 F
(Add a block zero item and a don\325) 85.75 562 T
(t block zero item to be logged to indicate blocks which may) 245.82 562 T
(need to be zeroed in the e) 85.75 548 T
(v) 208.07 548 T
(ent of a crash.) 213.89 548 T
3 F
(\245) 72 528 T
1 F
(Add a re) 85.75 528 T
(gion lock mechanism to the in-core inode to ensure the proper ordering of zeros and) 126.88 528 T
(data being written to disk. This allo) 85.75 514 T
(ws us to drop the inode lock while writing the zeros.) 255.77 514 T
3 F
(\245) 72 494 T
1 F
(Modify the b) 85.75 494 T
(uf) 148.17 494 T
(fer strate) 157.87 494 T
(gy path to use and recognize the inode re) 200 494 T
(gion locks.) 396.44 494 T
3 F
(\245) 72 474 T
1 F
(Modify the code in the \336le truncation path to recognize the inode re) 85.75 474 T
(gion locks.) 410.18 474 T
3 F
(\245) 72 454 T
1 F
(Add functionality to the reco) 85.75 454 T
(v) 224.21 454 T
(ery code to recognize and process BZ and DBZ items) 230.03 454 T
3 F
(\245) 72 434 T
1 F
-0.31 (Modify the xfs_bmapi\050\051 code to con) 85.75 434 P
-0.31 (v) 257.36 434 P
-0.31 (ert from delayed to real ONL) 263.18 434 P
-0.31 (Y the re) 400.72 434 P
-0.31 (gion speci\336ed by the) 438.58 434 P
(caller as opposed to the entire delayed allocation e) 85.75 420 T
(xtent) 327.51 420 T
-0.39 (All together these pieces incorporate a complete block zeroing solution. Each of the pieces will be) 72 394 P
(discussed in more detail in the follo) 72 380 T
(wing sections.) 243.02 380 T
2 F
(3.4.1  Block Zer) 72 348 T
(o and Don\325t Block Zer) 152.78 348 T
(o Items) 267.24 348 T
1 F
(The block zero \050BZ\051 and don\325) 72 322 T
(t block zero \050DBZ\051 log items will be placed in the on disk log to) 215.41 322 T
(indicate that a portion of a \336le should be zeroed or no longer needs to be zeroed in the f) 72 308 T
(ace of a) 491.46 308 T
-0.05 (system crash. The BZ item will contain an array of ranges of blocks to be zeroed or not zeroed in) 72 294 P
(the on disk image. The BZ and DBZ items will both contain an inode number) 72 280 T
(, inode generation) 443.83 280 T
(number) 72 266 T
(, and the pointer to the DBZ item as a k) 108.18 266 T
(e) 297.71 266 T
(y binding the tw) 302.86 266 T
(o items in the log.) 381.07 266 T
(In memory the BZ item will adhere to the standard log item format. Its pri) 72 240 T
(v) 427.33 240 T
(ate \336elds will include:) 433.03 240 T
3 F
(\245) 72 220 T
1 F
(An array of of) 85.75 220 T
(fset length pairs to indicate what ranges of the \336le must be zeroed.) 153.75 220 T
3 F
(\245) 72 200 T
1 F
(A count of the number of entries in the array which are currently v) 85.75 200 T
(alid.) 405.03 200 T
3 F
(\245) 72 180 T
1 F
(A count of the total number of entries.) 85.75 180 T
(Once it is logged, a BZ item will be placed in the AIL with the lsn of its transaction. It will only) 72 154 T
(mo) 72 140 T
(v) 87.16 140 T
(e forw) 92.98 140 T
(ard in the AIL when it is relogged. It will not be able to be pushed. It will only be) 123.84 140 T
(remo) 72 126 T
(v) 96.48 126 T
(ed from the AIL when the re) 102.3 126 T
(gion it describes has been entirely \337ushed out or zeroed. It is) 239.41 126 T
(important that the BZ item is remo) 72 112 T
(v) 238.49 112 T
(ed from the AIL before the DBZ item is logged, because we) 244.31 112 T
(may not be able to obtain a log reserv) 72 98 T
(ation to log the DBZ item until the BZ item has been) 252.34 98 T
(remo) 72 84 T
(v) 96.48 84 T
(ed from the AIL.) 102.3 84 T
FMENDPAGE
%%EndPage: "4" 4
%%Page: "5" 5
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Block Zer) 72 42.62 T
(oing Mechanism) 120.54 42.62 T
(August 2, 1994) 261.84 42.62 T
(5) 500 42.62 T
1 12 Q
-0.12 (The DBZ items will ne) 72 712 P
-0.12 (v) 181.9 712 P
-0.12 (er be entered into the AIL. As soon as the) 187.72 712 P
-0.12 (y ha) 386.44 712 P
-0.12 (v) 406.41 712 P
-0.12 (e been logged to disk the) 412.23 712 P
-0.12 (y) 531.12 712 P
-0.33 (are no longer needed, because it is guaranteed that the DBZ item will not be o) 72 698 P
-0.33 (v) 440.83 698 P
-0.33 (erwritten in the log) 446.65 698 P
-0.18 (until after its corresponding BZ item has been o) 72 684 P
-0.18 (v) 299.68 684 P
-0.18 (erwritten. The on disk image of the BZ item will) 305.5 684 P
-0.42 (identify its corresponding DBZ item by the using the in memory BZ item pointer as a k) 72 670 P
-0.42 (e) 484.52 670 P
-0.42 (y) 489.66 670 P
-0.42 (. W) 494.88 670 P
-0.42 (e will) 510.83 670 P
(guarantee that the BZ item is not reused until after the DBZ item has been committed.) 72 656 T
2 F
(3.4.2  Inode Region Locks) 72 624 T
1 F
(Re) 72 598 T
(gion locks will be used to control access to portions of a \336le while the) 85.15 598 T
(y are being con) 420.28 598 T
(v) 493.44 598 T
(erted) 499.26 598 T
(from delayed allocation to real e) 72 584 T
(xtents as described abo) 227.45 584 T
(v) 338.24 584 T
(e. Each lock will be described by a data) 344.06 584 T
(structure containing:) 72 570 T
3 F
(\245) 72 550 T
1 F
(An of) 85.75 550 T
(fset and length in \336le system blocks) 113.11 550 T
3 F
(\245) 72 530 T
1 F
(A spinlock used to synchronize going to sleep on the lock) 85.75 530 T
3 F
(\245) 72 510 T
1 F
(A count of the number of procs sleeping on the lock) 85.75 510 T
3 F
(\245) 72 490 T
1 F
(F) 85.75 490 T
(orw) 92.24 490 T
(ard and backw) 110.78 490 T
(ard pointers for the lock list) 180.63 490 T
-0.35 (In addition, all re) 72 464 P
-0.35 (gion locks for a gi) 153.43 464 P
-0.35 (v) 239.07 464 P
-0.35 (en inode will use a single semaphore pointed to by the in core) 244.89 464 P
(inode structure. The common sleeping semaphore for all the re) 72 450 T
(gion locks will be used to reduce) 373.09 450 T
(the amount of memory used by the locks and to solv) 72 436 T
(e the problem of when the semaphore itself) 323.14 436 T
(can be freed. Speci\336cally) 72 422 T
(, the problem is that the processes w) 192.52 422 T
(aking up on the semaphore actually) 366.37 422 T
(reference it, so it cannot be freed until all of the sleepers ha) 72 408 T
(v) 356.02 408 T
(e left the semaphore code. Also, the) 361.84 408 T
(common semaphore will be dynamically allocated separately from the inode so that we only use) 72 394 T
(the semaphore memory when necessary) 72 380 T
(. The semaphore will be freed when the inode is e) 262.5 380 T
(v) 501.14 380 T
(entu-) 506.96 380 T
(ally freed.) 72 366 T
-0.02 (Since there is no w) 72 340 P
-0.02 (ay to atomically drop a multi-reader lock \050the inode lock\051 and go to sleep on a) 163.11 340 P
(semaphore, the follo) 72 326 T
(wing sequence will be used to go to sleep on a re) 170.02 326 T
(gion lock:) 404.8 326 T
3 F
(\245) 72 306 T
1 F
(Acquire the inode lock e) 85.75 306 T
(xclusi) 203.54 306 T
(v) 231.9 306 T
(ely) 237.73 306 T
3 F
(\245) 72 286 T
1 F
(Find the re) 85.75 286 T
(gion lock on which we\325) 137.56 286 T
(re going to sleep, if it is not there then there is no need to) 250.28 286 T
(sleep) 85.75 272 T
3 F
(\245) 72 252 T
1 F
(Acquire the re) 85.75 252 T
(gion lock spin lock) 154.21 252 T
3 F
(\245) 72 232 T
1 F
(Bump the count of sleeping processes on the re) 85.75 232 T
(gion lock) 312.2 232 T
3 F
(\245) 72 212 T
1 F
(Drop the inode lock) 85.75 212 T
3 F
(\245) 72 192 T
1 F
(Use the spunlock_psema\050\051 routine to atomically drop the spinlock and go to sleep on the) 85.75 192 T
(inode\325) 85.75 178 T
(s semaphore) 115.75 178 T
(W) 72 152 T
(aking up the processes sleeping on a re) 82.37 152 T
(gion lock will require:) 269.15 152 T
3 F
(\245) 72 132 T
1 F
(Acquire the inode lock e) 85.75 132 T
(xclusi) 203.54 132 T
(v) 231.9 132 T
(ely) 237.73 132 T
3 F
(\245) 72 112 T
1 F
(If the sleep count in the re) 85.75 112 T
(gion lock is zero then there is nothing to do and the re) 210.87 112 T
(gion lock can) 469.33 112 T
(be freed) 85.75 98 T
3 F
(\245) 72 78 T
1 F
(Acquire the spin lock in the re) 85.75 78 T
(gion lock to ensure that noone is in the process of going to sleep) 230.87 78 T
FMENDPAGE
%%EndPage: "5" 5
%%Page: "6" 6
612 792 0 FMBEGINPAGE
[0 0 0 1 0 0 0]
[ 0 1 1 0 1 0 0]
[ 1 0 1 0 0 1 0]
[ 1 1 0 0 0 0 1]
[ 1 0 0 0 0 1 1]
[ 0 1 0 0 1 0 1]
[ 0 0 1 0 1 1 0]
 7 FrameSetSepColors
FrameNoSep
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 0 0 1 0 0 0 K
0 8 Q
0 X
0 0 0 1 0 0 0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.61 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Block Zer) 72 42.62 T
(oing Mechanism) 120.54 42.62 T
(August 2, 1994) 261.84 42.62 T
(6) 500 42.62 T
3 12 Q
(\245) 72 712 T
1 F
(Remo) 85.75 712 T
(v) 114.23 712 T
(e the re) 120.05 712 T
(gion lock structure from the inode\325) 155.19 712 T
(s list) 322.17 712 T
3 F
(\245) 72 692 T
1 F
(W) 85.75 692 T
(ak) 96.11 692 T
(e up all processes sleeping on the inode\325) 107.32 692 T
(s semaphore) 300.29 692 T
-0.24 (Since we w) 72 666 P
-0.24 (ak) 126.71 666 P
-0.24 (e up all the processes sleeping for an) 137.92 666 P
-0.24 (y re) 312.33 666 P
-0.24 (gion lock whene) 330.23 666 P
-0.24 (v) 408.77 666 P
-0.24 (er one is released, the pro-) 414.59 666 P
(cesses which ha) 72 652 T
(v) 148.4 652 T
(e a) 154.22 652 T
(w) 167.7 652 T
(ok) 176.24 652 T
(en must check to see if the) 188.12 652 T
(y can no) 315.25 652 T
(w run. T) 355.61 652 T
(o do so the) 395.64 652 T
(y must repeat the) 447.79 652 T
-0.13 (steps described abo) 72 638 P
-0.13 (v) 164.87 638 P
-0.13 (e used to go to sleep in the \336rst place. This scheme may cause some unneces-) 170.69 638 P
(sary w) 72 624 T
(ak) 103.54 624 T
(eups, b) 114.74 624 T
(ut the number of re) 148.5 624 T
(gion locks and processes sleeping on re) 240.3 624 T
(gion locks should) 429.42 624 T
(al) 72 610 T
(w) 80.54 610 T
(ays be small. This is because the re) 89.09 610 T
(gion locks are limited in use to the xfsds, processes trying) 257.54 610 T
(to truncate the \336le, and other processes pushing out dirty b) 72 596 T
(uf) 352.73 596 T
(fers.) 362.42 596 T
2 16 Q
(4.0  Conclusion) 72 555.33 T
1 12 Q
(This paper presents a solution to the block zeroing problem for xFS. It is not a great solution per-) 72 528 T
-0.03 (formance wise, b) 72 514 P
-0.03 (ut there is plenty of room for optimization. Basically) 154.01 514 P
-0.03 (, optimizations will in) 406 514 P
-0.03 (v) 510.78 514 P
-0.03 (olv) 516.54 514 P
-0.03 (e) 531.7 514 P
-0.15 (searching the chunk cache for b) 72 500 P
-0.15 (uf) 223.3 500 P
-0.15 (fers which o) 232.99 500 P
-0.15 (v) 291.83 500 P
-0.15 (erlap the re) 297.65 500 P
-0.15 (gions we\325) 351.15 500 P
-0.15 (re going to write zeros to and) 397.4 500 P
(writing the cached b) 72 486 T
(uf) 169.4 486 T
(fer instead. This, along with better b) 179.1 486 T
(uf) 352.84 486 T
(fer clustering algorithms will mini-) 362.53 486 T
(mize the number of zeros we actually write to disk.) 72 472 T
(Coming up with a design which w) 72 446 T
(orks within the restrictions of our transaction, locking, chunk) 236.54 446 T
(cache, and delayed allocation mechanisms is much trickier than I originally e) 72 432 T
(xpected. Belo) 442.42 432 T
(w are) 508.1 432 T
(listed some of the interesting \322rules\323 encountered during the design process:) 72 418 T
(1.) 72 398 T
(W) 85.75 398 T
(e really can\325) 96.11 398 T
(t acquire locks before getting log reserv) 155.2 398 T
(ations.) 345.52 398 T
(2.) 72 378 T
-0.18 (An) 85.75 378 P
-0.18 (y lock which we do acquire before getting a log reserv) 100.23 378 P
-0.18 (ation must al) 359.38 378 P
-0.18 (w) 420.89 378 P
-0.18 (ays be acquired before) 429.44 378 P
-0.46 (getting the log reserv) 85.75 364 P
-0.46 (ation and must not be dropped until the transaction or sequence of chained) 185.71 364 P
(transactions it is a part of is complete. Otherwise we end up with lock v) 85.75 350 T
(ersus log space dead-) 429.18 350 T
(locks. In other w) 85.75 336 T
(ords, in a sequence of chained transactions al) 166.28 336 T
(w) 382.77 336 T
(ays hold on to your locks.) 391.31 336 T
(3.) 72 316 T
(When something is placed in the log which cannot simply be \337ushed out \050e.g. a BZ item\051 we) 85.75 316 T
(must ensure that the process which placed it there will remo) 85.75 302 T
(v) 373.52 302 T
(e it in the same sequence of) 379.34 302 T
(instructions. Lea) 85.75 288 T
(ving it there to be processed in an asynchronous f) 165.5 288 T
(ashion is v) 403 288 T
(ery) 454.16 288 T
(, v) 468.7 288 T
(ery danger-) 480.52 288 T
-0.04 (ous. W) 85.75 274 P
-0.04 (e al) 118.74 274 P
-0.04 (w) 135.58 274 P
-0.04 (ays tend to lose our locks or the log space necessary to remo) 144.12 274 P
-0.04 (v) 433.43 274 P
-0.04 (e it, and then we run) 439.25 274 P
(out of log space.) 85.75 260 T
(4.) 72 240 T
(A daemon which is responsible for performing a certain action \050e.g. \337ushing out b) 85.75 240 T
(uf) 479.78 240 T
(fers\051 can-) 489.47 240 T
(not w) 85.75 226 T
(ait for that action on another object to complete, because it is usually the case the that) 112.62 226 T
(daemon will be w) 85.75 212 T
(aiting for itself.) 171.28 212 T
(5.) 72 192 T
(T) 85.75 192 T
(ransactions must be acti) 92.66 192 T
(v) 207.34 192 T
(e. W) 213.16 192 T
(aiting for an asynchronous e) 234.86 192 T
(v) 370.53 192 T
(ent to occur in the middle of a) 376.35 192 T
(transaction or sequence of chained transactions is dangerous. All of the log space tends to get) 85.75 178 T
(used up while you\325) 85.75 164 T
(re w) 176.8 164 T
(aiting.) 197.67 164 T
FMENDPAGE
%%EndPage: "6" 6
%%Trailer
%%BoundingBox: 0 0 612 792
%%PageOrder: Ascend
%%Pages: 6
%%DocumentFonts: Palatino-Roman
%%+ Times-Roman
%%+ Times-Bold
%%+ Courier-Bold
%%EOF