%!
%%BoundingBox: (atend)
%%Pages: (atend)
%%DocumentFonts: (atend)
%%EndComments
%
% FrameMaker PostScript Prolog 3.0, for use with FrameMaker 3.0
% Copyright (c) 1986,87,89,90,91 by Frame Technology Corporation.
% All rights reserved.
%
% Known Problems:
% Due to bugs in Transcript, the 'PS-Adobe-' is omitted from line 1
/FMversion (3.0) def
% Set up Color vs. Black-and-White
/FMPrintInColor systemdict /colorimage known
systemdict /currentcolortransfer known or def
% Uncomment this line to force b&w on color printer
% /FMPrintInColor false def
/FrameDict 295 dict def
systemdict /errordict known not {/errordict 10 dict def
errordict /rangecheck {stop} put} if
% The readline in 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
} def
} if
/FMVERSION {
FMversion ne {
/Times-Roman findfont 18 scalefont setfont
100 100 moveto
(FrameMaker version does not match postscript_prolog!)
dup =
show showpage
} if
} def
/FMLOCAL {
FrameDict begin
0 def
end
} def
/gstring FMLOCAL
/gfile FMLOCAL
/gindex FMLOCAL
/orgxfer FMLOCAL
/orgproc FMLOCAL
/organgle FMLOCAL
/orgfreq FMLOCAL
/yscale FMLOCAL
/xscale FMLOCAL
/manualfeed FMLOCAL
/paperheight FMLOCAL
/paperwidth FMLOCAL
/FMDOCUMENT {
array /FMfonts exch def
/#copies exch def
FrameDict begin
0 ne dup {setmanualfeed} if
/manualfeed exch def
/paperheight exch def
/paperwidth exch def
/yscale exch def
/xscale exch def
currenttransfer cvlit /orgxfer exch def
currentscreen cvlit /orgproc exch def
/organgle exch def /orgfreq exch def
setpapername
manualfeed {true} {papersize} ifelse
{manualpapersize} {false} ifelse
{desperatepapersize} if
end
} def
/pagesave FMLOCAL
/orgmatrix FMLOCAL
/landscape FMLOCAL
/FMBEGINPAGE {
FrameDict begin
/pagesave save def
3.86 setmiterlimit
/landscape exch 0 ne def
landscape {
90 rotate 0 exch neg translate pop
}
{pop pop}
ifelse
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
array /fillvals exch def
end
} def
/FMFILL {
FrameDict begin
fillvals 3 1 roll put
end
} def
/FMNORMALIZEGRAPHICS {
newpath
0.0 0.0 moveto
1 setlinewidth
0 setlinecap
0 0 0 sethsbcolor
0 setgray
} bind def
/fx FMLOCAL
/fy FMLOCAL
/fh FMLOCAL
/fw FMLOCAL
/llx FMLOCAL
/lly FMLOCAL
/urx FMLOCAL
/ury FMLOCAL
/FMBEGINEPSF {
end
/FMEPSF save def
/showpage {} def
FMNORMALIZEGRAPHICS
[/fy /fx /fh /fw /ury /urx /lly /llx] {exch def} forall
fx fy translate
rotate
fw urx llx sub div fh ury lly sub div scale
llx neg lly neg translate
} bind def
/FMENDEPSF {
FMEPSF restore
FrameDict begin
} bind def
FrameDict begin
/setmanualfeed {
%%BeginFeature *ManualFeed True
statusdict /manualfeed true put
%%EndFeature
} 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
} def
/papersizedict FMLOCAL
/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
} 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
/FMdicttop countdictstack 1 add def
statusdict begin stopped end
countdictstack -1 FMdicttop {pop end} for
} 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
} def
/desperatepapersize {
statusdict /setpageparams known
{
paperwidth paperheight 0 1
statusdict begin
{setpageparams} stopped pop
end
} if
} def
/savematrix {
orgmatrix currentmatrix pop
} bind def
/restorematrix {
orgmatrix setmatrix
} bind def
/dmatrix matrix def
/dpi 72 0 dmatrix defaultmatrix dtransform
dup mul exch dup mul add sqrt def
/freq dpi 18.75 div 8 div round dup 0 eq {pop 1} if 8 mul dpi exch div def
/sangle 1 0 dmatrix defaultmatrix dtransform exch atan 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
/graymode true def
/bwidth FMLOCAL
/bpside FMLOCAL
/bstring FMLOCAL
/onbits FMLOCAL
/offbits FMLOCAL
/xindex FMLOCAL
/yindex FMLOCAL
/x FMLOCAL
/y FMLOCAL
/setpattern {
/bwidth exch def
/bpside exch def
/bstring exch def
/onbits 0 def /offbits 0 def
freq sangle landscape {90 add} if
{/y exch def
/x exch def
/xindex x 1 add 2 div bpside mul cvi def
/yindex y 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
{/onbits onbits 1 add def 1}
{/offbits offbits 1 add def 0}
ifelse
}
setscreen
{} settransfer
offbits offbits onbits add div FMsetgray
/graymode false def
} bind def
/grayness {
FMsetgray
graymode not {
/graymode true def
orgxfer cvx settransfer
orgfreq organgle orgproc cvx setscreen
} if
} bind def
/HUE FMLOCAL
/SAT FMLOCAL
/BRIGHT FMLOCAL
/Colors FMLOCAL
FMPrintInColor
{
/HUE 0 def
/SAT 0 def
/BRIGHT 0 def
% array of arrays Hue and Sat values for the separations [HUE BRIGHT]
/Colors
[[0 0 ] % black
[0 0 ] % white
[0.00 1.0] % red
[0.37 1.0] % green
[0.60 1.0] % blue
[0.50 1.0] % cyan
[0.83 1.0] % magenta
[0.16 1.0] % comment / yellow
] def
/BEGINBITMAPCOLOR {
BITMAPCOLOR} def
/BEGINBITMAPCOLORc {
BITMAPCOLORc} def
/BEGINBITMAPTRUECOLOR {
BITMAPTRUECOLOR } def
/BEGINBITMAPTRUECOLORc {
BITMAPTRUECOLORc } def
/K {
Colors exch get dup
0 get /HUE exch store
1 get /BRIGHT exch store
HUE 0 eq BRIGHT 0 eq and
{1.0 SAT sub setgray}
{HUE SAT BRIGHT sethsbcolor}
ifelse
} def
/FMsetgray {
/SAT exch 1.0 exch sub store
HUE 0 eq BRIGHT 0 eq and
{1.0 SAT sub setgray}
{HUE SAT BRIGHT sethsbcolor}
ifelse
} bind def
}
{
/BEGINBITMAPCOLOR {
BITMAPGRAY} def
/BEGINBITMAPCOLORc {
BITMAPGRAYc} def
/BEGINBITMAPTRUECOLOR {
BITMAPTRUEGRAY } def
/BEGINBITMAPTRUECOLORc {
BITMAPTRUEGRAYc } def
/FMsetgray {setgray} bind def
/K {
pop
} def
}
ifelse
/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
/fillvals FMLOCAL
/X {
fillvals exch get
dup type /stringtype eq
{8 1 setpattern}
{grayness}
ifelse
} bind def
/V {
gsave eofill grestore
} bind def
/N {
stroke
} bind def
/M {newpath moveto} bind def
/E {lineto} bind def
/D {curveto} bind def
/O {closepath} bind def
/n FMLOCAL
/L {
/n exch def
newpath
normalize
moveto
2 1 n {pop normalize lineto} for
} bind def
/Y {
L
closepath
} bind def
/x1 FMLOCAL
/x2 FMLOCAL
/y1 FMLOCAL
/y2 FMLOCAL
/rad FMLOCAL
/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
% The following commented out code did not work for tangent lines of zero
% length. The code following it was provided by Frame to patch this error.
%
%/RR {
% /rad exch def
% normalize
% /y2 exch def
% /x2 exch def
% normalize
% /y1 exch def
% /x1 exch def
% newpath
% x1 y1 rad add moveto
% x1 y2 x2 y2 rad arcto
% x2 y2 x2 y1 rad arcto
% x2 y1 x1 y1 rad arcto
% x1 y1 x1 y2 rad arcto
% closepath
% 16 {pop} repeat
% } bind def
/rarc
{rad
{arcto} stopped
} 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
% x2 y1 x1 y1 rarc
x1 y1 x1 y2 rarc
closepath
cleartomark
} bind def
/C {
grestore
gsave
R
clip
} bind def
/FMpointsize FMLOCAL
/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 fill
grestore
} 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
stroke
grestore
} bind def
/x FMLOCAL
/y FMLOCAL
/w FMLOCAL
/h FMLOCAL
/xx FMLOCAL
/yy FMLOCAL
/ww FMLOCAL
/hh FMLOCAL
/FMsaveobject FMLOCAL
/FMoptop FMLOCAL
/FMdicttop FMLOCAL
/BEGINPRINTCODE {
/FMdicttop countdictstack 1 add def
/FMoptop count 4 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
/str FMLOCAL
/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
/sl FMLOCAL
/val FMLOCAL
/ws FMLOCAL
/im FMLOCAL
/bs FMLOCAL
/cs FMLOCAL
/len FMLOCAL
/pos FMLOCAL
/ms {
/sl exch def
/val 255 def
/ws cfs
/im cfs
/val 0 def
/bs cfs
/cs cfs
} bind def
400 ms
/cip {
is
0
cf cs readline pop
{ ic exch get exec
add
} forall
pop
/tot w 1 sub def
0 1 tot {
/indx exch def
/indxa is indx get def
/placer nredt indxa get def
/placeg ngreent indxa get def
/placeb nbluet indxa get def
cris indx placer 255 mul cvi put
cgis indx placeg 255 mul cvi put
cbis indx placeb 255 mul cvi put
} for pop cris
} bind def
/ip {
is
0
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
/h FMLOCAL
/w FMLOCAL
/d FMLOCAL
/lb FMLOCAL
/bitmapsave FMLOCAL
/is FMLOCAL
/cf FMLOCAL
/wbytes {
dup
8 eq {pop} {1 eq {7 add 8 idiv} {3 add 4 idiv} ifelse} ifelse
} bind def
/BEGINBITMAPBWc {
1 {} COMMONBITMAPc
} bind def
/BEGINBITMAPGRAYc {
8 {} COMMONBITMAPc
} bind def
/BEGINBITMAP2BITc {
2 {} COMMONBITMAPc
} bind def
/COMMONBITMAPc {
/r exch def
/d exch def
gsave
translate rotate scale /h exch def /w exch def
/lb w d wbytes def
sl lb lt {lb ms} if
/bitmapsave save def
r
/is im 0 lb getinterval def
ws 0 lb getinterval is copy pop
/cf currentfile def
w h d [w 0 0 h neg 0 h]
{ip} image
bitmapsave restore
grestore
} bind def
/BEGINBITMAPBW {
1 {} COMMONBITMAP
} bind def
/BEGINBITMAPGRAY {
8 {} COMMONBITMAP
} bind def
/BEGINBITMAP2BIT {
2 {} COMMONBITMAP
} bind def
/COMMONBITMAP {
/r exch def
/d exch def
gsave
translate rotate scale /h exch def /w exch def
/bitmapsave save def
r
/is w d wbytes string def
/cf currentfile def
w h d [w 0 0 h neg 0 h]
{cf is readhexstring pop} image
bitmapsave restore
grestore
} bind def
/proc1 FMLOCAL
/proc2 FMLOCAL
/newproc FMLOCAL
/Fmcc {
/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
} bind def
/ngrayt 256 array def
/nredt 256 array def
/nbluet 256 array def
/ngreent 256 array def
/gryt FMLOCAL
/blut FMLOCAL
/grnt FMLOCAL
/redt FMLOCAL
/indx FMLOCAL
/cynu FMLOCAL
/magu FMLOCAL
/yelu FMLOCAL
/k FMLOCAL
/u FMLOCAL
/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
/k cynu magu min yelu min def
nredt indx 1 0 cynu max sub redt exec put
ngreent indx 1 0 magu max sub grnt exec put
nbluet indx 1 0 yelu max sub blut exec put
ngrayt indx 1 k sub gryt exec put
} for
} bind def
/tran FMLOCAL
/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 Fmcc settransfer
} bind def
/BITMAPCOLOR {
/d 8 def
gsave
translate rotate scale /h exch def /w exch def
/bitmapsave save def
colorsetup
/is w d wbytes string def
/ris w d wbytes string def
/gis w d wbytes string def
/bis w d wbytes string def
/cf currentfile def
w h d [w 0 0 h neg 0 h]
{cf is readhexstring pop
/tot w 1 sub def
0 1 tot {
/indx exch def
/indxa is indx get def
/placer nredt indxa get def
/placeg ngreent indxa get def
/placeb nbluet indxa get def
ris indx placer 255 mul cvi put
gis indx placeg 255 mul cvi put
bis indx placeb 255 mul cvi put
} for pop ris}
{gis} {bis} true 3 colorimage
bitmapsave restore
grestore
} bind def
/BITMAPCOLORc {
/d 8 def
gsave
translate rotate scale /h exch def /w exch def
/lb w d wbytes def
sl lb lt {lb ms} if
/bitmapsave save def
colorsetup
/is im 0 lb getinterval def
/cris lb string def
/cgis lb string def
/cbis lb string def
ws 0 lb getinterval is copy pop
/cf currentfile def
w h d [w 0 0 h neg 0 h]
{cip} {cgis} {cbis} true 3 colorimage
bitmapsave restore
grestore
} bind def
/BITMAPTRUECOLORc {
gsave
translate rotate scale /h exch def /w exch def
/bitmapsave save def
/is w string def
ws 0 w getinterval is copy pop
/cf currentfile def
w h 8 [w 0 0 h neg 0 h]
{ip} {gip} {bip} true 3 colorimage
bitmapsave restore
grestore
} bind def
/BITMAPTRUECOLOR {
gsave
translate rotate scale /h exch def /w exch def
/bitmapsave save def
/is w string def
/gis w string def
/bis w string def
/cf currentfile def
w h 8 [w 0 0 h neg 0 h]
{ cf is readhexstring pop }
{ cf gis readhexstring pop }
{ cf bis readhexstring pop }
true 3 colorimage
bitmapsave restore
grestore
} bind def
/BITMAPTRUEGRAYc {
gsave
translate rotate scale /h exch def /w exch def
/bitmapsave save def
/is w string def
ws 0 w getinterval is copy pop
/cf currentfile def
w h 8 [w 0 0 h neg 0 h]
{ip gip bip w gray} image
bitmapsave restore
grestore
} bind def
/ww FMLOCAL
/r FMLOCAL
/g FMLOCAL
/b FMLOCAL
/i FMLOCAL
/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
translate rotate scale /h exch def /w exch def
/bitmapsave save def
/is w string def
/gis w string def
/bis w string def
/cf currentfile def
w h 8 [w 0 0 h neg 0 h]
{ cf is readhexstring pop
cf gis readhexstring pop
cf bis readhexstring pop w gray} image
bitmapsave restore
grestore
} bind def
/BITMAPGRAY {
8 {fakecolorsetup} COMMONBITMAP
} bind def
/BITMAPGRAYc {
8 {fakecolorsetup} COMMONBITMAPc
} bind def
/ENDBITMAP {
} bind def
end
/ALDsave FMLOCAL
/ALDmatrix matrix def ALDmatrix currentmatrix pop
/StartALD {
/ALDsave save def
savematrix
ALDmatrix setmatrix
} bind def
/InALD {
restorematrix
} bind def
/DoneALD {
ALDsave restore
} bind def
%%EndProlog
%%BeginSetup
(3.0) FMVERSION
1 1 612 792 0 1 6 FMDOCUMENT
0 0 /Palatino-Roman FMFONTDEFINE
1 0 /Times-Roman FMFONTDEFINE
2 0 /Courier 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 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Outline) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(1) 500 42.62 T
1 36 Q
4 K
(Outline) 252.01 696 T
1 18 Q
0 K
(Basic \336le system layout) 72 648 T
(Btree algorithms & data structures) 72 616 T
(Space allocation interfaces and design) 72 584 T
(Inode allocation interfaces and design) 72 552 T
(Block mapping interfaces and design) 72 520 T
FMENDPAGE
%%EndPage: "1" 2
%%Page: "2" 2
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Superblock) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(2) 500 42.62 T
1 36 Q
4 K
(Superblock) 224.02 696 T
1 18 Q
0 K
(File system is divided into a number of Allocation Groups) 72 648 T
(All but the last are of equal size) 72 616 T
(Each allocation group starts with a super block \050block 0\051 and an) 72 584 T
(allocation group header \050block 1\051) 72 564 T
(One copy of superblock per allocation group, but only the \336rst) 72 532 T
(one is ever updated except when \336le system changes size) 72 512 T
2 9 Q
(typedef struct xfs_sb {) 72 481 T
(uuid_t) 108 470 T
(sb_uuid;) 216 470 T
(/* f) 288 470 T
(ile system unique id */) 309.57 470 T
(xfs_fsblock_t) 108 459 T
(sb_dblocks;) 216 459 T
(/* number of data blocks */) 288 459 T
(__uint32_t) 108 448 T
(sb_blocksize;) 216 448 T
(/* logical block size, bytes */) 286.1 448 T
(/*) 108 437 T
( * sb_magic is at offset 28 to be at the same location as fs_magic) 108 426 T
( * in an EFS f) 108 415 T
(ilesystem, thus ensuring there is no confusion.) 183.49 415 T
( */) 108 404 T
(__uint32_t) 108 393 T
(sb_magicnum;) 216 393 T
(/* magic number == XFS_SB_MAGIC */) 288 393 T
(xfs_fsblock_t) 108 382 T
(sb_rblocks;) 216 382 T
(/* number of realtime blocks */) 288 382 T
(xfs_fsblock_t) 108 371 T
(sb_rbitmap;) 216 371 T
(/* bitmap for realtime blocks */) 288 371 T
(xfs_fsblock_t) 108 360 T
(sb_rsummary;) 216 360 T
(/* summary for xfs_rbitmap */) 288 360 T
(xfs_ino_t) 108 349 T
(sb_rootino;) 216 349 T
(/* root inode number */) 288 349 T
(xfs_agblock_t) 108 338 T
(sb_rextsize;) 216 338 T
(/* realtime extent size, blocks */) 288 338 T
(xfs_agblock_t) 108 327 T
(sb_agblocks;) 216 327 T
(/* size of an allocation group */) 288 327 T
(xfs_agnumber_t) 108 316 T
(sb_agcount;) 216 316 T
(/* number of allocation groups */) 288 316 T
(__uint16_t) 108 305 T
(sb_versionnum;) 216 305 T
(/* header version == XFS_SB_VERSION */) 291.49 305 T
(__uint16_t) 108 294 T
(sb_sectsize;) 216 294 T
(/* volume sector size, bytes */) 288 294 T
(__uint16_t) 108 283 T
(sb_inodesize;) 216 283 T
(/* inode size, bytes */) 288 283 T
(__uint16_t) 108 272 T
(sb_inopblock;) 216 272 T
(/* inodes per block */) 288 272 T
(char) 108 261 T
(sb_fname[6];) 216 261 T
(/* f) 288 261 T
(ile system name */) 309.57 261 T
(char) 108 250 T
(sb_fpack[6];) 216 250 T
(/* f) 288 250 T
(ile system pack name */) 309.57 250 T
(__uint8_t) 108 239 T
(sb_blocklog;) 216 239 T
(/* log2 of xfs_blocksize */) 288 239 T
(__uint8_t) 108 228 T
(sb_sectlog;) 216 228 T
(/* log2 of xfs_sectsize */) 288 228 T
(__uint8_t) 108 217 T
(sb_inodelog;) 216 217 T
(/* log2 of xfs_inodesize */) 288 217 T
(__uint8_t) 108 206 T
(sb_inopblog;) 216 206 T
(/* log2 of xfs_inopblock */) 288 206 T
(__uint8_t) 108 195 T
(sb_smallf) 216 195 T
(iles;) 264.53 195 T
(/* set if small f) 291.49 195 T
(iles in inodes */) 383.17 195 T
(/* statistics */) 108 184 T
(/* These f) 108 173 T
(ields must remain contiguous. If you really) 161.93 173 T
( * want to change their layout, make sure you f) 108 162 T
(ix the) 361.45 162 T
( * code in xfs_trans_apply_sb_deltas\050\051.) 108 151 T
( */) 108 140 T
(__uint64_t) 108 129 T
(sb_icount;) 216 129 T
(/* allocated inodes */) 288 129 T
(__uint64_t) 108 118 T
(sb_ifree;) 216 118 T
(/* free inodes */) 288 118 T
(__uint64_t) 108 107 T
(sb_fdblocks;) 216 107 T
(/* free data blocks */) 288 107 T
(__uint32_t) 108 96 T
(sb_frextents;) 216 96 T
(/* free realtime extents */) 288 96 T
(} xfs_sb_t;) 72 85 T
FMENDPAGE
%%EndPage: "2" 3
%%Page: "3" 3
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Allocation Gr) 72 42.62 T
(oup Header) 119.85 42.62 T
(December 16, 1993) 255.07 42.62 T
(3) 500 42.62 T
1 36 Q
4 K
(Allocation Group Header) 123.07 696 T
1 18 Q
0 K
(Allocation group header \050xfs_aghdr_t\051 contains information to) 72 648 T
(\336nd everything in its allocation group) 72 628 T
(Three sections:) 72 596 T
1 14 Q
(1.) 72 572.67 T
(Identi\336cation) 85.75 572.67 T
(2.) 72 550.67 T
(Freespace information) 85.75 550.67 T
(3.) 72 528.67 T
(Inode information) 85.75 528.67 T
1 18 Q
(May split into multiple buf) 72 498 T
(fers \050512 byte sections\051 to increase) 265.59 498 T
(parallelism) 72 478 T
2 9 Q
(typedef struct xfs_aghdr {) 72 426 T
(__uint32_t) 108 415 T
(ag_magic;) 216 415 T
(/* magic number == XFS_AGH_MAGIC */) 288 415 T
(__uint16_t) 108 404 T
(ag_version;) 216 404 T
(/* header version == XFS_AGH_VERSION */) 288 404 T
(xfs_agnumber_t) 108 393 T
(ag_seqno;) 216 393 T
(/* sequence # starting from 0 */) 288 393 T
(xfs_agblock_t) 108 382 T
(ag_length;) 216 382 T
(/* size in blocks of a.g. */) 288 382 T
(/*) 108 371 T
( * Freespace information) 108 360 T
( */) 108 349 T
(xfs_agblock_t) 108 338 T
(ag_roots[XFS_BTNUM_MAX - 1];) 216 338 T
(/* BNO, CNT */) 366.99 338 T
(xfs_agblock_t) 108 327 T
(ag_freelist;) 216 327 T
(/* free blocks */) 288 327 T
(__uint16_t) 108 316 T
(ag_levels[XFS_BTNUM_MAX - 1];) 216 316 T
(/* BNO, CNT */) 372.38 316 T
(xfs_extlen_t) 108 305 T
(ag_f) 216 305 T
(list_count;) 237.57 305 T
(/* #blocks */) 296.89 305 T
(xfs_extlen_t) 108 294 T
(ag_freeblks;) 216 294 T
(/* total free blocks */) 288 294 T
(xfs_extlen_t) 108 283 T
(ag_longest;) 216 283 T
(/* longest free space */) 288 283 T
(/*) 108 272 T
( * Inode information) 108 261 T
( * Inodes are mapped by interpreting the inode number, so no) 108 250 T
( * mapping data is needed here.) 108 239 T
( */) 108 228 T
(xfs_agino_t) 108 217 T
(ag_icount;) 216 217 T
(/* count of allocated inodes */) 288 217 T
(xfs_agino_t) 108 206 T
(ag_if) 216 206 T
(irst;) 242.96 206 T
(/* f) 288 206 T
(irst allocated inode */) 309.57 206 T
(xfs_agino_t) 108 195 T
(ag_ilast;) 216 195 T
(/* last allocated inode */) 288 195 T
(xfs_agino_t) 108 184 T
(ag_if) 216 184 T
(list;) 242.96 184 T
(/* f) 288 184 T
(irst free inode */) 309.57 184 T
(xfs_agino_t) 108 173 T
(ag_ifcount;) 216 173 T
(/* number of free inodes */) 288 173 T
(} xfs_aghdr_t;) 72 162 T
FMENDPAGE
%%EndPage: "3" 4
%%Page: "4" 4
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Btr) 72 42.62 T
(ee Block Format) 82.51 42.62 T
(December 16, 1993) 255.07 42.62 T
(4) 500 42.62 T
1 36 Q
4 K
(Btree Block Format) 163.03 696 T
1 18 Q
0 K
(Btrees used in the space manager:) 72 648 T
3 12 Q
(\245) 72 624.67 T
1 14 Q
(freespace, sorted by block number \050BNO\051) 85.75 624.67 T
3 12 Q
(\245) 72 602.67 T
1 14 Q
(freespace, sorted by block size \050CNT\051) 85.75 602.67 T
3 12 Q
(\245) 72 580.67 T
1 14 Q
(block map, sorted by \336le of) 85.75 580.67 T
(fset \050BMAP\051) 239.39 580.67 T
1 18 Q
(All use a common header structure xfs_btree_block_t and some) 72 550 T
(common code.) 72 530 T
-0.5 (Each btree block occupies one \336le system block exactly) 72 498 P
-0.5 (, unless it) 468.53 498 P
(is being stored in an inode \050and is smaller\051.) 72 478 T
(Each btree block consists of a header) 72 446 T
(, some records, and some) 338.06 446 T
-0.6 (pointers. The record type varies from btree to btree; the pointer is) 72 426 P
(a block number within an allocation group \050xfs_agblock_t\051. The) 72 406 T
(pointers are absent in leaf blocks.) 72 386 T
2 9 Q
(typedef struct xfs_btree_block) 72 366 T
({) 72 355 T
(__uint32_t) 108 344 T
(bb_magic;) 180 344 T
(/* magic number for block type */) 252 344 T
(__uint16_t) 108 333 T
(bb_level;) 180 333 T
(/* 0 is a leaf */) 252 333 T
(__uint16_t) 108 322 T
(bb_numrecs;) 180 322 T
(/* current # of data records */) 252 322 T
(xfs_agblock_t) 108 311 T
(bb_leftsib;) 180 311 T
(/* left sibling block or NULLAGBLOCK */) 252 311 T
(xfs_agblock_t) 108 300 T
(bb_rightsib;) 180 300 T
(/* right sibling block or NULLAGBLOCK */) 252 300 T
(} xfs_btree_block_t;) 72 289 T
1 18 Q
(Records for BNO and CNT btree blocks have this format:) 72 261 T
2 9 Q
(typedef struct xfs_alloc_rec) 72 241 T
({) 72 230 T
(xfs_agblock_t) 108 219 T
(ar_startblock;) 180 219 T
(/* starting block number */) 255.49 219 T
(xfs_extlen_t) 108 208 T
(ar_blockcount;) 180 208 T
(/* count of free blocks */) 255.49 208 T
(} xfs_alloc_rec_t;) 72 197 T
1 18 Q
(Records for BMAP btree blocks have this format:) 72 169 T
2 9 Q
(typedef struct xfs_bmbt_rec) 72 149 T
({) 72 138 T
(__uint32_t) 108 127 T
(l0, l1, l2, l3;) 180 127 T
(} xfs_bmbt_rec_t;) 72 116 T
(/* l0:0-31 and l1:9-31 are startoff.) 72 105 T
( * l1:0-8, l2:0-31, and l3:21-31 are startblock.) 72 94 T
( * l3:0-20 are blockcount.) 72 83 T
( */) 72 72 T
FMENDPAGE
%%EndPage: "4" 5
%%Page: "5" 5
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Disk Inode Format \0501\051) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(5) 500 42.62 T
1 36 Q
4 K
(Disk Inode Format \0501\051) 144.54 696 T
1 18 Q
0 K
(Disk inodes contain a core section \050xfs_dinode_core_t\051 and a) 72 648 T
-0.71 (union, which contains type-speci\336c information. Important to the) 72 628 P
(space manager are three formats: AGINO, EXTENTS, and) 72 608 T
(BTREE.) 72 588 T
(AGINO is used to link free inodes together in a list.) 72 556 T
(EXTENTS is used to keep extent information when the extents) 72 524 T
(will \336t in the inode.) 72 504 T
(BTREE is used when the number of extents is too lar) 72 472 T
(ge to \336t in) 454.43 472 T
(the inode.) 72 452 T
(T) 72 420 T
(imestamp values are currently 64 bits \05032 bits of seconds since) 82.36 420 T
(1970, 32 bits of nanoseconds\051 although only the seconds are) 72 400 T
(\336lled in and exported to users.) 72 380 T
FMENDPAGE
%%EndPage: "5" 6
%%Page: "6" 6
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Disk Inode Format \0502\051) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(6) 500 42.62 T
1 36 Q
4 K
(Disk Inode Format \0502\051) 144.54 696 T
2 9 Q
0 K
(typedef struct xfs_dinode_core {) 72 643 T
(__uint16_t) 108 632 T
(di_magic;) 216 632 T
(/* inode magic # = XFS_DINODE_MAGIC */) 288 632 T
(__uint16_t) 108 621 T
(di_mode;) 216 621 T
(/* mode and type of f) 288 621 T
(ile */) 401.24 621 T
(__int8_t) 108 610 T
(di_version;) 216 610 T
(/* inode version */) 288 610 T
(__int8_t) 108 599 T
(di_format;) 216 599 T
(/* format of di_c data */) 288 599 T
(__int16_t) 108 588 T
(di_nlink;) 216 588 T
(/* number of links to f) 288 588 T
(ile */) 412.03 588 T
(__uint16_t) 108 577 T
(di_uid;) 216 577 T
(/* owner\325s user id */) 288 577 T
(__uint16_t) 108 566 T
(di_gid;) 216 566 T
(/* owner\325s group id */) 288 566 T
(xfs_extnum_t) 108 555 T
(di_nextents;) 216 555 T
(/* number of extents in f) 288 555 T
(ile */) 422.81 555 T
(__int64_t) 108 544 T
(di_size;) 216 544 T
(/* number of bytes in f) 288 544 T
(ile */) 412.03 544 T
(uuid_t) 108 533 T
(di_uuid;) 216 533 T
(/* f) 288 533 T
(ile unique id */) 309.57 533 T
(/*) 108 522 T
( * While these f) 108 511 T
(ields hold 64 bit values, we will only) 194.28 511 T
( * be using the upper 32 bits for now. The t_nsec) 108 500 T
( * portion of the f) 108 489 T
(ields should always be zero. This) 210.46 489 T
( * leaves room for expansion in the future if necessary.) 108 478 T
( */) 108 467 T
(xfs_timestamp_t) 108 456 T
(di_atime;) 216 456 T
(/* time last accessed */) 288 456 T
(xfs_timestamp_t) 108 445 T
(di_mtime;) 216 445 T
(/* time last modif) 288 445 T
(ied */) 385.06 445 T
(xfs_timestamp_t) 108 434 T
(di_ctime;) 216 434 T
(/* time created/inode modif) 288 434 T
(ied */) 433.6 434 T
(/*) 108 423 T
( * Should this be 64 bits? What does nfs3.0 want?) 108 412 T
( */) 108 401 T
(__uint32_t) 108 390 T
(di_gen;) 216 390 T
(/* generation number */) 288 390 T
(xfs_agino_t) 108 379 T
(di_nexti;) 216 379 T
(/* next allocated inode in ag */) 288 379 T
(} xfs_dinode_core_t;) 72 368 T
(typedef struct xfs_dinode) 72 346 T
({) 72 335 T
(xfs_dinode_core_t) 108 324 T
(di_core;) 216 324 T
(union {) 108 313 T
(xfs_agino_t) 144 302 T
(di_next;) 252 302 T
(/* next inode for freelist inodes */) 324 302 T
(dev_t) 144 291 T
(di_dev;) 252 291 T
(/* device for IFCHR/IFBLK */) 324 291 T
(char) 144 280 T
(di_c[1];) 252 280 T
(/* local contents */) 324 280 T
(xfs_bmbt_rec_t) 144 269 T
(di_bmx[1];) 252 269 T
(/* extent list */) 324 269 T
(xfs_btree_block_t) 144 258 T
(di_bmbt;) 252 258 T
(/* btree root */) 324 258 T
(uuid_t) 144 247 T
(di_muuid;) 252 247 T
(/* mount point value */) 324 247 T
(}) 108 236 T
(di_u;) 180 236 T
(} xfs_dinode_t;) 72 225 T
(/*) 72 203 T
( * Values for di_format) 72 192 T
( */) 72 181 T
(typedef enum xfs_dinode_fmt) 72 170 T
({) 72 159 T
(XFS_DINODE_FMT_AGINO,) 108 148 T
(/* free inodes: di_next */) 221.24 148 T
(XFS_DINODE_FMT_DEV,) 108 137 T
(/* CHR, BLK: di_dev */) 210.46 137 T
(XFS_DINODE_FMT_LOCAL,) 108 126 T
(/* DIR, REG, LNK: di_c */) 221.24 126 T
(XFS_DINODE_FMT_EXTENTS,) 108 115 T
(/* DIR, REG, LNK: di_bmx */) 232.03 115 T
(XFS_DINODE_FMT_BTREE,) 108 104 T
(/* DIR, REG, LNK: di_bmbt */) 221.24 104 T
(XFS_DINODE_FMT_UUID) 108 93 T
(/* MNT: di_uuid */) 215.85 93 T
(} xfs_dinode_fmt_t;) 72 82 T
FMENDPAGE
%%EndPage: "6" 7
%%Page: "7" 7
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Inode Numbers) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(7) 500 42.62 T
1 36 Q
4 K
(Inode Numbers) 194.54 696 T
1 18 Q
0 K
(Inode numbers consist of three parts:) 72 648 T
1 14 Q
(1.) 72 624.67 T
(allocation group number) 85.75 624.67 T
(2.) 72 602.67 T
(block number in the allocation group) 85.75 602.67 T
(3.) 72 580.67 T
(index of the inode in its block) 85.75 580.67 T
1 18 Q
(The current layout has:) 72 550 T
2 9 Q
(/*) 72 530 T
( * low sb_inopblog bits - offset in block) 72 519 T
( * next 32 - sb_blocklog bits - block number in allocation group) 72 508 T
( * next 32 bits - allocation group number) 72 497 T
( * high sb_blocklog - sb_inopblog bits - 0) 72 486 T
( */) 72 475 T
1 18 Q
(The layout will be changed soon to have the middle \336eld be) 72 447 T
(shorter) 72 427 T
(, its width will depend on the allocation group size. This) 121.24 427 T
(will allow more inode numbers to \336t in 32 bits.) 72 407 T
(Macros are used to construct and deconstruct inode numbers.) 72 375 T
(The low two \336elds are also referred to as the \322allocation group) 72 355 T
(inode number\323, or xfs_agino_t.) 72 335 T
2 9 Q
(#def) 72 304 T
(ine) 93.57 304 T
(xfs_mask\050k\051) 144 304 T
(\050\0501 << k\051 - 1\051) 216 304 T
(#def) 72 293 T
(ine) 93.57 293 T
(xfs_ino_offset_bits\050s\051) 144 293 T
(\050\050s\051->sb_inopblog\051) 262.63 293 T
(#def) 72 282 T
(ine) 93.57 282 T
(xfs_ino_agbno_bits\050s\051) 144 282 T
(\05032 - \050s\051->sb_blocklog\051) 257.24 282 T
(#def) 72 271 T
(ine) 93.57 271 T
(xfs_ino_agino_bits\050s\051) 144 271 T
(\050xfs_ino_offset_bits\050s\051 + xfs_ino_agbno_bits\050s\051\051) 257.24 271 T
(#def) 72 260 T
(ine) 93.57 260 T
(xfs_ino_agno_bits\050s\051) 144 260 T
(32) 251.85 260 T
(#def) 72 238 T
(ine) 93.57 238 T
(xfs_ino_to_agno\050s,i\051) 144 238 T
(\050\050xfs_agnumber_t\051\050\050i\051 >> xfs_ino_agino_bits\050s\051\051\051) 251.85 238 T
(#def) 72 227 T
(ine) 93.57 227 T
(xfs_ino_to_agino\050s,i\051) 144 227 T
(\050\050xfs_agino_t\051\050i\051 & xfs_mask\050xfs_ino_agino_bits\050s\051\051\051) 257.24 227 T
(#def) 72 216 T
(ine) 93.57 216 T
(xfs_ino_to_agbno\050s,i\051) 144 216 T
(\134) 257.24 216 T
-0.13 ( \050\050\050xfs_agblock_t\051\050i\051 >> xfs_ino_offset_bits\050s\051\051 & xfs_mask\050xfs_ino_agbno_bits\050s\051\051\051) 72 205 P
(#def) 72 194 T
(ine) 93.57 194 T
(xfs_ino_to_offset\050s,i\051) 144 194 T
(\050\050int\051\050i\051 & xfs_mask\050xfs_ino_offset_bits\050s\051\051\051) 262.63 194 T
(#def) 72 172 T
(ine) 93.57 172 T
(xfs_agino_to_ino\050s,a,i\051) 144 172 T
(\050\050\050xfs_ino_t\051\050a\051 << xfs_ino_agino_bits\050s\051\051 | \050i\051\051) 268.03 172 T
(#def) 72 161 T
(ine) 93.57 161 T
(xfs_agino_to_agbno\050s,i\051) 144 161 T
(\050\050i\051 >> xfs_ino_offset_bits\050s\051\051) 268.03 161 T
(#def) 72 150 T
(ine) 93.57 150 T
(xfs_agino_to_offset\050s,i\051) 144 150 T
(\050\050i\051 & xfs_mask\050xfs_ino_offset_bits\050s\051\051\051) 273.42 150 T
(#def) 72 128 T
(ine) 93.57 128 T
(xfs_offbno_to_agino\050s,b,o\051) 144 128 T
( \134) 284.2 128 T
(\050\050xfs_agino_t\051\050\050\050b\051 << xfs_ino_offset_bits\050s\051\051 | \050o\051\051\051) 216 117 T
FMENDPAGE
%%EndPage: "7" 8
%%Page: "8" 8
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Btr) 72 42.62 T
(ee Cursors) 82.51 42.62 T
(December 16, 1993) 255.07 42.62 T
(8) 500 42.62 T
1 36 Q
4 K
(Btree Cursors) 206.53 696 T
1 18 Q
0 K
-0.05 (Our current working position in a btree is recorded in a structure) 72 648 P
(called a \322cursor\323 \050xfs_btree_cur_t\051. The cursor contains identi-) 72 628 T
-0.07 (fying information \050which btree, for example\051 that allows generic) 72 608 P
(code to be useful. It also contains a buf) 72 588 T
(fer pointer for each level) 357.47 588 T
-0.74 (in the btree, and an index number \050pointer\051 of a record within that) 72 568 P
(btree block.) 72 548 T
(Cursors are used as the interface with all btree services. For) 72 516 T
(example, to do a btree insertion, there are the following steps:) 72 496 T
1 14 Q
(1.) 72 472.67 T
(Allocate / initialize a cursor) 85.75 472.67 T
(2.) 72 450.67 T
(Do a lookup to \336nd the insertion location and set the insertion value) 85.75 450.67 T
(3.) 72 428.67 T
(Do an insert operation) 85.75 428.67 T
(4.) 72 406.67 T
(Delete the cursor) 85.75 406.67 T
2 9 Q
(typedef struct xfs_btree_cur) 72 382 T
({) 72 371 T
(xfs_trans_t) 108 360 T
(*bc_tp;) 180 360 T
(/* links cursors on freelist */) 252 360 T
(xfs_mount_t) 108 349 T
(*bc_mp;) 180 349 T
(/* mount struct */) 252 349 T
(buf_t) 108 338 T
(*bc_agbuf;) 180 338 T
(/* ag buffer */) 252 338 T
(xfs_agnumber_t) 108 327 T
(bc_agno;) 183.49 327 T
(/* ag number */) 252 327 T
(union {) 108 316 T
(xfs_alloc_rec_t) 144 305 T
(a;) 252 305 T
(/* btree records */) 288 305 T
(xfs_bmbt_irec_t) 144 294 T
(b;) 252 294 T
(}) 108 283 T
(bc_rec;) 180 283 T
(buf_t) 108 272 T
(*bc_bufs[XFS_BTREE_MAXLEVELS];) 180 272 T
(/* buffer pointers */) 360 272 T
(int) 108 261 T
(bc_ptrs[XFS_BTREE_MAXLEVELS];) 180 261 T
(/* record/pointer numbers */) 360 261 T
(int) 108 250 T
(bc_nlevels;) 180 250 T
(/* number of btree levels */) 252 250 T
(xfs_btnum_t) 108 239 T
(bc_btnum;) 180 239 T
(/* btree identif) 252 239 T
(ier */) 338.28 239 T
(int) 108 228 T
(bc_blocklog;) 180 228 T
(/* block size of f) 252 228 T
(ile system */) 349.06 228 T
(union {) 108 217 T
(struct {) 144 206 T
(int) 180 195 T
(inodesize;) 288 195 T
(/* needed for BMAP */) 360 195 T
(struct xfs_inode) 180 184 T
(*ip;) 288 184 T
(/* needed for BMAP */) 360 184 T
(} b;) 144 173 T
(/* type b private data */) 252 173 T
(}) 108 162 T
(bc_private;) 180 162 T
(/* type-private data */) 252 162 T
(} xfs_btree_cur_t;) 72 151 T
FMENDPAGE
%%EndPage: "8" 9
%%Page: "9" 9
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Main Btr) 72 42.62 T
(ee Interfaces) 103.05 42.62 T
(December 16, 1993) 255.07 42.62 T
(9) 500 42.62 T
1 36 Q
4 K
(Main Btree Interfaces) 149.08 696 T
1 18 Q
0 K
(Btree code is replicated for extent allocation and \336le space allo-) 72 648 T
(cation. Pre\336x for code is xfs_alloc_ or xfs_bmbt_.) 72 628 T
(The main interfaces are:) 72 596 T
2 9 Q
(int delete\050xfs_btree_cur_t *cur\051;) 72 576 T
(int insert\050xfs_btree_cur_t *cur\051;) 72 565 T
(int lookup_eq\050xfs_btree_cur_t *cur, xfs_agblock_t bno, xfs_extlen_t len\051;) 72 554 T
(int lookup_ge\050xfs_btree_cur_t *cur, xfs_agblock_t bno, xfs_extlen_t len\051;) 72 543 T
(int lookup_le\050xfs_btree_cur_t *cur, xfs_agblock_t bno, xfs_extlen_t len\051;) 72 532 T
(int update\050xfs_btree_cur_t *cur, xfs_agblock_t bno, xfs_extlen_t len\051;) 72 521 T
1 18 Q
-0.62 (The ar) 72 482 P
-0.62 (guments to the lookup and update calls match the elements) 117.5 482 P
(of the btree records: block number and length for the freespace) 72 462 T
(btrees; \336le of) 72 442 T
(fset, block number) 166.61 442 T
(, and length for the bmap btree.) 300.3 442 T
-0.16 (The lookup interfaces specify where \050exactly\051 to stop the search:) 72 410 P
(at a record exactly equal to, less than or equal to, or greater than) 72 390 T
(or equal to the requested record. The lookup_gt and lookup_lt) 72 370 T
(interfaces are not present because none of my code needs them.) 72 350 T
(Insert inserts a record whose value was speci\336ed by the most) 72 318 T
(recent lookup call, or alternatively stored in the cursor by the) 72 298 T
(caller) 72 278 T
(. If the latter method is used, the cursor must still be point-) 110.97 278 T
(ing to the right place in the btree after the most recent lookup.) 72 258 T
(Delete deletes the record last looked up.) 72 226 T
(There are interfaces to adjust the cursor position other than by) 72 194 T
(doing a lookup, given on the next slide.) 72 174 T
FMENDPAGE
%%EndPage: "9" 10
%%Page: "10" 10
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Btr) 72 42.62 T
(ee Service Routines) 82.51 42.62 T
(December 16, 1993) 255.07 42.62 T
(10) 496 42.62 T
1 36 Q
4 K
(Btree Service Routines) 140.04 696 T
1 18 Q
0 K
(Some of these are lower) 72 648 T
(-level routines in the btree implementa-) 245.5 648 T
(tions, some are secondary interfaces used by the callers of the) 72 628 T
-0.01 (high-level btree interfaces. The xfs_btree_... routines are shared) 72 608 P
(between both implementations.) 72 588 T
2 9 Q
(void xfs_btree_del_cursor\050xfs_btree_cur_t *cur\051;) 72 568 T
(xfs_btree_cur_t *xfs_btree_dup_cursor\050xfs_btree_cur_t *cur\051;) 72 557 T
(int xfs_btree_f) 72 546 T
(irstrec\050xfs_btree_cur_t *cur, int level\051;) 152.89 546 T
-0.16 (xfs_btree_cur_t *xfs_btree_init_cursor\050xfs_mount_t *mp, xfs_trans_t *tp, buf_t *agbuf,) 72 535 P
(xfs_agnumber_t agno, xfs_btnum_t btno, struct xfs_inode *ip\051;) 72 525 T
(int xfs_btree_lastrec\050xfs_btree_cur_t *cur, int level\051;) 72 514 T
(int decrement\050xfs_btree_cur_t *cur, int level\051;) 72 492 T
(int delrec\050xfs_btree_cur_t *cur, int level\051;) 72 481 T
(int get_rec\050xfs_btree_cur_t *cur, xfs_agblock_t *bnop, xfs_extlen_t *lenp\051;) 72 470 T
(int increment\050xfs_btree_cur_t *cur, int level\051;) 72 459 T
-0.73 (int insrec\050xfs_btree_cur_t *cur, int level, xfs_agblock_t *bnop, xfs_alloc_rec_t *recp,) 72 448 P
(xfs_btree_cur_t **curp\051;) 72 438 T
(int lookup\050xfs_btree_cur_t *cur, xfs_lookup_t mode\051;) 72 427 T
(int lshift\050xfs_btree_cur_t *cur, int level\051;) 72 416 T
(int newroot\050xfs_btree_cur_t *cur\051;) 72 405 T
(int rshift\050xfs_btree_cur_t *cur, int level\051;) 72 394 T
-0.13 (int split\050xfs_btree_cur_t *cur, int level, xfs_agblock_t *bnop, xfs_alloc_rec_t *recp,) 72 383 P
(xfs_btree_cur_t **curp\051;) 72 373 T
(void updkey\050xfs_btree_cur_t *cur, xfs_alloc_rec_t *keyp, int level\051;) 72 362 T
1 18 Q
-0.34 (Decrement and increment are used to move around in the tree, as) 72 334 P
(are \050less frequently\051 \336rstrec and lastrec.) 72 314 T
(Insrec and delrec do one level\325) 72 282 T
(s worth of insert/delete for the) 292.31 282 T
(insert/delete routines.) 72 262 T
(Lshift and rshift do balancing \0501 record at a time\051 for insrec and) 72 230 T
(delrec.) 72 210 T
(Split is used by insrec to do block splits.) 72 178 T
(Updkey marches up the tree setting the key values if the \336rst) 72 146 T
(record in a block is changed.) 72 126 T
FMENDPAGE
%%EndPage: "10" 11
%%Page: "11" 11
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Space Allocation Interfaces) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(1) 496.44 42.62 T
(1) 500 42.62 T
1 36 Q
4 K
(Space Allocation Interfaces) 107.09 696 T
1 18 Q
0 K
(These interfaces are used to allocate and free extents of disk) 72 648 T
(space.) 72 628 T
2 9 Q
(typedef enum xfs_alloctype) 72 608 T
({) 72 597 T
(XFS_ALLOCTYPE_ANY_AG,) 108 586 T
(/* Any allocation group ok */) 252 586 T
(XFS_ALLOCTYPE_START_AG,) 108 575 T
(/* start with this bno\325s allocation group */) 252 575 T
(XFS_ALLOCTYPE_THIS_AG,) 108 564 T
(/* must be somewhere in bno\325s allocation group */) 252 564 T
(XFS_ALLOCTYPE_NEAR_BNO,) 108 553 T
(/* must be in bno\325s ag and near bno */) 252 553 T
(XFS_ALLOCTYPE_THIS_BNO) 108 542 T
(/* must be at exactly bno */) 252 542 T
(} xfs_alloctype_t;) 72 531 T
(xfs_fsblock_t xfs_alloc_extent\050xfs_trans_t *tp, xfs_fsblock_t bno, xfs_extlen_t len,) 72 509 T
(xfs_alloctype_t f) 72 499 T
(lag\051;) 163.67 499 T
(xfs_agblock_t xfs_alloc_next_free\050xfs_mount_t *mp, xfs_trans_t *tp, buf_t *agbuf,) 72 488 T
(xfs_agblock_t bno\051;) 72 478 T
-0.05 (xfs_fsblock_t xfs_alloc_vextent\050xfs_trans_t *tp, xfs_fsblock_t bno,) 72 467 P
(xfs_extlen_t minlen, xfs_extlen_t maxlen, xfs_extlen_t *len, xfs_alloctype_t f) 72 457 T
(lag\051;) 492.61 457 T
(int xfs_free_extent\050xfs_trans_t *tp, xfs_fsblock_t bno, xfs_extlen_t len\051;) 72 446 T
1 18 Q
(The generic allocation routine is xfs_alloc_vextent \050variable) 72 407 T
(extent\051; xfs_alloc_extent is implemented with it.) 72 387 T
(It is given a transaction, an allocation mode, a minimum and a) 72 355 T
-0.39 (maximum length, and a block number) 72 335 P
-0.39 (. It attempts to allocate the) 342.88 335 P
-0.22 (maximum block it can, less than or equal to maxlen, greater than) 72 315 P
(or equal to minlen.) 72 295 T
-0.62 (The \337ag ar) 72 263 P
-0.62 (gument controls its behavior as given in the comments) 148.36 263 P
(above.) 72 243 T
(The free_extent routine just frees the extent given by bno and) 72 211 T
(len; the frees don\325) 72 191 T
(t have to match the allocations.) 202.07 191 T
(The next_free routine is used to scan the freelist held by this) 72 159 T
(code; it\325) 72 139 T
(s really an internal routine, exposed for the debugging) 130.47 139 T
(code to print the list with.) 72 119 T
FMENDPAGE
%%EndPage: "11" 12
%%Page: "12" 12
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Space Allocation Internals) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(12) 496 42.62 T
1 36 Q
4 K
(Space Allocation Internals) 115.06 696 T
1 18 Q
0 K
(Space allocation maintains two btrees representing free space in) 72 648 T
(the \336le system. The btrees are named BNO and CNT) 72 628 T
(. BNO is) 455.89 628 T
(sorted by block number) 72 608 T
(, CNT by extent length. Each contains) 241.66 608 T
(exactly the same data, only in a dif) 72 588 T
(ferent order) 322.49 588 T
(.) 405.91 588 T
(Each allocation \336rst selects an allocation group to allocate from;) 72 556 T
(this is iterative for XFS_ALLOCTYPE_ANY_AG and) 72 536 T
(XFS_ALLOCTYPE_ST) 72 516 T
(AR) 247.48 516 T
(T_AG. Then the routine xfs_allo-) 271.38 516 T
(c_ag_vextent is called, with ar) 72 496 T
(guments as for xfs_alloc_vextent) 291.01 496 T
(plus an allocation group number and buf) 72 476 T
(fer) 363.48 476 T
(. The \337ag ar) 382.45 476 T
(gument) 473.56 476 T
(has been reduced to the three in-allocation group cases.) 72 456 T
(xfs_alloc_ag_vextent reduces to a switch out to routines xfs_al-) 72 424 T
(loc_ag_vextent_{size, near) 72 404 T
(, exact}, plus bookkeeping.) 266.76 404 T
(These three routines implement all the allocation policy) 72 372 T
(.) 472.06 372 T
(xfs_free_extent reduces to some address translation and a call to) 72 340 T
-0.64 (xfs_free_ag_extent. It checks for adjacent freespace, and mer) 72 320 P
-0.64 (ges) 512.16 320 P
(it with the new freespace if present. The two btrees are adjusted) 72 300 T
(by inserts and updates to accomplish this.) 72 280 T
-0.26 (T) 72 248 P
-0.26 (o avoid running out of space in the middle of operations, and to) 81.73 248 P
(avoid calling itself recursively to obtain space, this code main-) 72 228 T
(tains a set of blocks on a list, that it can use.) 72 208 T
FMENDPAGE
%%EndPage: "12" 13
%%Page: "13" 13
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xfs_alloc_ag_vextent_size \050example\051) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(13) 496 42.62 T
1 36 Q
4 K
(xfs_alloc_ag_vextent_size) 115.06 696 T
(\050example\051) 233.04 654 T
2 9 Q
0 K
(xfs_agblock_t) 72 612 T
(xfs_alloc_ag_vextent_size\050xfs_trans_t *tp, buf_t *agbuf, xfs_agnumber_t agno, xfs_ex-) 72 601 T
(tlen_t minlen, xfs_extlen_t maxlen, xfs_extlen_t *len\051) 72 591 T
({) 72 580 T
(xfs_btree_cur_t *bno_cur;) 108 569 T
(xfs_btree_cur_t *cnt_cur;) 108 558 T
(xfs_agblock_t fbno;) 108 547 T
(xfs_extlen_t f) 108 536 T
(len = 0;) 183.49 536 T
(int i;) 108 525 T
(xfs_extlen_t rlen;) 108 514 T
(xfs_mount_t *mp;) 108 503 T
(mp = tp->t_mountp;) 108 481 T
(cnt_cur = xfs_btree_init_cursor\050mp, tp, agbuf, agno, XFS_BTNUM_CNT, 0\051;) 108 470 T
(if \050!xfs_alloc_lookup_ge\050cnt_cur, 0, maxlen\051\051 {) 108 459 T
(if \050xfs_alloc_decrement\050cnt_cur, 0\051\051) 144 448 T
(xfs_alloc_get_rec\050cnt_cur, &fbno, &f) 180 437 T
(len\051;) 374.13 437 T
(if \050f) 144 426 T
(len < minlen\051 {) 170.96 426 T
(xfs_btree_del_cursor\050cnt_cur\051;) 180 415 T
(return NULLAGBLOCK;) 180 404 T
(}) 144 393 T
(rlen = f) 144 382 T
(len;) 187.14 382 T
(} else {) 108 371 T
(xfs_alloc_get_rec\050cnt_cur, &fbno, &f) 144 360 T
(len\051;) 338.13 360 T
(rlen = maxlen;) 144 349 T
(}) 108 338 T
(xfs_alloc_delete\050cnt_cur\051;) 108 327 T
(bno_cur = xfs_btree_init_cursor\050mp, tp, agbuf, agno, XFS_BTNUM_BNO, 0\051;) 108 316 T
(i = xfs_alloc_lookup_eq\050bno_cur, fbno, f) 108 305 T
(len\051;) 323.7 305 T
(if \050rlen < f) 108 294 T
(len\051 {) 172.71 294 T
(xfs_alloc_lookup_eq\050cnt_cur, fbno + rlen, f) 144 283 T
(len - rlen\051;) 375.88 283 T
(xfs_alloc_insert\050cnt_cur\051;) 144 272 T
(xfs_alloc_update\050bno_cur, fbno + rlen, f) 144 261 T
(len - rlen\051;) 359.7 261 T
(} else) 108 250 T
(xfs_alloc_delete\050bno_cur\051;) 144 239 T
(*len = rlen;) 108 228 T
(xfs_btree_del_cursor\050bno_cur\051;) 108 217 T
(xfs_btree_del_cursor\050cnt_cur\051;) 108 206 T
(return fbno;) 108 195 T
(}) 72 184 T
FMENDPAGE
%%EndPage: "13" 14
%%Page: "14" 14
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Inode Allocation Interfaces) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(14) 496 42.62 T
1 36 Q
4 K
(Inode Allocation Interfaces) 109.09 696 T
1 18 Q
0 K
(Disk inode allocation is done in the layer below xfs_ialloc. The) 72 648 T
-0.01 (routine xfs_dialloc turns a free inode into an allocated inode and) 72 628 P
-0.58 (returns it to the caller) 72 608 P
-0.58 (. It also may allocate more inodes \050turn free) 222.57 608 P
(blocks into inode blocks\051 if necessary) 72 588 T
(.) 342.14 588 T
(xfs_difree is used to turn used inodes into free inodes.) 72 556 T
-0.72 (W) 72 524 P
-0.72 (e never turn free inodes into free blocks, although I suppose we) 87.54 524 P
(could.) 72 504 T
(xfs_dilocate is used to turn an inode number into an inode loca-) 72 472 T
(tion; it is very simple. The inode\325) 72 452 T
(s location is returned in ar) 315.87 452 T
(gu-) 502.92 452 T
(ments bno and of) 72 432 T
(f.) 196.1 432 T
-0.28 (In an earlier version of this code, btrees were used to map inodes) 72 400 P
(to locations; this has all been removed in favor of storing the) 72 380 T
(block numbers in the inode numbers.) 72 360 T
2 9 Q
(xfs_ino_t xfs_dialloc\050xfs_trans_t *tp, xfs_ino_t parent, int sameag, mode_t mode\051;) 72 329 T
(xfs_agino_t xfs_dialloc_next_free\050xfs_mount_t *mp, xfs_trans_t *tp, buf_t *agbuf,) 72 318 T
(xfs_agino_t agino\051;) 72 308 T
(xfs_agino_t xfs_difree\050xfs_trans_t *tp, xfs_ino_t inode\051;) 72 297 T
(int xfs_dilocate\050xfs_mount_t *mp, xfs_trans_t *tp, xfs_ino_t ino, xfs_fsblock_t *bno,) 72 286 T
(int *off\051;) 72 276 T
FMENDPAGE
%%EndPage: "14" 15
%%Page: "15" 15
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Inode Allocation Internals) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(15) 496 42.62 T
1 36 Q
4 K
(Inode Allocation Internals) 117.06 696 T
1 18 Q
0 K
(This code is very simple now) 72 648 T
(. There are two internal routines:) 282.2 648 T
2 9 Q
(int /* success/failure */) 72 628 T
(xfs_ialloc_ag_alloc\050xfs_trans_t *tp, /* transaction pointer */) 72 617 T
( buf_t *agbuf\051; /* alloc grp buffer */) 72 606 T
(buf_t * /* allocation group buffer */) 72 584 T
(xfs_ialloc_ag_select\050xfs_trans_t *tp, /* transaction pointer */) 72 573 T
( xfs_ino_t parent, /* parent directory inode number */) 72 562 T
( int sameag, /* =1 to force to same ag. as parent */) 72 551 T
( mode_t mode\051; /* bits set to indicate f) 72 540 T
(ile type */) 422.51 540 T
1 18 Q
(Xfs_ialloc_ag_select is used to select an allocation group to do) 72 501 T
(the inode allocation in; the code in xfs_dialloc iterates through) 72 481 T
(other allocation groups, if the \336rst is unsuccessful, and it isn\325) 72 461 T
(t) 510.4 461 T
(told not to.) 72 441 T
(Xfs_ialloc_ag_alloc allocates new inodes from freespace, if nec-) 72 409 T
(essary to satisfy the xfs_dialloc request.) 72 389 T
(Inodes are allocated in chunks of from 1 block to 256 inodes or) 72 357 T
(16 blocks, whichever is smaller) 72 337 T
(. A variable extent allocation is) 298.35 337 T
(used, where the block number is one past the previously allo-) 72 317 T
(cated inodes.) 72 297 T
FMENDPAGE
%%EndPage: "15" 16
%%Page: "16" 16
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Block Mapping Interfaces) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(16) 496 42.62 T
1 36 Q
4 K
(Block Mapping Interfaces) 118.07 696 T
1 18 Q
0 K
(The main interface to block mapping is xfs_bmap. This routine) 72 648 T
(does not exist yet.) 72 628 T
(The routine xfs_bmapi is an inode version of xfs_bmap. It is) 72 596 T
(given an inode, a \336le of) 72 576 T
(fset and length, a read/write \337ag, and an) 241.56 576 T
(array of extent descriptors \050and its size\051. It \336lls in the extent) 72 556 T
(descriptors, and for writes into holes \050or past the end of \336le\051 it) 72 536 T
(allocates space to the \336le as well.) 72 516 T
2 9 Q
(void xfs_bmapi\050xfs_mount_t *mp, xfs_trans_t *tp, struct xfs_inode *ip, xfs_fsblock_t) 72 485 T
(bno, xfs_extlen_t len, int rw, xfs_bmbt_irec_t *maps, int *nmaps\051;) 72 475 T
FMENDPAGE
%%EndPage: "16" 17
%%Page: "17" 17
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(In-cor) 72 42.62 T
(e Inode Format) 92.94 42.62 T
(December 16, 1993) 255.07 42.62 T
(17) 496 42.62 T
1 36 Q
4 K
(In-core Inode Format) 152.07 696 T
1 18 Q
0 K
(Only the portion of the inode relevant to block mapping is dis-) 72 648 T
(cussed here!) 72 628 T
(The inode points to an array of extents, which is sorted by of) 72 596 T
(fset) 508.87 596 T
(in the \336le. This array is generated \050for btree-format \336les\051 by the) 72 576 T
(routine xfs_bmap_read_extents; for extent-format \336les the array) 72 556 T
(lives in the disk inode and is just copied into the incore array) 72 536 T
(.) 508.55 536 T
(For btree-format \336les, the bmap btree root is also pointed to by) 72 504 T
(the incore inode. The btree code manipulates this root just as it) 72 484 T
(manipulates all the other blocks in the tree, with all the macros) 72 464 T
(knowing the dif) 72 444 T
(ference.) 185.61 444 T
FMENDPAGE
%%EndPage: "17" 18
%%Page: "18" 18
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Pr) 72 750.67 T
(oprietary) 139.57 750.67 T
(Space Manager Overview) 242.42 750.67 T
(Doug Doucette) 450.38 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(Block Mapping Internals) 72 42.62 T
(December 16, 1993) 255.07 42.62 T
(18) 496 42.62 T
1 36 Q
4 K
(Block Mapping Internals) 126.04 696 T
1 18 Q
0 K
-0.29 (Block mapping for extent-format \336les is simple; the extent list in) 72 648 P
-0.81 (core is searched \050binary) 72 628 P
-0.81 (, eventually\051. New records are inserted or) 239.74 628 P
(appended to the list.) 72 608 T
(For btree-format \336les, in addition, the btree must be searched) 72 576 T
(\050xfs_bmbt_lookup_eq\051 and then inserted to or updated depend-) 72 556 T
(ing on whether the new extent is adjacent to the old extents or) 72 536 T
(not. The btree interfaces used are exactly the same as for) 72 516 T
(freespace allocation.) 72 496 T
(xfs_bmapi has four basic sections:) 72 464 T
1 14 Q
(1.) 72 440.67 T
(Figure out where the \336rst extent-list record to look at is.) 85.75 440.67 T
(2.) 72 418.67 T
(Map \050and allocate if necessary\051 the \336le space into \336le system blocks) 85.75 418.67 T
(3.) 72 396.67 T
-0.03 (If the \336le is extents-format and now has too many extents to \336t in the disk inode,) 85.75 396.67 P
(convert the \336le to btree-format.) 85.75 380.67 T
(4.) 72 358.67 T
(Log all the changes.) 85.75 358.67 T
FMENDPAGE
%%EndPage: "18" 19
%%Trailer
%%BoundingBox: 0 0 612 792
%%Pages: 18 1
%%DocumentFonts: Palatino-Roman
%%+ Times-Roman
%%+ Courier
%%+ Courier-Bold