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

File: [Development] / xfs-website / design_docs / xfsdocs93_ps / attributes.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

%!
%%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 9 FMDOCUMENT
0 0 /Times-Roman FMFONTDEFINE
1 0 /Times-Bold FMFONTDEFINE
2 0 /Times-BoldItalic FMFONTDEFINE
3 0 /Times-Italic FMFONTDEFINE
4 0 /Courier 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 Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(1) 500 42.62 T
1 24 Q
(xFS Attribute Manager Design) 147.77 704 T
1 12 Q
(Curtis Anderson) 263.19 674 T
134.46 642.22 72 642.22 2 L
V
1.71 H
0 Z
N
1 18 Q
(1.0  Intr) 72 644 T
201.12 642.22 134.14 642.22 2 L
V
N
(oduction) 134.14 644 T
0 12 Q
-0.18 (This document describes the requirements and proposed implementation for the attribute manage-) 72 622 P
2.35 (ment functions of the xFS \336lesystem. Note that only the attribute features are de\336ned here,) 72 608 P
(namespace management, space management and other features are described elsewhere.) 72 594 T
0.07 (The Attribute Manager is accessible via extended VNODE calls and provides the ability to attach) 72 576 P
0.57 (a \050name, value\051 pair to any \336lesystem object. This is accomplished by using the split-inode sup-) 72 562 P
0.11 (port in the Space Manager and storing specialized structures in the second \322fork\323. The names use) 72 548 P
(the same character set as pathnames do, while the values are short arrays of arbitrary bytes.) 72 534 T
0.26 (The reader will notice the extreme similarity between the Attribute Manager and the NameSpace) 72 516 P
0.62 (Manager designs. This is intentional, they are parallel in the system architecture and will in fact) 72 502 P
(share portions of code.) 72 488 T
157.45 456.22 72 456.22 2 L
V
N
1 18 Q
(2.0  Requir) 72 458 T
352.03 456.22 157.13 456.22 2 L
V
N
(ements and Functionality) 157.13 458 T
1 14 Q
(2.1 Requir) 72 428.67 T
(ements) 134.71 428.67 T
0 12 Q
(Here are the external requirements for the attribute management code in xFS.) 72 412 T
1 F
(2.1.1 Standard VNODE Operations and Semantics) 72 392 T
0 F
0.14 (This \336lesystem has to operate in a fairly standard VFS/VNODE environment, so all the attribute-) 72 376 P
0.87 (related entry points and ar) 72 362 P
0.87 (guments have to be similar to, but an extension of, the existing VFS/) 200.48 362 P
(VNODE interfaces.) 72 348 T
1 F
(2.1.2 Fast for Small Attribute Lists) 72 328 T
0 F
1.46 (The attribute operations must be relatively fast for small numbers of attributes, but operations) 72 312 P
0.41 (with lar) 72 298 P
0.41 (ge numbers of attributes are not required to be fast. In fact, the proposed implementation) 109.17 298 P
0.96 (will have nearly the same performance characteristics as that of directories, but there is still no) 72 284 P
(commitment to fast access when the number of attributes grows lar) 72 270 T
(ge.) 393.55 270 T
1 F
(2.1.3 Associated with all NameSpace Objects) 72 250 T
0 F
-0.14 (It should be possible to associate arbitrary attributes with any type of namespace object, including) 72 234 P
(directories and symlinks.) 72 220 T
1 F
(2.1.4 Internationalization) 72 200 T
0 F
(It should be possible to store attributes whose names are in an international character set.) 72 184 T
1 F
(2.1.5 Location Independence \050Distributed Naming\051) 72 164 T
0 F
-0.03 (Hooks must be available to support the planned distributed \336lesystem. This implies that attributes) 72 148 P
(must be accessible remotely just as they are accessed locally) 72 134 T
(.) 361.33 134 T
1 F
(2.1.6 SGI-Enhanced NFS Support) 72 114 T
0 F
0.4 (It is highly desirable that SGI\325) 72 98 P
0.4 (s superset of the NFS protocol \050used between consenting SGI sys-) 218.9 98 P
(tems\051 support attribute operations.) 72 84 T
FMENDPAGE
%%EndPage: "1" 2
%%Page: "2" 2
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(2) 500 42.62 T
108.64 710.82 72 710.82 2 L
V
0.65 H
0 Z
N
2 12 Q
-0.02 (NOTE:) 72 712 P
0 F
-0.02 ( The enhanced protocol has not been de\336ned yet and there is some concern about the rela-) 108.64 712 P
0.22 (tive timing of the enhanced NFS versus the distributed \336lesystem support that will appear as part) 72 698 P
(of xFS in the future.) 72 684 T
1 F
(2.1.7 Size of Attribute V) 72 664 T
(alues) 194.14 664 T
0 F
(An attribute should be able to hold a value of up to 2KB.) 72 648 T
108.64 628.82 72 628.82 2 L
V
N
2 F
(NOTE:) 72 630 T
0 F
( There may be a call for lar) 108.64 630 T
(ger values, possibly up to 16MB, but this is being resisted.) 238.64 630 T
1 F
(2.1.8 ACLs) 72 610 T
0 F
1.59 (The requirement for Access Control Lists \050ACLs\051 is not limited to US Military Orange Book) 72 594 P
0.4 (security) 72 580 P
0.4 (, but should also accommodate the requirements of similar \322commercial security\323 imple-) 109.19 580 P
(mentations.) 72 566 T
(ACLs and other security-related tags should be treated as special forms of arbitrary attributes.) 72 548 T
1 14 Q
(2.2 Functionality \050ie: Attribute Semantics\051) 72 520.67 T
0 12 Q
0.14 (This section describes what attributes are and what they can do. The implementation of attributes) 72 504 P
(is described in a following section.) 72 490 T
0.44 (Arbitrary attributes are \050name, value\051 pairs that applications and/or the system can associate will) 72 472 P
0.06 (\336lesystem objects. One example is tape header information for \336les that have migrated to of) 72 458 P
0.06 (f-line) 514.02 458 P
(storage. Another example is the character set used to encode text within a \336le.) 72 444 T
0.5 (Equivalents of the timestamps, etc, will not be maintained for the individual attributes \050eg: there) 72 426 P
(will be no indication of when a particular attribute was last changed\051.) 72 412 T
1 F
(2.2.1 Attribute Naming) 72 392 T
0 F
0.25 (Attribute names will be composed of exactly the same character sets as \336le names, and will have) 72 376 P
0.75 (the same length restrictions. Attribute names will support international character sets, subject to) 72 362 P
0.54 (the above length restrictions. The intention is that people in Japan can use Kanji names for their) 72 348 P
(attributes.) 72 334 T
1.11 (All attribute names should be stored as a byte string and a length; in the long term, we cannot) 72 316 P
0.69 (depend on a NULL character terminating a string. Current interface styles require NULL termi-) 72 302 P
(nated strings, but the on-disk structures should support \050text, length\051 pairs.) 72 288 T
0.02 (Name con\337icts between dif) 72 270 P
0.02 (ferent users of attribute names \050applications\051 will be handled the same) 203.4 270 P
0.07 (way that \336lename con\337icts between dif) 72 256 P
0.07 (ferent applications is handled now: the last one overwrites) 260.32 256 P
0.14 (the previous ones. It is up to the application to provide a suf) 72 242 P
0.14 (\336ciently dif) 360.93 242 P
0.14 (ferentiated attribute name) 416.49 242 P
0 (such that other well-behaved applications will not stomp on it. For example: \322SGI_toto_...\323 could) 72 228 P
(be used as a pre\336x for all attribute names used by the \322T) 72 214 T
(oto\323 package produced by SGI.) 341.62 214 T
1 F
(2.2.2 Attribute Access Model) 72 194 T
0 F
1.81 (The model used to access attributes can be called the \322small \336xed data\323 model. In this case,) 72 178 P
1.51 (attributes are second class objects in the \336lesystem, and do not appear in the namespace. The) 72 164 P
(value of an attribute can only be a small object of a few kilobytes or less.) 72 150 T
-0.19 (In this model, the way that attributes are accessed and managed is very similar to that way that the) 72 132 P
1.52 (stat\050\051 system call works. A get/set/delete operation is performed on the pathname or open \336le) 72 118 P
1.16 (descriptor of interest. One ar) 72 104 P
1.16 (gument to the operation is the attribute name, while the other is a) 213.97 104 P
1.02 (pointer to a block of memory that contains/will-contain the complete image of the value of the) 72 90 P
(attribute being operated on.) 72 76 T
FMENDPAGE
%%EndPage: "2" 3
%%Page: "3" 3
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(3) 500 42.62 T
0 12 Q
1.45 (Existing \336le attributes for the \322data fork\323 such as owner) 72 712 P
1.45 (, group ID, timestamps, etc. might be) 352.73 712 P
(made available through this type of interface.) 72 698 T
0.16 (The list of attributes that are attached to an object can be obtained with functions that parallel the) 72 680 P
(semantics of readdir\050\051 and friends for directories.) 72 666 T
1 F
(2.2.3 ACLs) 72 646 T
0 F
0.26 (ACLs and other security-related items that are usually associated with namespace objects will be) 72 630 P
-0.14 (treated as special forms of arbitrary attributes. They will be accessed in the same way as the exist-) 72 616 P
(ing \336le attributes.) 72 602 T
-0.25 (If the user has permission to read the existing UNIX attributes \050eg: permissions bits\051, then the user) 72 584 P
-0.1 (will have permission to read the names and values of all the arbitrary attributes associated with an) 72 570 P
-0.18 (object. If the user has permission to write the existing UNIX attributes \050eg: permissions bits\051, then) 72 556 P
0.94 (the user will have permission to create, modify) 72 542 P
0.94 (, or delete arbitrary attributes associated with an) 302.95 542 P
(object.) 72 528 T
108.64 508.83 72 508.83 2 L
V
0.65 H
0 Z
N
2 F
0.31 (NOTE:) 72 510 P
0 F
0.31 ( is this too limiting? What about groups working together on \336les that have 0777 permis-) 108.64 510 P
(sions, shouldn\325) 72 496 T
(t anyone be able to change an attribute value?) 144.42 496 T
1 F
(2.2.4 Filesystem Level Attributes) 72 476 T
0 F
0.56 (There will be some system-prede\336ned attributes that will be associated with the \336lesystem itself) 72 460 P
-0.13 (instead of any particular object in that \336lesystem. They will be available as attributes of any given) 72 446 P
2.82 (object within the \336lesystem, but will require dif) 72 432 P
2.82 (ferent syscall ar) 320.08 432 P
2.82 (guments to obtain than the) 401.44 432 P
0 (attributes of that object. Note that these are not user) 72 418 P
0 (-de\336ned, the names are compiled into the ker-) 319.54 418 P
(nel.) 72 404 T
0.8 (This parallels the use of statfs\050\051 where superblock information is available via any object in the) 72 386 P
(\336lesystem.) 72 372 T
1 F
(2.2.4.1 Root vs. Non-Root NameSpaces) 72 352 T
0 F
0.42 (T) 72 336 P
0.42 (o facilitate the implementation of trusted system services that depend on the values of arbitrary) 78.49 336 P
-0.23 (attributes, there must be attributes that only a superuser application can manipulate \050create, delete,) 72 322 P
0.77 (or modify\051, independently of the permissions of the object they are attached to. However) 72 308 P
0.77 (, if the) 507.49 308 P
(object is unlinked, then all attributes would be unlinked with it.) 72 294 T
-0.06 (The chosen technique is to completely segregate normal arbitrary attributes and only-root-modi\336-) 72 276 P
0.45 (able attributes into separate namespaces. Given that normal user attributes and only-root-modi\336-) 72 262 P
0.47 (able attributes are in separate namespaces, there will be no possibility of name collisions or user) 72 248 P
(misuse of trusted attributes.) 72 234 T
2.72 (The interface to attribute operations will include an indication of what namespace is being) 72 216 P
-0.05 (accessed. At this time, we only know of root versus non-root but there may be call for more capa-) 72 202 P
(bilities and therefore more namespaces. Note that this is orthogonal to \336lesystem level attributes.) 72 188 T
1 F
(2.2.5 Sear) 72 168 T
(ching for Inodes with Speci\336c Attributes) 122.08 168 T
0 F
0.77 (It would be a nice feature for desktop users \050for example\051 to \336nd the pathnames of all \336les in a) 72 152 P
-0.06 (\336lesystem that have the given attribute, or the given value for the given attribute. Fortunately) 72 138 P
-0.06 (, this) 516.73 138 P
0.63 (is being left up to user mode applications to implement, ie: it is not in the kernel and not in this) 72 124 P
(project.) 72 110 T
FMENDPAGE
%%EndPage: "3" 4
%%Page: "4" 4
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(4) 500 42.62 T
256.36 706.22 72 706.22 2 L
V
1.71 H
0 Z
N
1 18 Q
(3.0  External Interfaces) 72 708 T
0 12 Q
1.24 (Listed here are the interfaces provided to external callers, the interfaces into other kernel code) 72 686 P
(used by this module, and the dependencies that this module has on the kernel and other modules.) 72 672 T
1 14 Q
(3.1 Supported VNODE Operations) 72 644.67 T
0 12 Q
-0.17 (The following newly de\336ned VFS/VNODE operations will point into the Attribute manager code.) 72 628 P
(Since they are new) 72 614 T
(, the semantics of each call are not yet de\336ned in detail.) 162.14 614 T
(\245 vop_attribute_list - return a list of all attribute names in the way that getdents\050\051 works.) 72 598 T
(\245 vop_attribute_get - read an attribute and value.) 72 584 T
(\245 vop_attribute_set - write \050possibly creating\051 an attribute and value.) 72 570 T
(\245 vop_attribute_create - create an attribute and value, fail if attribute already exists.) 72 556 T
(\245 vop_attribute_remove - remove an attribute.) 72 542 T
(\245 vop_attribute_multi - take a list of attribute operations and loop across them all.) 72 528 T
1 F
(3.1.1 IRIX Components Used) 72 510 T
0 F
(Lots of them.) 72 494 T
1 14 Q
(3.2 Dependencies on Other xFS Components) 72 466.67 T
0 12 Q
-0.21 (This section lists functional and algorithmic dependencies of the Attribute manager on other mod-) 72 450 P
0.72 (ules in xFS. The Attribute manager should be able to get all of its work done via calls to Space) 72 436 P
(manager routines, buf) 72 422 T
(fer cache routines, and to log/recovery manager routines.) 176.7 422 T
1 F
(3.2.1 Space Manager) 72 402 T
0 F
(The Attribute manager is intended to be layered on top of the Space manager) 72 386 T
(.) 440.73 386 T
1 F
(3.2.1.1 Manage the inode pool) 72 366 T
(3.2.1.2 Manage the r) 72 348 T
(esour) 176.38 348 T
(ce/data fork split in the inode) 204.14 348 T
(3.2.1.3 Pr) 72 330 T
(ovide the bmap\050\051 r) 120.42 330 T
(outine) 215.14 330 T
(3.2.2 Log/Recovery Manager) 72 312 T
(3.2.2.1 Pr) 72 294 T
(ovide log write interfaces) 120.42 294 T
(3.2.2.2 Call back on log r) 72 276 T
(ecovery) 199.06 276 T
0 F
(text) 72 260 T
FMENDPAGE
%%EndPage: "4" 5
%%Page: "5" 5
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(5) 500 42.62 T
253.88 706.22 72 706.22 2 L
V
1.71 H
0 Z
N
1 18 Q
(4.0  Major Components) 72 708 T
1 14 Q
(4.1 List of Components) 72 678.67 T
0 12 Q
(Here is a partial diagram of the Attribute Manager components and their interactions:) 72 662 T
2.56 (\245 Short Form Attribute Routines - manage an extremely compact representation of attribute) 72 411 P
0.84 (entries intended to maximize the number of entries that can \336t into the literal space inside an) 82.8 399 P
(inode.) 82.8 387 T
0.68 (\245 Leaf Node Attribute Routines - manage the contents of the leaf nodes of an attribute list. Leaf) 72 373 P
-0.03 (nodes are used in lar) 82.8 361 P
-0.03 (ge attribute list B-trees and as a special case when the only node is a single) 181.05 361 P
(leaf node. They are indexed on the attribute ID number) 82.8 349 T
(.) 346.6 349 T
-0.07 (\245 Intermediate/Root Node Attribute Routines - implement a B*-tree using the attribute ID number) 72 335 P
(as the key) 82.8 323 T
(, using the leaf node routines de\336ned above to actually store the attributes.) 129.98 323 T
1 14 Q
(4.2 Internal Interfaces) 72 297.67 T
0 12 Q
(For each of the three components of the Attribute Manager) 72 281 T
(\245 There is a) 72 265 T
3 F
(cr) 129.48 265 T
(eate) 139.03 265 T
0 F
( routine to build a new block of this type.) 159.01 265 T
(\245 There is an) 72 251 T
3 F
(addname) 135.48 251 T
0 F
( routine to add a name to a block with this structure.) 179.45 251 T
(\245 There is a) 72 237 T
3 F
(r) 129.48 237 T
(emovename) 133.71 237 T
0 F
( routine to remove a name from a block with this structure.) 190.32 237 T
(\245 There is a) 72 223 T
3 F
(lookup) 129.48 223 T
0 F
( routine to search for a name in a block with this structure.) 162.13 223 T
0.45 (\245 There is a migration routine to the adjacent block structure. For example: migrating from short) 72 209 P
1.5 (form to leaf node, from leaf node to full B-tree, and equivalent routines for migrating back) 82.8 197 P
(again.) 82.8 185 T
-0.03 (\245 There is a) 72 171 P
3 F
-0.03 (getdents) 129.36 171 P
0 F
-0.03 ( routine to return entries from the attribute list in sequence. This is equivalent) 169.33 171 P
(to what readdir\050\051 and friends do for directories.) 82.8 159 T
0.65 (The routines listed above are usually just wrappers that call work routines that are used in com-) 72 143 P
1.23 (mon by the various components. For example, the internal routine to add an attribute to a leaf) 72 129 P
-0.22 (node is called by the leaf node code and by the B*-tree code when it has reached the bottom of the) 72 115 P
(tree.) 72 101 T
(There may be additional special purpose routines as well as those listed above.) 72 83 T
72 63 540 720 C
76.5 423 535.5 658 C
436.5 595 292.5 595 292.5 541 382.5 541 382.5 487 436.5 487 6 Y
7 X
0 K
V
0.5 H
2 Z
0 X
N
166.5 487 220.5 595 R
7 X
V
0 X
N
229.5 487 373.5 487 373.5 532 283.5 532 283.5 595 229.5 595 6 Y
7 X
V
0 X
N
180 523 216 559 R
7 X
V
0 12 Q
0 X
(Short) 180 551 T
(Form) 180 537 T
306 559 432 577 R
7 X
V
0 X
(Intermediate/Root Nodes) 306 569 T
270 496 333 514 R
7 X
V
0 X
(Leaf Nodes) 270 506 T
121.5 613 490.5 613 2 L
1 H
N
121.5 469 481.5 469 2 L
N
216 433 396 451 R
7 X
V
0 X
(Space Manager and Buffer Cache) 216 443 T
211.5 622 391.5 640 R
7 X
V
0 X
(VFS/VNODE Attribute Operations) 211.5 632 T
72 63 540 720 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "5" 6
%%Page: "6" 6
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(6) 500 42.62 T
1 14 Q
(4.3 Permanent Data Structur) 72 710.67 T
(es) 245.84 710.67 T
1 12 Q
( \050ie: On-Disk\051) 257.5 710.67 T
0 F
0.89 (The Space Manager will split the on-disk inode into three pieces: the UNIX guk, the data fork,) 72 694 P
0.77 (and the attribute fork. The UNIX guk is pretty traditional, while the data and attribute fork sec-) 72 680 P
(tions both have the same structure: they will either contain extent pointers, or literal data.) 72 666 T
-0.27 (The Space Manager will make the size of the literal area of each fork known to the namespace and) 72 648 P
0.32 (attribute routines so that they can use space-ef) 72 634 P
0.32 (\336cient optimized structures when their data will \336t) 295.55 634 P
1.68 (into the inode itself, and can use time-ef) 72 620 P
1.68 (\336cient structures when their data will not \336t into the) 276.05 620 P
0.12 (inode. If the namespace code needs more space in the inode, it can call into the attribute manager) 72 606 P
0.85 (with a request that the attributes be moved out of the inode and into extents. This is covered in) 72 592 P
(more detail below) 72 578 T
(.) 157.82 578 T
0.03 (When an attribute list is small, it is possible to store it inside the inode in place of extent pointers.) 72 560 P
0.84 (This has a tremendous appeal in that it will save an IO quite a few attribute operations. Caches) 72 546 P
(will alleviate some of the cost of such IOs, at the cost of cache management.) 72 532 T
-0.2 (When an attribute list has too many entries to \336t into an inode, there is little choice but to fall back) 72 514 P
0.43 (on the familiar scheme of creating blocks of entries stored in a structure that looks like a regular) 72 500 P
(\336le.) 72 486 T
1 F
(4.3.1 Filesystem Level Attributes) 72 466 T
0 F
0 (One inode in the \336lesystem as a whole must be partially dedicated to attribute storage. Those \336le-) 72 450 P
0.22 (system level attributes that are writable and have persistent storage will be stored as attributes on) 72 436 P
(inode number 0. They will use the same structures and algorithms as other arbitrary attributes.) 72 422 T
(The data fork of this inode is available for some other use.) 72 404 T
1 F
(4.3.2 Root vs. Non-Root NameSpaces) 72 384 T
0 F
2.01 (T) 72 368 P
2.01 (o implement separate namespaces, we will have to dif) 78.49 368 P
2.01 (ferentiate the attribute names in each) 353.12 368 P
1.31 (namespace. W) 72 354 P
1.31 (e will add a non-legal character to the end of all root-only attribute names, thus) 142.28 354 P
0.69 (ensuring that they do not collide with a user attribute of the same name and have a unique hash) 72 340 P
(value to ease searching.) 72 326 T
1 F
(4.3.2.1 Small Attribute List Support) 72 306 T
0 F
0.13 (W) 72 290 P
0.13 (e will use a space-ef) 82.36 290 P
0.13 (\336cient structure when we try to \336t an attribute list into the literal area of an) 179.92 290 P
(inode. The entries will be packed into a \337at structure and sorted.) 72 276 T
(The structure for small attribute list entries is:) 72 258 T
72 63 540 720 C
75.38 79.98 536.62 254 C
129.38 236 219.38 245 R
7 X
0 K
V
0 12 Q
0 X
(count of entries) 129.38 237 T
84.38 91 273.38 244 R
0.5 H
2 Z
N
84.38 200 273.38 200 2 L
N
84.38 173 273.38 173 2 L
N
84.38 146 273.38 146 2 L
N
84.38 119 273.38 119 2 L
N
84.38 227 273.38 227 2 L
N
201.38 209 255.38 218 R
7 X
V
0 X
(Excel) 201.38 210 T
201.38 182 255.38 191 R
7 X
V
0 X
(ASCII) 201.38 183 T
201.38 155 264.38 164 R
7 X
V
0 X
(/icons/excel) 201.38 156 T
201.38 128 255.38 137 R
7 X
V
0 X
(32bit) 201.38 129 T
201.38 101 255.38 110 R
7 X
V
0 X
(eyes-only) 201.38 102 T
93.38 155 102.38 164 R
7 X
V
0 X
(4) 93.38 156 T
93.38 128 102.38 137 R
7 X
V
0 X
(4) 93.38 129 T
93.38 101 102.38 110 R
7 X
V
0 X
(4) 93.38 102 T
93.38 182 102.38 191 R
7 X
V
0 X
(4) 93.38 183 T
93.38 209 102.38 218 R
7 X
V
0 X
(3) 93.38 210 T
120.38 209 129.38 218 R
7 X
V
0 X
(5) 120.38 210 T
120.38 182 129.38 191 R
7 X
V
0 X
(5) 120.38 183 T
120.38 155 138.38 164 R
7 X
V
0 X
(12) 120.38 156 T
120.38 128 129.38 137 R
7 X
V
0 X
(5) 120.38 129 T
120.38 101 129.38 110 R
7 X
V
0 X
(9) 120.38 102 T
192.38 227 192.38 92 2 L
N
138.38 227 138.38 92 2 L
N
318.38 92 525.38 245 R
7 X
V
4 F
0 X
(struct xfs_attr_shortform {) 318.38 237 T
(struct xfs_attr_sf_hdr {) 336.38 225 T
(unchar count;) 354.38 213 T
(} hdr;) 336.38 201 T
(struct xfs_attr_sf_entry {) 336.38 189 T
(unchar namelen;) 354.38 177 T
(unchar valuelen;) 354.38 165 T
(unchar name[1];) 354.38 153 T
(unchar value[1];) 354.38 141 T
(} list[1];) 336.38 129 T
(};) 318.38 117 T
111.38 227 111.38 92 2 L
N
147.38 209 183.38 218 R
7 X
V
0 F
0 X
(app) 147.38 210 T
147.38 182 183.38 191 R
7 X
V
0 X
(lang) 147.38 183 T
147.38 155 183.38 164 R
7 X
V
0 X
(path) 147.38 156 T
147.38 128 183.38 137 R
7 X
V
0 X
(size) 147.38 129 T
147.38 101 183.38 110 R
7 X
V
0 X
(priv) 147.38 102 T
72 63 540 720 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "6" 7
%%Page: "7" 7
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(7) 500 42.62 T
1 12 Q
(4.3.2.2 Large Attribute List Support) 72 712 T
0 F
1.26 (An attribute list that does not \336t into the literal area of an inode will be structured as a B-tree) 72 696 P
0.1 (keyed on the hash value of the attribute name. The root, intermediate nodes, and the leaves of the) 72 682 P
0.37 (B-tree will each be sized to exactly \336t into a \336lesystem logical block. When a single leaf node is) 72 668 P
0.37 (suf) 72 654 P
0.37 (\336cient to store the whole attribute list, there will be no intermediate nodes, just the single leaf) 86.44 654 P
(node.) 72 640 T
0.7 (For our application, it is expected that only in rare cases will attribute lists use more than that a) 72 622 P
(leaf node.) 72 608 T
-0.07 (The B-tree will contain its \322data\323 \050ie: the value of the named attribute\051 only at the leaf level of the) 72 590 P
0.67 (tree. This is known more formally as a B*-tree \050or sometimes as a B+-tree\051. This dif) 72 576 P
0.67 (fers from a) 486.04 576 P
-0.21 (plain B-tree in that all the keys are in the leaves, rather than spread through the tree. Since all keys) 72 562 P
0.7 (are in the leaves, the leaf nodes can be linked together to give quick sequential access to all the) 72 548 P
0.61 (keys in the tree. Unfortunately) 72 534 P
0.61 (, the attributes are sorted on attribute name hash value, not alpha-) 219.88 534 P
(betically) 72 520 T
(, so an application would probably want to sort them before displaying them.) 112.53 520 T
(The structure for each B-tree leaf block in a lar) 72 502 T
(ge attribute list is:) 297.25 502 T
0.28 (Packed at the front are the attribute hash values and of) 72 109 P
0.28 (fsets of each of the strings. The of) 335.1 109 P
0.28 (fsets are) 500.09 109 P
(sorted on attribute hash value. Packed at the back are the strings themselves.) 72 95 T
72 63 540 720 C
75.38 123 536.62 498 C
192.37 201 255.37 210 R
7 X
0 K
V
0 12 Q
0 X
(/icons/excel) 192.37 202 T
192.37 147 246.37 156 R
7 X
V
0 X
(eyes-only) 192.37 148 T
102.38 327 129.37 336 R
7 X
V
0 X
(7602) 102.38 328 T
84.38 328 255.37 328 2 L
0.5 H
2 Z
N
102.38 336 129.37 345 R
7 X
V
0 X
(6459) 102.38 337 T
102.38 354 129.37 363 R
7 X
V
0 X
(4236) 102.38 355 T
102.38 363 129.37 372 R
7 X
V
0 X
(3145) 102.38 364 T
102.38 345 129.37 354 R
7 X
V
0 X
(5368) 102.38 346 T
84.38 372 255.37 372 2 L
N
84.38 363 255.37 363 2 L
N
84.38 354 255.37 354 2 L
N
84.38 345 255.37 345 2 L
N
84.38 336 255.37 336 2 L
N
129.37 426 219.37 435 R
7 X
V
0 X
(first used byte) 129.37 427 T
111.37 381 237.37 408 R
7 X
V
0 X
2.19 (run length coded map of) 111.37 400 P
(free space in block) 111.37 386 T
192.37 462 228.37 471 R
7 X
V
0 X
(next) 192.37 463 T
111.37 462 147.37 471 R
7 X
V
0 X
(prior) 111.37 463 T
129.37 444 219.37 453 R
7 X
V
0 X
(count of entries) 129.37 445 T
129.37 480 219.37 489 R
7 X
V
0 X
(magic number) 129.37 481 T
84.38 138 255.37 489 R
N
84.38 471 255.37 471 2 L
N
84.38 246 255.37 246 2 L
N
84.38 219 255.37 219 2 L
N
84.38 192 255.37 192 2 L
N
84.38 165 255.37 165 2 L
N
250.29 261 245.09 264 250.29 267 250.29 264 4 Y
V
219.37 367.5 264.37 367.5 264.37 264 250.29 264 4 L
N
248.57 207 243.37 210 248.57 213 248.57 210 4 Y
V
219.37 358.5 273.37 358.5 273.37 210 248.57 210 4 L
N
247.48 234 242.28 237 247.48 240 247.48 237 4 Y
V
219.37 349.5 282.37 349.5 282.37 237 247.48 237 4 L
N
246.72 153 241.53 156 246.72 159 246.72 156 4 Y
V
219.37 340.5 291.37 340.5 291.37 156 246.72 156 4 L
N
246.17 180 240.98 183 246.17 186 246.17 183 4 Y
V
219.37 331.5 300.37 331.5 300.37 183 246.17 183 4 L
N
138.37 300 219.37 309 R
7 X
V
0 X
(unused space) 138.37 301 T
84.38 273 255.37 273 2 L
N
84.38 453 255.37 453 2 L
N
174.37 372 174.37 327 2 L
1 H
N
84.38 435 255.37 435 2 L
0.5 H
N
84.38 417 255.37 417 2 L
N
174.37 471 174.37 453 2 L
1 H
N
309.37 183 525.37 489 R
7 X
V
4 F
0 X
(struct xfs_attr_leafblock {) 309.37 481 T
(struct xfs_attr_leaf_hdr) 327.37 469 T
(ushort magic;) 345.37 457 T
(xblkno forw;) 345.37 445 T
(xblkno back;) 345.37 433 T
(ushort count;) 345.37 421 T
(ushort f) 345.37 409 T
(irstused;) 402.94 409 T
(ushort pad1;) 345.37 397 T
(struct xfs_attr_leaf_map) 345.37 385 T
({) 309.37 373 T
(ushort base;) 363.37 361 T
(ushort size;) 363.37 349 T
(} freemap[LEAF_MAPSIZE];) 345.37 337 T
(} hdr;) 327.37 325 T
(struct xfs_attr_leaf_entry{) 327.37 313 T
(uint hashval;) 345.37 301 T
(ushort nameidx;) 345.37 289 T
(ushort pad2;) 345.37 277 T
(} leaves[1];) 327.37 265 T
(struct xfs_attr_leaf_name {) 327.37 253 T
(unchar namelen;) 345.37 241 T
(unchar valuelen;) 345.37 229 T
(unchar name[1];) 345.37 217 T
(unchar value[1];) 345.37 205 T
(} namelist[1];) 327.37 193 T
192.37 255 237.37 264 R
7 X
V
0 F
0 X
(Excel) 192.37 256 T
192.37 228 237.37 237 R
7 X
V
0 X
(ASCII) 192.37 229 T
192.37 174 237.37 183 R
7 X
V
0 X
(32bit) 192.37 175 T
93.38 201 102.38 210 R
7 X
V
0 X
(4) 93.38 202 T
93.38 174 102.38 183 R
7 X
V
0 X
(4) 93.38 175 T
93.38 147 102.38 156 R
7 X
V
0 X
(4) 93.38 148 T
93.38 228 102.38 237 R
7 X
V
0 X
(4) 93.38 229 T
93.38 255 102.38 264 R
7 X
V
0 X
(3) 93.38 256 T
120.37 255 129.37 264 R
7 X
V
0 X
(5) 120.37 256 T
120.37 228 129.37 237 R
7 X
V
0 X
(5) 120.37 229 T
120.37 201 138.37 210 R
7 X
V
0 X
(12) 120.37 202 T
120.37 174 129.37 183 R
7 X
V
0 X
(5) 120.37 175 T
120.37 147 129.37 156 R
7 X
V
0 X
(9) 120.37 148 T
183.37 273 183.37 138 2 L
0.5 H
N
138.37 273 138.37 138 2 L
N
111.37 273 111.37 138 2 L
N
147.37 255 174.37 264 R
7 X
V
0 X
(app) 147.37 256 T
147.37 228 174.37 237 R
7 X
V
0 X
(lang) 147.37 229 T
147.37 201 174.37 210 R
7 X
V
0 X
(path) 147.37 202 T
147.37 174 174.37 183 R
7 X
V
0 X
(size) 147.37 175 T
147.37 147 174.37 156 R
7 X
V
0 X
(priv) 147.37 148 T
72 63 540 720 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "7" 8
%%Page: "8" 8
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(8) 500 42.62 T
0 12 Q
(The structure for the B-tree root or the intermediate nodes in a lar) 72 712 T
(ge attribute list is:) 386.2 712 T
0.57 (Packed at the front are the B-tree elements. Each element contains the associated attribute name) 72 454 P
0.31 (hash value and the block number of the B-tree block that contains all the nodes between this key) 72 440 P
1.2 (and the key from the prior entry in this B-tree block. Entries after the last attribute name hash) 72 426 P
(value are pointed to by the) 72 412 T
3 F
(after) 202.57 412 T
0 F
( \336eld in the header structure.) 225.23 412 T
(The overall structure of the B*-tree used in a lar) 72 394 T
(ge attribute list is:) 302.6 394 T
1.73 (The B-tree is embedded inside a linear array of blocks, ie: a \336le structure. Pointers to B-tree) 72 145 P
(blocks are relative to the \336le, not to the \336lesystem.) 72 131 T
1 F
(4.3.3 ACL Storage) 72 111 T
0 F
3.28 (Access Control Lists and other security-related attributes will be stored just like all other) 72 95 P
0.75 (attributes on \336lesystem objects. The fact that the kernel will interpret their values doesn\325) 72 81 P
0.75 (t af) 505.84 81 P
0.75 (fect) 522.02 81 P
(their storage representation.) 72 67 T
72 63 540 720 C
75.38 468 536.62 708 C
102.38 582 156.37 591 R
7 X
0 K
V
0 12 Q
0 X
(hashval) 102.38 583 T
102.38 564 156.37 573 R
7 X
V
0 X
(hashval) 102.38 565 T
102.38 546 156.37 555 R
7 X
V
0 X
(hashval) 102.38 547 T
102.38 528 156.37 537 R
7 X
V
0 X
(hashval) 102.38 529 T
192.37 582 264.37 591 R
7 X
V
0 X
(block number) 192.37 583 T
192.37 564 264.37 573 R
7 X
V
0 X
(block number) 192.37 565 T
192.37 546 264.37 555 R
7 X
V
0 X
(block number) 192.37 547 T
192.37 528 264.37 537 R
7 X
V
0 X
(block number) 192.37 529 T
138.37 672 237.37 681 R
7 X
V
0 X
(leaves next) 138.37 673 T
138.37 600 237.37 609 R
7 X
V
0 X
(count of entries) 138.37 601 T
138.37 690 237.37 699 R
7 X
V
0 X
(magic number) 138.37 691 T
93.38 483 264.37 699 R
0.5 H
2 Z
N
93.38 681 264.37 681 2 L
N
93.38 573 264.37 573 2 L
N
138.37 501 219.37 510 R
7 X
V
0 X
(unused space) 138.37 502 T
93.38 555 264.37 555 2 L
N
93.38 537 264.37 537 2 L
N
93.38 519 264.37 519 2 L
N
93.38 591 264.37 591 2 L
N
138.37 654 237.37 663 R
7 X
V
0 X
(count of free blocks) 138.37 655 T
138.37 636 237.37 645 R
7 X
V
0 X
(free block chain) 138.37 637 T
138.37 618 237.37 627 R
7 X
V
0 X
(node after all entries) 138.37 619 T
93.38 663 264.37 663 2 L
N
93.38 609 264.37 609 2 L
N
93.38 645 264.37 645 2 L
N
93.38 627 264.37 627 2 L
N
174.37 591 174.37 519 2 L
1 H
N
300.37 483 516.37 699 R
7 X
V
4 F
0 X
(struct xfs_attr_intnode {) 300.37 691 T
(struct xfs_attr_int_hdr {) 318.37 679 T
(ushort magic;) 336.37 667 T
(unchar leavesnext;) 336.37 655 T
(unchar freeblks;) 336.37 643 T
(xblkno freechain;) 336.37 631 T
(xblkno after;) 336.37 619 T
(ushort count;) 336.37 607 T
(ushort pad1[3];) 336.37 595 T
(} hdr;) 318.37 583 T
(struct xfs_attr_int_entry {) 318.37 571 T
(uint hashval;) 336.37 559 T
(xblkno before;) 336.37 547 T
(ushort pad2;) 336.37 535 T
(} btree[1];) 318.37 523 T
(};) 300.37 511 T
72 63 540 720 C
0 0 612 792 C
72 63 540 720 C
75.38 159 536.62 390 C
0 12 Q
0 X
0 K
(hash) 273.37 256 T
(vi) 327.37 220 T
(nawk) 372.37 220 T
(make) 417.37 220 T
(csh) 273.37 220 T
(off) 228.37 220 T
(on) 183.37 220 T
(hash) 228.37 256 T
(hash) 372.37 256 T
(hash) 327.37 256 T
(hash) 183.37 256 T
(hash) 417.37 256 T
(shell) 273.37 238 T
(fast) 228.37 238 T
(auto) 183.37 238 T
(editor) 327.37 238 T
(parser) 372.37 238 T
(build) 417.37 238 T
(button) 426.37 346 T
(hash) 148.37 352.5 T
(val) 148.37 338.5 T
(hash) 184.62 352.5 T
(val) 184.62 338.5 T
(hash) 111.37 352.5 T
(val) 111.37 338.5 T
(jeff) 237.37 328 T
(left) 426.37 328 T
(blue) 282.37 328 T
(red) 327.37 328 T
(lit) 471.37 328 T
(up) 381.37 328 T
(hash) 282.37 364 T
(hash) 426.37 364 T
(hash) 327.37 364 T
(hash) 471.37 364 T
(hash) 381.37 364 T
(hash) 237.37 364 T
(fore) 282.37 346 T
(back) 327.37 346 T
(user) 237.37 346 T
(dir) 381.37 346 T
(LED) 471.37 346 T
174.37 210 309.37 264 R
0.5 H
2 Z
N
228.37 318 363.37 372 R
N
318.37 210 453.37 264 R
N
264.37 264 264.37 210 2 L
N
219.37 264 219.37 210 2 L
N
273.37 372 273.37 318 2 L
N
318.37 372 318.37 318 2 L
N
363.37 264 363.37 210 2 L
N
408.37 264 408.37 210 2 L
N
372.37 318 507.37 372 R
N
417.37 372 417.37 318 2 L
N
462.37 372 462.37 318 2 L
N
93.38 309 525.37 381 R
N
156.37 201 462.37 273 R
N
(0) 93.38 292 T
(M) 498.37 292 T
(M+1) 156.37 184 T
(N) 435.37 184 T
102.38 318 219.37 372 R
N
109.69 372 109.69 318 2 L
N
175.5 372 175.5 318 2 L
N
138.94 372 138.94 318 2 L
N
212.06 372 212.06 318 2 L
N
146.25 372 146.25 318 2 L
N
182 372 182 318 2 L
N
172.57 269.72 174.37 264 168.52 265.3 170.54 267.51 4 Y
V
105.75 327 170.54 267.51 2 L
N
222.56 316.48 228.37 318 226.79 312.22 224.67 314.35 4 Y
V
142.5 327 165.37 300 210.37 300 224.68 314.34 4 L
N
366.55 316.48 372.36 318 370.78 312.22 368.67 314.35 4 Y
V
178.5 326.25 201.37 291 345.37 291 368.68 314.34 4 L
N
316.78 269.79 318.36 264.01 312.56 265.53 314.67 267.66 4 Y
V
215.25 327 228.37 282 300.37 282 314.68 267.66 4 L
N
174.37 246 309.37 246 2 L
1 H
N
228.37 354 363.37 354 2 L
N
372.37 354 507.37 354 2 L
N
318.37 246 453.37 246 2 L
N
228.37 336 363.37 336 2 L
N
372.37 336 507.37 336 2 L
N
174.37 228 309.37 228 2 L
N
318.37 228 453.37 228 2 L
N
72 63 540 720 C
0 0 612 792 C
FMENDPAGE
%%EndPage: "8" 9
%%Page: "9" 9
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(9) 500 42.62 T
1 14 Q
(4.4 W) 72 710.67 T
(orking Data Structur) 106.21 710.67 T
(es \050ie: In-Memory\051) 232.66 710.67 T
1 12 Q
(4.4.1 Inode T) 72 692 T
(able) 138.2 692 T
0 F
0.13 (W) 72 676 P
0.13 (e will have a traditional incore inode table. The attribute manager will understand that when an) 82.36 676 P
1.31 (inode is marked as containing literal data, it must manage the attribute structures \050in the com-) 72 662 P
(pressed format\051 inside the inode and not in a buf) 72 648 T
(fer) 303.95 648 T
(.) 316.61 648 T
0.39 (Since we have a split inode and space is being shared between the primary fork and the attribute) 72 630 P
-0.16 (fork, the namespace manager and the regular) 72 616 P
-0.16 (-\336le write code have the right to call a function in the) 286.27 616 P
0.98 (attribute manager asking that any attributes stored in the literal area of the inode be moved out) 72 602 P
0.37 (into newly allocated blocks. This routine will be called if a small directory \050ie: in the inode\051 or a) 72 588 P
-0.17 (small \336le grows lar) 72 574 P
-0.17 (ge enough to need the space occupied by the attributes in the inode, but not too) 163.54 574 P
(lar) 72 560 T
(ge that it won\325) 84.44 560 T
(t \336t into the whole literal area of the inode.) 153.84 560 T
1 F
(4.4.2 Filesystem Level Attributes) 72 540 T
0 F
1.68 (The \336lesystem attribute inode will be in the system inode table and the attribute fork will be) 72 524 P
(accessed via the existing attribute access functions.) 72 510 T
1 F
(4.4.3 Attribute Name Spaces for Root vs. Non-Root) 72 490 T
0 F
(There are no special structures for the root-only attribute namespace.) 72 474 T
1 F
(4.4.4 Attribute Structur) 72 454 T
(e) 193.7 454 T
0 F
0.78 (The attribute structures for both small and lar) 72 438 P
0.78 (ge attribute lists have already been described. The) 294.74 438 P
0.22 (attribute manager code will use those structures either in the incore inode itself, or in buf) 72 424 P
0.22 (fers that) 500.81 424 P
(have been read from disk.) 72 410 T
1 F
(4.4.5 ACL Storage) 72 390 T
0 F
3.28 (Access Control Lists and other security-related attributes will be stored just like all other) 72 374 P
0.75 (attributes on \336lesystem objects. The fact that the kernel will interpret their values doesn\325) 72 360 P
0.75 (t af) 505.84 360 P
0.75 (fect) 522.02 360 P
(their storage representation.) 72 346 T
1 14 Q
(4.5 Algorithms) 72 318.67 T
0 12 Q
(In this section pseudocode is provided for each possible operation.) 72 302 T
(\245 VOP_A) 72 286 T
(TTRIBUTE_LIST) 116.51 286 T
4 F
(pseudocode) 72 272 T
0 F
(\245 VOP_A) 72 258 T
(TTRIBUTE_GET) 116.51 258 T
4 F
(pseudocode) 72 244 T
0 F
(\245 VOP_A) 72 230 T
(TTRIBUTE_SET) 116.51 230 T
4 F
(pseudocode) 72 216 T
0 F
(\245 VOP_A) 72 202 T
(TTRIBUTE_CREA) 116.51 202 T
(TE) 211.12 202 T
4 F
(pseudocode) 72 188 T
0 F
(\245 VOP_A) 72 174 T
(TTRIBUTE_REMOVE) 116.51 174 T
4 F
(pseudocode) 72 160 T
0 F
(\245 VOP_A) 72 146 T
(TTRIBUTE_MUL) 116.51 146 T
(TI) 206.01 146 T
4 F
(pseudocode) 72 132 T
FMENDPAGE
%%EndPage: "9" 10
%%Page: "10" 10
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(10) 496 42.62 T
1 14 Q
(4.6 Performance Characterization) 72 710.67 T
1 12 Q
(4.6.1 Inode Size and Structur) 72 692 T
(e) 221.04 692 T
0 F
0.47 (It is expected that almost all namespace objects will have either no attributes or many attributes,) 72 676 P
1.26 (not just one or two. The desktop process \050\322W) 72 662 P
1.26 (orkSpace\323\051 will be attaching several attributes to) 298.62 662 P
0.62 (most \336les, character set encoding information may be attached to \336les for the international mar-) 72 648 P
1 (kets, and backup/restore/hierarchical-storage management processes will be storing information) 72 634 P
(in attributes.) 72 620 T
0.61 (The size of the inodes in a \336lesystem will be at mkfs time, per \336lesystem. This impacts the per-) 72 602 P
0.27 (centage of inodes where the attribute list can be stored inside the inode. W) 72 588 P
0.27 (e should \336gure out the) 431.64 588 P
0.47 (expected size of the attribute stream for a \322normal\323 \336le before we decide on a default inode size) 72 574 P
(for the personal workstation class of machines.) 72 560 T
1 F
(4.6.2 Space Requir) 72 540 T
(ed for Attribute Names and V) 167.73 540 T
(alues) 319.52 540 T
0 F
0.16 (Quite a bit of space will be required on disk to store however many attribute names plus attribute) 72 524 P
0.31 (values there are on every object. There will probably be a relatively few distinct attribute names,) 72 510 P
(but with a very high replication factor) 72 496 T
(.) 253.21 496 T
2.53 (In the future, this can be changed by the addition of a per) 72 478 P
2.53 (-allocation-unit repository of the) 376.2 478 P
0.29 (attribute names that are used in that AU. This change would be transparent to users and could be) 72 464 P
0.62 (migrated to via an of) 72 450 P
0.62 (f-line \336lesystem modi\336cation utility) 174.19 450 P
0.62 (. It would save most of the space occu-) 348.19 450 P
1.15 (pied by the multiple copies of the attribute names, but at the cost of adding a potential perfor-) 72 436 P
(mance bottleneck.) 72 422 T
1 F
(4.6.3 Scaling of Attribute Operations) 72 402 T
0 F
(Since there is no central resource being contended for here, there should be no scaling problems.) 72 386 T
1 F
(4.6.4 Access T) 72 366 T
(ime for Security Attributes) 143.73 366 T
0 F
0.1 (Security related attributes will be accessed on most \050if not all\051 \336le operations in a secure environ-) 72 350 P
0.02 (ment. Their performance will be an optimized example of accessing a set of arbitrary attributes at) 72 336 P
(every \336le operation.) 72 322 T
1 F
(4.6.5 Filesystem Level Attributes) 72 302 T
0 F
0.08 (These are all compiled into the kernel, but use the existing functions and interfaces and so should) 72 286 P
(have the same performance characteristics as normal user attributes.) 72 272 T
1 F
(4.6.6 Attribute Name Spaces for Root vs. Non-Root) 72 252 T
0 F
1.14 (There will be no dif) 72 236 P
1.14 (ference in performance for accessing the attribute list for normal attributes) 171.59 236 P
(versus accessing the attribute list for root-only attributes.) 72 222 T
1 F
(4.6.7 Small Attribute Structur) 72 202 T
(e) 226.02 202 T
0 F
-0.12 (The ef) 72 186 P
-0.12 (\336ciency of not having to seek the disk heads out to read another block before we can access) 102.64 186 P
0.53 (the attribute list will be a big win. For small attribute lists, simply reading the inode will gets us) 72 172 P
0.51 (the contents of the attribute list and allow us to continue the operation. That percentage depends) 72 158 P
(completely on the size of the inode, the size of the data fork, and how many attributes there are.) 72 144 T
FMENDPAGE
%%EndPage: "10" 11
%%Page: "11" 11
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(1) 496.3 42.62 T
(1) 500 42.62 T
1 12 Q
(4.6.8 Large Attribute List Structur) 72 712 T
(e) 250.33 712 T
0 F
1.03 (In a B*-tree, all the keys are in the leaves so those leaves can be linked together to give quick) 72 696 P
-0.11 (sequential access to all the keys in the tree. Unfortunately) 72 682 P
-0.11 (, the attributes will be sorted on the hash) 346.68 682 P
0.58 (value of their names rather than alphabetically so applications will probably want to sort the list) 72 668 P
(before displaying it.) 72 654 T
0.47 (The access time to \336nd a give key in a B*-tree is a logarithmic function of the attribute list size,) 72 636 P
0.94 (not a linear relationship. For our application, it is expected that only in rare cases will attribute) 72 622 P
(lists use more than a leaf node. This is subject to veri\336cation, however) 72 608 T
(.) 409.11 608 T
1 F
(4.6.9 A) 72 588 T
(vailable Parallelism) 106.76 588 T
0 F
1.08 (Reading/writing attribute is impacted by the level of parallelism provided for reading/writing a) 72 572 P
-0.04 (\336le because the underlying structure used by the Attribute Manager for an attribute list is that of a) 72 558 P
(\336le.) 72 544 T
1.93 (Attribute blocks will live in buf) 72 526 P
1.93 (fers, buf) 233.02 526 P
1.93 (fers are exclusively locked when accessed, and most) 274.7 526 P
-0.17 (attribute operations will take place under the auspices of the transaction manager \050which will hold) 72 512 P
0.58 (buf) 72 498 P
0.58 (fer block locks until the transaction completes\051, so attribute operations on a single inode will) 87.77 498 P
(essentially be single threaded.) 72 484 T
1 F
(4.6.10 Logging Bandwidth Requir) 72 464 T
(ed) 245.39 464 T
0 F
-0.11 (Since normal attributes will use the same block structuring as directories, the amount of log band-) 72 448 P
0.36 (width required per attribute operation should be the same as the equivalent operation for a direc-) 72 434 P
(tory) 72 420 T
(, either:) 90.54 420 T
(\245 log the whole inode with the literal attributes inside, or) 72 404 T
(\245 log the changed block\050s\051 in the attribute B-tree.) 72 390 T
1 F
(4.6.1) 72 372 T
(1 Effect on Disk Seek Patterns) 95.33 372 T
0 F
0.57 (Obviously) 72 356 P
0.57 (, when the attributes are literally inside the inode, there is no impact on disk seek pat-) 121.2 356 P
(terns \050other than the lack of a required seek to access a data block\051.) 72 342 T
0.4 (When attributes are not literally inside the inode, a disk seek and block read will be required. T) 72 324 P
0.4 (o) 534 324 P
(be more speci\336c:) 72 310 T
(\245 a seek and read of the whole \336rst extent of the attribute list,) 72 294 T
(\245 if the desired attribute is not in the \336rst extent \050unlikely\051, more seeks and reads will be required.) 72 280 T
1 14 Q
(4.7 Initialization Pr) 72 254.67 T
(ocedur) 187.97 254.67 T
(e) 228.91 254.67 T
3 12 Q
0.77 (Mkfs) 72 238 P
0 F
0.77 ( will create the initial contents of the attribute fork \050nothing\051 on each inode and will create) 95.32 238 P
(the \336lesystem level attribute fork on the reserved inode.) 72 224 T
FMENDPAGE
%%EndPage: "11" 12
%%Page: "12" 12
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(12) 496 42.62 T
1 14 Q
(4.8 Logging Actions) 72 710.67 T
1 12 Q
(4.8.1 Normal Operation) 72 692 T
(4.8.1.1 T) 72 674 T
(ypes of Log Records) 115.09 674 T
(4.8.2 Recovery) 72 656 T
(4.8.2.1 Actions For Each T) 72 638 T
(ype of Log Record) 207.37 638 T
1 14 Q
(4.9 Disk T) 72 612.67 T
(ransfer Policies) 132 612.67 T
1 12 Q
(4.9.1 T) 72 594 T
(o Disk) 105.88 594 T
(4.9.1.1 Xfer size) 72 576 T
(4.9.1.2 Logging) 72 558 T
(4.9.2 Fr) 72 540 T
(om Disk) 111.42 540 T
(4.9.2.1 Xfer sizes) 72 522 T
213.87 492.22 72 492.22 2 L
V
1.71 H
0 Z
N
1 18 Q
(5.0  User Interface) 72 494 T
1 14 Q
(5.1 System Call Interface) 72 464.67 T
0 12 Q
(\245) 72 450 T
3 F
(attr_list) 79.2 450 T
0 F
(\050\051 - a relative of) 117.19 450 T
3 F
(getdents) 195.45 450 T
0 F
(\050\051 that returns attribute names and sizes for an object.) 235.42 450 T
(\245) 72 436 T
3 F
(attr_get) 79.2 436 T
0 F
(\050\051 - return the value associated with the given attribute name for the given object.) 117.18 436 T
(\245) 72 422 T
3 F
(attr_set) 79.2 422 T
0 F
(\050\051 - set/create the given \050name, value\051 pair on the given object.) 115.85 422 T
(\245) 72 408 T
3 F
(attr_cr) 79.2 408 T
(eate) 112.07 408 T
0 F
(\050\051 - create a \050name, value\051 pair on an object, fail if name already exists.) 132.05 408 T
(\245) 72 394 T
3 F
(attr_r) 79.2 394 T
(emove) 106.75 394 T
0 F
(\050\051 - remove the given attribute name from the given object.) 137.38 394 T
(\245) 72 380 T
3 F
(attr_multi\050\051) 79.2 380 T
0 F
( - take a list of attribute operations and loop across them all.) 135.17 380 T
1 F
(5.1.1 Attribute Operation Arguments) 72 362 T
0 F
(The) 72 346 T
3 F
(\337ags) 93.65 346 T
0 F
( ar) 116.3 346 T
(guments for the following calls include:) 128.4 346 T
4 F
(#def) 72 330 T
(ine ATTR_DONTFOLLOW) 100.78 330 T
(0x01) 252 330 T
-0.7 (/* do not follow symlinks */) 342 330 P
(#def) 72 318 T
(ine ATTR_NOCREATE) 100.78 318 T
(0x02) 252 318 T
-0.58 (/* don\325t create on set op */) 342 318 P
(#def) 72 306 T
(ine) 100.78 306 T
( ATTR_FILESYS) 122.37 306 T
(TEM) 215.92 306 T
(0x10) 252 306 T
(/* incl f) 342 306 T
(ilesystem attrs */) 406.76 306 T
(#def) 72 294 T
(ine ATTR_USER) 100.78 294 T
(0x20) 252 294 T
(/* incl user attrs */) 342 294 T
(#def) 72 282 T
(ine ATTR_ROOT) 100.78 282 T
(0x40) 252 282 T
(/* incl root-only attrs */) 342 282 T
0 F
(They mean:) 72 266 T
(\245 A) 72 250 T
(TTR_DONTFOLLOW - don\325) 86.52 250 T
(t follow symlinks, use on any operation that takes a pathname.) 230.21 250 T
(\245 A) 72 236 T
(TTR_NOCREA) 86.52 236 T
(TE - don\325) 163.15 236 T
(t auto-create, fail if name doesn\325) 209.56 236 T
(t exist on a set operation.) 365.21 236 T
(\245 A) 72 222 T
(TTR_FILESYSTEM - include \336lesystem attributes in namespace to operate on.) 86.52 222 T
(\245 A) 72 208 T
(TTR_USER - include local-to-object non-root attributes in namespace to operate on.) 86.52 208 T
(\245 A) 72 194 T
(TTR_ROOT - include local-to-object root-only attributes in namespace to operate on.) 86.52 194 T
1 F
(5.1.2 Single Attribute Operations) 72 176 T
0 F
(The single-attribute operations include:) 72 160 T
1 F
(5.1.2.1 attr_list\050\051) 72 140 T
4 F
(int attr_list\050char *path, struct attr_list_struct *list, int len,) 72 126 T
(int f) 180 114 T
(lags\051;) 215.98 114 T
(int attr_listf\050int fd, struct attr_list_struct *list, int len,) 72 102 T
(int f) 180 90 T
(lags\051;) 215.98 90 T
FMENDPAGE
%%EndPage: "12" 13
%%Page: "13" 13
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(13) 496 42.62 T
0 12 Q
(where:) 72 712 T
4 F
(struct attr_list_struct {) 72 696 T
(int valuelen;) 108 684 T
(/* length of associated value */) 252 684 T
(int namelen;) 108 672 T
(/* length of name \050including NULL\051 */) 252 672 T
(char name[1];) 108 660 T
(/* text of name \050NULL terminated\051 */) 252 660 T
(};) 72 648 T
0 F
0.58 (Like) 72 632 P
3 F
0.58 (getdents\050\051) 97.56 632 P
0 F
0.58 (, successive calls will return more of the attribute list. There are also related rou-) 145.52 632 P
(tines:) 72 618 T
3 F
(attr_open\050\051) 100.99 618 T
0 F
(,) 155.62 618 T
3 F
(attr_r) 161.62 618 T
(ewind\050\051) 189.16 618 T
0 F
(,) 225.8 618 T
3 F
(attr_close\050\051) 231.8 618 T
0 F
( that work just like their) 287.76 618 T
3 F
(getdents\050\051) 405.69 618 T
0 F
( equivalents.) 453.65 618 T
0.12 (The) 72 600 P
3 F
0.12 (attr_list\050\051) 93.76 600 P
0 F
0.12 ( calls take any combination of the) 139.75 600 P
3 F
0.12 (A) 305.44 600 P
0.12 (TTR_FILESYSTEM) 312.32 600 P
0 F
0.12 (,) 406.95 600 P
3 F
0.12 (A) 413.06 600 P
0.12 (TTR_USER) 419.94 600 P
0 F
0.12 (, and) 475.92 600 P
3 F
0.12 (A) 502.46 600 P
0.12 (TTR_-) 509.34 600 P
0.51 (ROOT) 72 586 P
0 F
0.51 ( \337ags. The namespaces will be listed in the order: user) 103.32 586 P
0.51 (, root, and then \336lesystem, but note) 368.05 586 P
2.23 (that there is no indication of where a given attribute name came from when more than one) 72 572 P
(namespace is speci\336ed.) 72 558 T
1 F
(5.1.2.2 attr_get\050\051) 72 538 T
4 F
(int attr_get\050char *path, char *attrname, char *value, int *len,) 72 524 T
(int f) 180 512 T
(lags\051;) 215.98 512 T
(int attr_getf\050int fd, char *attrname, char *value, int *len,) 72 500 T
(int f) 180 488 T
(lags\051;) 215.98 488 T
0 F
2.11 (For the) 72 472 P
3 F
2.11 (attr_get\050\051) 113.53 472 P
0 F
2.11 ( calls, the) 159.5 472 P
3 F
2.11 (length) 214.45 472 P
0 F
2.11 ( ar) 244.44 472 P
2.11 (gument initially contains the size of the allocated) 258.65 472 P
3 F
2.11 (value) 514.02 472 P
0 F
0.14 (buf) 72 458 P
0.14 (fer) 87.77 458 P
0.14 (. After the syscall, the) 100.42 458 P
3 F
0.14 (length) 209.38 458 P
0 F
0.14 ( ar) 239.37 458 P
0.14 (gument contains the actual length of the associated value. If) 251.61 458 P
1.14 (the initial) 72 444 P
3 F
1.14 (length) 122.92 444 P
0 F
1.14 ( is not suf) 152.9 444 P
1.14 (\336cient to hold the attribute\325) 203.08 444 P
1.14 (s value, the) 338.23 444 P
3 F
1.14 (length) 398.94 444 P
0 F
1.14 ( ar) 428.92 444 P
1.14 (gument is set to the) 442.16 444 P
(required size and an error is returned.) 72 430 T
0.12 (The) 72 412 P
3 F
0.12 (attr_get\050\051) 93.76 412 P
0 F
0.12 ( calls take any combination of the) 139.74 412 P
3 F
0.12 (A) 305.43 412 P
0.12 (TTR_FILESYSTEM) 312.32 412 P
0 F
0.12 (,) 406.95 412 P
3 F
0.12 (A) 413.06 412 P
0.12 (TTR_USER) 419.94 412 P
0 F
0.12 (, and) 475.92 412 P
3 F
0.12 (A) 502.46 412 P
0.12 (TTR_-) 509.34 412 P
(ROOT) 72 398 T
0 F
( \337ags. The namespaces will be searched in the order: user) 103.32 398 T
(, root, and then \336lesystem.) 378.95 398 T
1 F
(5.1.2.3 attr_set\050\051) 72 378 T
4 F
(int attr_set\050char *path, char *attrname, char *value, int len,) 72 364 T
(int f) 180 352 T
(lags\051;) 215.98 352 T
(int attr_setf\050int fd, char *attrname, char *value, int len,) 72 340 T
(int f) 180 328 T
(lags\051;) 215.98 328 T
0 F
1.27 (The) 72 312 P
3 F
1.27 (attr_set\050\051) 94.91 312 P
0 F
1.27 ( calls take only one of the) 139.55 312 P
3 F
1.27 (A) 274.66 312 P
1.27 (TTR_FILESYSTEM) 281.55 312 P
0 F
1.27 (,) 376.17 312 P
3 F
1.27 (A) 383.44 312 P
1.27 (TTR_USER) 390.32 312 P
0 F
1.27 (, and) 446.29 312 P
3 F
1.27 (A) 475.14 312 P
1.27 (TTR_ROOT) 482.02 312 P
0 F
0.39 (\337ags. If one is not speci\336ed,) 72 298 P
3 F
0.39 (A) 212.23 298 P
0.39 (TTR_USER) 219.11 298 P
0 F
0.39 ( is assumed. Note that to set or create an) 275.09 298 P
3 F
0.39 (A) 475.14 298 P
0.39 (TTR_ROOT) 482.02 298 P
0 F
(attribute requires superuser permissions.) 72 284 T
0.25 (The) 72 266 P
3 F
0.25 (A) 93.9 266 P
0.25 (TTR_NOCREA) 100.78 266 P
0.25 (TE) 173.64 266 P
0 F
0.25 ( \337ag may also be set. If so, the call will fail if an attribute with this name) 187.64 266 P
(does not exist in the given namespace.) 72 252 T
1 F
(5.1.2.4 attr_cr) 72 232 T
(eate\050\051) 143.72 232 T
4 F
(int attr_create\050char *path, char *attrname, char *value, int len,) 72 218 T
(int f) 180 206 T
(lags\051;) 215.98 206 T
(int attr_createf\050int fd, char *attrname, char *value, int len,) 72 194 T
(int f) 180 182 T
(lags\051;) 215.98 182 T
0 F
-0.21 (The) 72 166 P
3 F
-0.21 (attr_cr) 93.44 166 P
-0.21 (eate\050\051) 126.32 166 P
0 F
-0.21 ( calls take only one of the) 154.28 166 P
3 F
-0.21 (A) 279.08 166 P
-0.21 (TTR_FILESYSTEM) 285.96 166 P
0 F
-0.21 (,) 380.59 166 P
3 F
-0.21 (A) 386.38 166 P
-0.21 (TTR_USER) 393.27 166 P
0 F
-0.21 (, and) 449.24 166 P
3 F
-0.21 (A) 475.14 166 P
-0.21 (TTR_ROOT) 482.02 166 P
0 F
2.54 (\337ags. If one is not speci\336ed,) 72 152 P
3 F
2.54 (A) 225.12 152 P
2.54 (TTR_USER) 232.01 152 P
0 F
2.54 ( is assumed. Note that to create an) 287.98 152 P
3 F
2.54 (A) 475.14 152 P
2.54 (TTR_ROOT) 482.02 152 P
0 F
(attribute requires superuser permissions.) 72 138 T
(This call will fail if an attribute with this name already exists in the given namespace.) 72 120 T
1 F
(5.1.2.5 attr_r) 72 100 T
(emove\050\051) 138.4 100 T
4 F
(int attr_remove\050char *path, char *attrname, int f) 72 86 T
(lags\051;) 424.61 86 T
(int attr_removef\050int fd, char *attrname, int f) 72 74 T
(lags\051;) 403.02 74 T
FMENDPAGE
%%EndPage: "13" 14
%%Page: "14" 14
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(14) 496 42.62 T
0 12 Q
2.16 (The) 72 712 P
3 F
2.16 (attr_r) 95.81 712 P
2.16 (emove\050\051) 123.36 712 P
0 F
2.16 ( calls take any combination of the) 161.98 712 P
3 F
2.16 (A) 341.99 712 P
2.16 (TTR_FILESYSTEM) 348.88 712 P
0 F
2.16 (,) 443.51 712 P
3 F
2.16 (A) 451.67 712 P
2.16 (TTR_USER) 458.55 712 P
0 F
2.16 (, and) 514.52 712 P
3 F
0.04 (A) 72 698 P
0.04 (TTR_ROOT) 78.88 698 P
0 F
0.04 ( \337ags. The namespaces will be searched in the order: user) 136.86 698 P
0.04 (, root, and then \336lesystem.) 412.91 698 P
(Note that to remove an) 72 684 T
3 F
(A) 184.92 684 T
(TTR_ROOT) 191.8 684 T
0 F
( attribute requires superuser permissions.) 249.78 684 T
(This call will fail if an attribute with this name does not exist.) 72 666 T
1 F
(5.1.3 Multi-Attribute Operations) 72 646 T
0 F
0.02 (There is also a multi-attribute operation where an array of sub-operations is passed in. Each oper-) 72 630 P
(ation has its own opcode, ar) 72 616 T
(guments, and return value. The ar) 205.69 616 T
(gument/result structure follows:) 367.01 616 T
4 F
(struct attr_multi_op {) 72 600 T
(int operation;) 108 588 T
(/* set/create/remove operation code */) 252 588 T
(char *attrname;) 108 576 T
(/* the attribute name to operate on */) 252 576 T
(char *value;) 108 564 T
(/* the attribute value to use/set */) 252 564 T
(int *len;) 108 552 T
(/* the max/used length of the value */) 252 552 T
(int f) 108 540 T
(lags;) 143.98 540 T
(/* f) 252 540 T
(lags for this sub-operation */) 280.78 540 T
(int error;) 108 528 T
(/* error for this sub-operation */) 252 528 T
(};) 72 516 T
0 F
(The) 72 500 T
3 F
(operation) 93.65 500 T
0 F
( \336eld can contain the following values:) 140.29 500 T
4 F
(#def) 72 484 T
(ine) 100.78 484 T
( ATTR_OP_GET) 122.37 484 T
(0x1) 252 484 T
(/* do an attr_get\050\051 */) 342 484 T
(#def) 72 472 T
(ine) 100.78 472 T
( ATTR_OP_SET) 122.37 472 T
(0x2) 252 472 T
(/* do an attr_set\050\051 */) 342 472 T
(#def) 72 460 T
(ine ATTR_OP_CREATE) 100.78 460 T
(0x3) 252 460 T
(/* do an attr_create\050\051 */) 342 460 T
(#def) 72 448 T
(ine ATTR_OP_REMOVE) 100.78 448 T
(0x4) 252 448 T
(/* do an attr_remove\050\051 */) 342 448 T
0 F
0.16 (In all of the multi-attribute operations, the \336elds in each sub-operation may contain the same val-) 72 432 P
0.88 (ues \050with the same semantics\051 as the ar) 72 418 P
0.88 (guments to the corresponding single-attribute operations) 264.79 418 P
(above.) 72 404 T
-0.09 (Where the single-attribute operation would have returned an error code from the function call, the) 72 386 P
3 F
1.19 (err) 72 372 P
1.19 (or) 86.21 372 P
0 F
1.19 ( \336eld in the sub-operation structure will contain that error code. The) 96.87 372 P
3 F
1.19 (attr_multi\050\051) 439.87 372 P
0 F
1.19 ( function) 495.84 372 P
-0.12 (call itself will return an error to the caller only when atomic operations are requested \050see the next) 72 358 P
(section\051.) 72 344 T
4 F
(int attr_multi\050char *path, struct attr_multi *args, int count,) 72 328 T
(int f) 180 316 T
(lags\051;) 215.98 316 T
(int attr_multif\050int fd, struct attr_multi *args, int count,) 72 304 T
(int f) 180 292 T
(lags\051;) 215.98 292 T
0 F
1.74 (Note that the) 72 276 P
3 F
1.74 (\337ags) 142.18 276 P
0 F
1.74 ( ar) 164.83 276 P
1.74 (gument to the call itself \050not the sub-operation\051 does not have the same) 178.68 276 P
0.2 (semantics as the) 72 262 P
3 F
0.2 (\337ags) 153.56 262 P
0 F
0.2 ( ar) 176.21 262 P
0.2 (gument to the single-attribute operations \050see the next section\051. The) 188.52 262 P
3 F
0.2 (\337ags) 517.34 262 P
0 F
(ar) 72 248 T
(gument can contain the following values:) 81.1 248 T
4 F
(#def) 72 232 T
(ine ATTR_ATOMIC) 100.78 232 T
(0x1) 252 232 T
(/* atomic multi-attr op */) 342 232 T
1 F
(5.1.4 Atomic Multi-Attribute Operations) 72 214 T
0 F
1.03 (If the) 72 198 P
3 F
1.03 (A) 102.71 198 P
1.03 (TTR_A) 109.59 198 P
1.03 (T) 143.14 198 P
1.03 (OMIC) 149.59 198 P
0 F
1.03 ( \337ag is set in the) 180.24 198 P
3 F
1.03 (\337ags) 267.73 198 P
0 F
1.03 ( ar) 290.39 198 P
1.03 (gument to the) 303.52 198 P
3 F
1.03 (attr_multi\050\051) 375.59 198 P
0 F
1.03 ( call, then all the sub-) 431.56 198 P
-0.18 (operations must be successful or none of them will succeed. In this way) 72 184 P
-0.18 (, multiple attributes can be) 413.14 184 P
(set/created/removed atomically) 72 170 T
(. Note that this has no meaning for the) 221.44 170 T
3 F
(A) 407.98 170 T
(TTR_OP_GET) 414.87 170 T
0 F
( opcode.) 486.17 170 T
-0.19 (In the following discussion, please assume that) 72 152 P
3 F
-0.19 (A) 299.16 152 P
-0.19 (TTR_A) 306.05 152 P
-0.19 (T) 339.59 152 P
-0.19 (OMIC) 346.05 152 P
0 F
-0.19 ( has been set in the \337ags ar) 376.69 152 P
-0.19 (gument) 504.02 152 P
(to an) 72 138 T
3 F
(attr_multi\050\051) 98.65 138 T
0 F
( call.) 154.62 138 T
-0.09 (If any of the sub-operations is an) 72 120 P
3 F
-0.09 (A) 232.23 120 P
-0.09 (TTR_OP_SET) 239.12 120 P
0 F
-0.09 ( that has the) 307.76 120 P
3 F
-0.09 (A) 368.01 120 P
-0.09 (TTR_NOCREA) 374.9 120 P
-0.09 (TE) 447.76 120 P
0 F
-0.09 ( \337ag set and that) 461.75 120 P
1.25 (operation would fail because an attribute with that name does not already exist, then the) 72 106 P
3 F
1.25 (err) 515.12 106 P
1.25 (or) 529.34 106 P
0 F
(\336eld is set and the whole) 72 92 T
3 F
(attr_multi\050\051) 193.93 92 T
0 F
( call will fail before doing any of the sub-operations.) 249.9 92 T
FMENDPAGE
%%EndPage: "14" 15
%%Page: "15" 15
612 792 0 FMBEGINPAGE
0 8 Q
0 X
0 K
(Silicon Graphics Proprietary) 72 750.67 T
72 54 540 54 2 L
0.25 H
2 Z
N
(xFS Attribute Manager Design) 72 42.62 T
(October 7, 1993) 262.13 42.62 T
(15) 496 42.62 T
0 12 Q
1.28 (If any of the sub-operations is an) 72 712 P
3 F
1.28 (A) 241.82 712 P
1.28 (TTR_OP_CREA) 248.7 712 P
1.28 (TE) 326.89 712 P
0 F
1.28 ( and that creation would fail because an) 340.88 712 P
0.73 (attribute with that name already exists, then the) 72 698 P
3 F
0.73 (err) 308.05 698 P
0.73 (or) 322.26 698 P
0 F
0.73 ( \336eld is set and the whole) 332.92 698 P
3 F
0.73 (attr_multi\050\051) 462.98 698 P
0 F
0.73 ( call) 518.95 698 P
(will fail before doing any of the sub-operations) 72 684 T
0.91 (If any of the sub-operations is an) 72 666 P
3 F
0.91 (A) 239.27 666 P
0.91 (TTR_OP_REMOVE) 246.15 666 P
0 F
0.91 ( and that removal would fail because an) 342.76 666 P
0.67 (attribute with that name does not exist, then the) 72 652 P
3 F
0.67 (err) 308.55 652 P
0.67 (or) 322.77 652 P
0 F
0.67 ( \336eld is set and the whole) 333.43 652 P
3 F
0.67 (attr_multi\050\051) 463.04 652 P
0 F
0.67 ( call) 519.01 652 P
(will fail before doing any of the sub-operations.) 72 638 T
0.5 (Note that only) 72 620 P
3 F
0.5 (A) 145.13 620 P
0.5 (TTR_OP_SET) 152.01 620 P
0 F
0.5 ( sub-operations with the) 220.65 620 P
3 F
0.5 (A) 341.25 620 P
0.5 (TTR_NOCREA) 348.14 620 P
0.5 (TE) 420.99 620 P
0 F
0.5 ( \337ag set,) 434.99 620 P
3 F
0.5 (A) 479.8 620 P
0.5 (TTR_CRE-) 486.69 620 P
0.35 (A) 72 606 P
0.35 (TE) 78.88 606 P
0 F
0.35 ( sub-operations, and) 92.88 606 P
3 F
0.35 (A) 193.87 606 P
0.35 (TTR_REMOVE) 200.75 606 P
0 F
0.35 ( sub-operations can cause a failure such that the whole) 275.37 606 P
3 F
(attr_multi\050\051) 72 592 T
0 F
( operation will fail.) 127.97 592 T
1.21 (Each of the sub-operations is checked for failure, even if one has already been found that will) 72 574 P
-0.06 (cause the whole) 72 560 P
3 F
-0.06 (attr_multi\050\051) 151.42 560 P
0 F
-0.06 ( call to fail. The error \336eld in each sub-option will be set according to) 207.4 560 P
(whether that sub-operation would have succeeded or not.) 72 546 T
(The semantics described for atomic multiple attribute access can be used to:) 72 528 T
(\245 atomically set a group of attributes only if they all exist) 72 512 T
(\245 atomically set a group of attributes only if another attribute can be removed) 72 498 T
(\245 atomically set a group of attributes only if another attribute can be created) 72 484 T
(\245 atomically create a set of attributes at the same time) 72 470 T
(\245 atomically remove a set of attributes at the same time) 72 456 T
(\245 atomically create a group of attributes only if another attribute already exists and can be set) 72 442 T
(\245 atomically remove a group of attributes only if another attribute already exists and can be set) 72 428 T
(\245 etc...) 72 414 T
1 14 Q
(5.2 Utilities) 72 388.67 T
0 12 Q
(There will need to be:) 72 372 T
(\245 a utility to manipulate arbitrary user attributes in a generic way) 72 356 T
(.) 380.87 356 T
(\245 modi\336cations to ls\0501\051 to show security related attributes and values \050at a minimum\051.) 72 342 T
(\245 modi\336cations to backup utilities.) 72 328 T
(\245 modi\336cations to \336le transfer and interchange utilities \050tar) 72 314 T
(, cpio, rcp, cp, ...\051.) 352.2 314 T
(\245 modi\336cations to the SGI-NFS protocol to pass attribute operations between consenting systems.) 72 300 T
(\245 etc, etc, etc...) 72 286 T
372.87 256.22 72 256.22 2 L
V
1.71 H
0 Z
N
1 18 Q
(6.0  Implementation Plan and Schedule) 72 258 T
1 14 Q
(6.1 Featur) 72 228.67 T
(es in Not V) 133.15 228.67 T
(ersion 1) 197.54 228.67 T
0 12 Q
(Arbitrary attributes may not be in the March release.) 72 212 T
166.97 180.22 72 180.22 2 L
V
N
1 18 Q
(7.0  Initial T) 72 182 T
225.78 180.22 165.32 180.22 2 L
V
N
(est Plan) 165.32 182 T
FMENDPAGE
%%EndPage: "15" 16
%%Trailer
%%BoundingBox: 0 0 612 792
%%Pages: 15 1
%%DocumentFonts: Times-Roman
%%+ Times-Bold
%%+ Times-BoldItalic
%%+ Times-Italic
%%+ Courier