xref: /freebsd/share/man/man4/geom.4 (revision c1c8575100096990710ebdf474cb76dfa20d472f)
127c74787SPoul-Henning Kamp.\"
227c74787SPoul-Henning Kamp.\" Copyright (c) 2002 Poul-Henning Kamp
327c74787SPoul-Henning Kamp.\" Copyright (c) 2002 Networks Associates Technology, Inc.
427c74787SPoul-Henning Kamp.\" All rights reserved.
527c74787SPoul-Henning Kamp.\"
627c74787SPoul-Henning Kamp.\" This software was developed for the FreeBSD Project by Poul-Henning Kamp
727c74787SPoul-Henning Kamp.\" and NAI Labs, the Security Research Division of Network Associates, Inc.
827c74787SPoul-Henning Kamp.\" under DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
927c74787SPoul-Henning Kamp.\" DARPA CHATS research program.
1027c74787SPoul-Henning Kamp.\"
1127c74787SPoul-Henning Kamp.\" Redistribution and use in source and binary forms, with or without
1227c74787SPoul-Henning Kamp.\" modification, are permitted provided that the following conditions
1327c74787SPoul-Henning Kamp.\" are met:
1427c74787SPoul-Henning Kamp.\" 1. Redistributions of source code must retain the above copyright
1527c74787SPoul-Henning Kamp.\"    notice, this list of conditions and the following disclaimer.
1627c74787SPoul-Henning Kamp.\" 2. Redistributions in binary form must reproduce the above copyright
1727c74787SPoul-Henning Kamp.\"    notice, this list of conditions and the following disclaimer in the
1827c74787SPoul-Henning Kamp.\"    documentation and/or other materials provided with the distribution.
1927c74787SPoul-Henning Kamp.\" 3. The names of the authors may not be used to endorse or promote
2027c74787SPoul-Henning Kamp.\"    products derived from this software without specific prior written
2127c74787SPoul-Henning Kamp.\"    permission.
2227c74787SPoul-Henning Kamp.\"
2327c74787SPoul-Henning Kamp.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
2427c74787SPoul-Henning Kamp.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2527c74787SPoul-Henning Kamp.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2627c74787SPoul-Henning Kamp.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
2727c74787SPoul-Henning Kamp.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2827c74787SPoul-Henning Kamp.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2927c74787SPoul-Henning Kamp.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3027c74787SPoul-Henning Kamp.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3127c74787SPoul-Henning Kamp.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3227c74787SPoul-Henning Kamp.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3327c74787SPoul-Henning Kamp.\" SUCH DAMAGE.
3427c74787SPoul-Henning Kamp.\"
3527c74787SPoul-Henning Kamp.\" $FreeBSD$
3627c74787SPoul-Henning Kamp.\"
3727c74787SPoul-Henning Kamp.Dd March 27, 2002
38fc412d1bSRuslan Ermilov.Os
3927c74787SPoul-Henning Kamp.Dt GEOM 4
4027c74787SPoul-Henning Kamp.Sh NAME
4127c74787SPoul-Henning Kamp.Nm GEOM
4227c74787SPoul-Henning Kamp.Nd modular disk I/O request transformation framework.
4327c74787SPoul-Henning Kamp.Sh DESCRIPTION
4427c74787SPoul-Henning KampThe GEOM framework provides an infrastructure in which modules
4527c74787SPoul-Henning Kampcan perform transformations on disk I/O requests on their path from
4627c74787SPoul-Henning Kampthe upper kernel to the device drivers and back.
4727c74787SPoul-Henning Kamp.Pp
4856cf50adSPoul-Henning KampTransformations in a GEOM context range from the simple geometric
4927c74787SPoul-Henning Kampdisplacement performed in typical disklabel modules over RAID
5027c74787SPoul-Henning Kampalgorithms and device multipath resolution to full blown cryptographic
5127c74787SPoul-Henning Kampprotection of the stored data.
5227c74787SPoul-Henning Kamp.Pp
5327c74787SPoul-Henning KampCompared to traditional "volume management", GEOM differs from most
5427c74787SPoul-Henning Kampand in some cases all previous implementations in the following ways:
5527c74787SPoul-Henning Kamp.Bl -bullet
5627c74787SPoul-Henning Kamp.It
5727c74787SPoul-Henning KampGEOM is extensible.  It is trivially simple to write a new class
5827c74787SPoul-Henning Kampof transformation and it will not be given stepchild treatment.  If
5927c74787SPoul-Henning Kampsomeone for some reason wanted to mount IBM MVS diskpacks, a class
6027c74787SPoul-Henning Kamprecognizing and configuring their VTOC information would be a trivial
6127c74787SPoul-Henning Kampmatter.
6227c74787SPoul-Henning Kamp.It
6327c74787SPoul-Henning KampGEOM is topologically agnostic.  Most volume management implementations
6427c74787SPoul-Henning Kamphave very strict notions of how classes can fit together, very often
6527c74787SPoul-Henning Kampone fixed hierarchy is provided for instance  subdisk - plex -
6627c74787SPoul-Henning Kampvolume.
6727c74787SPoul-Henning Kamp.El
6827c74787SPoul-Henning Kamp.Pp
6927c74787SPoul-Henning KampBeing extensible means that new transformations are treated no differently
7027c74787SPoul-Henning Kampthan existing transformations.
7127c74787SPoul-Henning Kamp.Pp
7227c74787SPoul-Henning KampFixed hierarchies are bad because they make it impossible to express
7327c74787SPoul-Henning Kampthe intent efficiently.
7427c74787SPoul-Henning KampIn the fixed hierarchy above it is not possible to mirror two
7556cf50adSPoul-Henning Kampphysical disks and then partition the mirror into subdisks, instead
7627c74787SPoul-Henning Kampone is forced to make subdisks on the physical volumes and to mirror
7727c74787SPoul-Henning Kampthese two and two resulting in a much more complex configuration.
7827c74787SPoul-Henning KampGEOM on the other hand does not care in which order things are done,
7927c74787SPoul-Henning Kampthe only restriction is that cycles in the graph will not be allowed.
8027c74787SPoul-Henning Kamp.Pp
8127c74787SPoul-Henning Kamp.Sh "TERMINOLOGY and TOPOLOGY"
8227c74787SPoul-Henning KampGeom is quite object oriented and consequently the terminology
8356cf50adSPoul-Henning Kampborrows a lot of context and semantics from the OO vocabulary:
8427c74787SPoul-Henning Kamp.Pp
8527c74787SPoul-Henning KampA "class", represented by the data structure g_class implements one
8627c74787SPoul-Henning Kampparticular kind of transformation.  Typical examples are MBR disk
8756cf50adSPoul-Henning Kamppartition, BSD disklabel, and RAID5 classes.
8827c74787SPoul-Henning Kamp.Pp
8927c74787SPoul-Henning KampAn instance of a class is called a "geom" and represented by the
9056cf50adSPoul-Henning Kampdata structure "g_geom".  In a typical i386 FreeBSD system, there
9127c74787SPoul-Henning Kampwill be one geom of class MBR for each disk.
9227c74787SPoul-Henning Kamp.Pp
9327c74787SPoul-Henning KampA "provider", represented by the data structure "g_provider", is
9427c74787SPoul-Henning Kampthe front gate at which a geom offers service.
9556cf50adSPoul-Henning KampA provider is "a disk-like thing which appears in /dev" - a logical
9627c74787SPoul-Henning Kampdisk in other words.
9756cf50adSPoul-Henning KampAll providers have three main properties: name, sectorsize and size.
9827c74787SPoul-Henning Kamp.Pp
9927c74787SPoul-Henning KampA "consumer" is the backdoor through which a geom connects to another
10056cf50adSPoul-Henning Kampgeom provider and through which I/O requests are sent.
10127c74787SPoul-Henning Kamp.Pp
10227c74787SPoul-Henning KampThe topological relationship between these entities are as follows:
10327c74787SPoul-Henning Kamp.Bl -bullet
10427c74787SPoul-Henning Kamp.It
10527c74787SPoul-Henning KampA class has zero or more geom instances.
10627c74787SPoul-Henning Kamp.It
10727c74787SPoul-Henning KampA geom has exactly one class it is derived from.
10827c74787SPoul-Henning Kamp.It
10927c74787SPoul-Henning KampA geom has zero or more consumers.
11027c74787SPoul-Henning Kamp.It
11156cf50adSPoul-Henning KampA geom has zero or more providers.
11227c74787SPoul-Henning Kamp.It
11327c74787SPoul-Henning KampA consumer can be attached to zero or one providers.
11427c74787SPoul-Henning Kamp.It
11527c74787SPoul-Henning KampA provider can have zero or more consumers attached.
11627c74787SPoul-Henning Kamp.El
11727c74787SPoul-Henning Kamp.Pp
11856cf50adSPoul-Henning KampAll geoms have a rank-number assigned, which is used to detect and
11956cf50adSPoul-Henning Kampprevent loops in the acyclic directed graph.  This rank number is
12027c74787SPoul-Henning Kampassigned as follows:
12127c74787SPoul-Henning Kamp.Bl -enum
12227c74787SPoul-Henning Kamp.It
12327c74787SPoul-Henning KampA geom with no attached consumers has rank=1
12427c74787SPoul-Henning Kamp.It
12556cf50adSPoul-Henning KampA geom with attached consumers has a rank one higher than the
12627c74787SPoul-Henning Kamphighest rank of the geoms of the providers its consumers are
12727c74787SPoul-Henning Kampattached to.
12827c74787SPoul-Henning Kamp.El
12957bd0fc6SJens Schweikhardt.Sh "SPECIAL TOPOLOGICAL MANEUVERS"
13056cf50adSPoul-Henning KampIn addition to the straightforward attach, which attaches a consumer
13157bd0fc6SJens Schweikhardtto a provider, and detach, which breaks the bond, a number of special
13257bd0fc6SJens Schweikhardttopological maneuvers exists to facilitate configuration and to
13327c74787SPoul-Henning Kampimprove the overall flexibility.
13427c74787SPoul-Henning Kamp.Pp
13527c74787SPoul-Henning Kamp.Em TASTING
13656cf50adSPoul-Henning Kampis a process that happens whenever a new class or new provider
13727c74787SPoul-Henning Kampis created and it is the class' chance to automatically configure an
13856cf50adSPoul-Henning Kampinstance on providers, which it recognize as its own.
13956cf50adSPoul-Henning KampA typical example is the MBR disk-partition class which will look for
14027c74787SPoul-Henning Kampthe MBR table in the first sector and if found and validated it will
14127c74787SPoul-Henning Kampinstantiate a geom to multiplex according to the contents of the MBR.
14227c74787SPoul-Henning Kamp.Pp
14356cf50adSPoul-Henning KampA new class will be offered to all existing providers in turn and a new
14427c74787SPoul-Henning Kampprovider will be offered to all classes in turn.
14527c74787SPoul-Henning Kamp.Pp
14627c74787SPoul-Henning KampExactly what a class does to recognize if it should accept the offered
14727c74787SPoul-Henning Kampprovider is not defined by GEOM, but the sensible set of options are:
14827c74787SPoul-Henning Kamp.Bl -bullet
14927c74787SPoul-Henning Kamp.It
15027c74787SPoul-Henning KampExamine specific data structures on the disk.
15127c74787SPoul-Henning Kamp.It
15227c74787SPoul-Henning KampExamine properties like sectorsize or mediasize for the provider.
15327c74787SPoul-Henning Kamp.It
15456cf50adSPoul-Henning KampExamine the rank number of the provider's geom.
15527c74787SPoul-Henning Kamp.It
15656cf50adSPoul-Henning KampExamine the method name of the provider's geom.
15727c74787SPoul-Henning Kamp.El
15827c74787SPoul-Henning Kamp.Pp
15927c74787SPoul-Henning Kamp.Em ORPHANIZATION
16027c74787SPoul-Henning Kampis the process by which a provider is removed while
16156cf50adSPoul-Henning Kampit potentially is still being used.
16227c74787SPoul-Henning Kamp.Pp
163c1c85751SPoul-Henning KampWhen a geom orphans a provider, all future I/O requests will
16427c74787SPoul-Henning Kamp"bounce" on the provider with an error code set by the geom.  Any
16527c74787SPoul-Henning Kampconsumers attached to the provider will receive notification about
166c1c85751SPoul-Henning Kampthe orphanization when the eventloop gets around to it, and they
167c1c85751SPoul-Henning Kampneed to take appropriate action at that time.
16827c74787SPoul-Henning Kamp.Pp
16956cf50adSPoul-Henning KampA geom which came into being as a result of a normal taste operation
170c1c85751SPoul-Henning Kampshould selfdestruct unless it has a way to keep functioning lacking
171c1c85751SPoul-Henning Kampthe orphaned provider.
172c1c85751SPoul-Henning KampGeoms like diskslicers should therefore selfdestruct whereas
173c1c85751SPoul-Henning KampRAID5 or mirror geoms will be able to continue, as long as they do
17427c74787SPoul-Henning Kampnot loose quorum.
17527c74787SPoul-Henning Kamp.Pp
176c1c85751SPoul-Henning KampWhen a provider is orphaned, this does not necessarily result in any
177c1c85751SPoul-Henning Kampimmediate change in the topology: any attached consumers are still
178c1c85751SPoul-Henning Kampattached, any opened paths are still open, any outstanding I/O
179c1c85751SPoul-Henning Kamprequests are still outstanding.
18027c74787SPoul-Henning Kamp.Pp
181c1c85751SPoul-Henning KampThe typical scenario is
182c1c85751SPoul-Henning Kamp.Bl -bullet -offset indent -compact
183c1c85751SPoul-Henning Kamp.It
184c1c85751SPoul-Henning KampA device driver detects a disk has departed and orphans the provider for it.
185c1c85751SPoul-Henning Kamp.It
186c1c85751SPoul-Henning KampThe geoms on top of the disk receive the orphanization event and
187c1c85751SPoul-Henning Kamporphans all their providers in turn.
188c1c85751SPoul-Henning KampProviders, which are not attached to, will typically self-destruct
189c1c85751SPoul-Henning Kampright away.
190c1c85751SPoul-Henning KampThis process continues in a quasi-recursive fashion until all
191c1c85751SPoul-Henning Kamprelevant pieces of the tree has heard the bad news.
192c1c85751SPoul-Henning Kamp.It
193c1c85751SPoul-Henning KampEventually the buck stops when it reaches geom_dev at the top
194c1c85751SPoul-Henning Kampof the stack.
195c1c85751SPoul-Henning Kamp.It
196c1c85751SPoul-Henning KampGeom_dev will call destroy_dev(9) to stop any more request from
197c1c85751SPoul-Henning Kampcoming in.
198c1c85751SPoul-Henning KampIt will sleep until all (if any) outstanding I/O requests have
199c1c85751SPoul-Henning Kampbeen returned.
200c1c85751SPoul-Henning KampIt will explicitly close (ie: zero the access counts), a change
201c1c85751SPoul-Henning Kampwhich will propagate all the way down through the mesh.
202c1c85751SPoul-Henning KampIt will then detach and destroy its geom.
203c1c85751SPoul-Henning Kamp.It
204c1c85751SPoul-Henning KampThe geom whose provider is now attached will destroy the provider,
205c1c85751SPoul-Henning Kampdetach and destroy its consumer and destroy its geom.
206c1c85751SPoul-Henning Kamp.It
207c1c85751SPoul-Henning KampThis process percolates all the way down through the mesh, until
208c1c85751SPoul-Henning Kampthe cleanup is complete.
209c1c85751SPoul-Henning Kamp.El
21027c74787SPoul-Henning Kamp.Pp
21156cf50adSPoul-Henning KampWhile this approach seems byzantine, it does provide the maximum
212c1c85751SPoul-Henning Kampflexibility and robustness in handling disappearing devices.
213c1c85751SPoul-Henning Kamp.Pp
214c1c85751SPoul-Henning KampThe one absolutely crucial detail to be aware is that if the
215c1c85751SPoul-Henning Kampdevice driver does not return all I/O requests, the tree will
216c1c85751SPoul-Henning Kampnot unravel and the geom event loop will stall.
21727c74787SPoul-Henning Kamp.Pp
21827c74787SPoul-Henning Kamp.Em SPOILING
21927c74787SPoul-Henning Kampis a special case of orphanization used to protect
22027c74787SPoul-Henning Kampagainst stale metadata.
22127c74787SPoul-Henning KampIt is probably easiest to understand spoiling by going through
22227c74787SPoul-Henning Kampan example.
22327c74787SPoul-Henning Kamp.Pp
22427c74787SPoul-Henning KampImagine a disk, "da0" on top of which a MBR geom provides
22527c74787SPoul-Henning Kamp"da0s1" and "da0s2" and on top of "da0s1" a BSD geom provides
22627c74787SPoul-Henning Kamp"da0s1a" through "da0s1e", both the MBR and BSD geoms have
22727c74787SPoul-Henning Kampautoconfigured based on data structures on the disk media.
22827c74787SPoul-Henning KampNow imagine the case where "da0" is opened for writing and those
22927c74787SPoul-Henning Kampdata structures are modified or overwritten:  Now the geoms would
23027c74787SPoul-Henning Kampbe operating on stale metadata unless some notification system
23127c74787SPoul-Henning Kampcan inform them otherwise.
23227c74787SPoul-Henning KampTo avoid this situation, when the open of "da0" for write happens,
23327c74787SPoul-Henning Kampall attached consumers are told about this, and geoms like
23427c74787SPoul-Henning KampMBR and BSD will selfdestruct as a result.
23527c74787SPoul-Henning KampWhen "da0" is closed again, it will be offered for tasting again
23627c74787SPoul-Henning Kampand if the data structures for MBR and BSD are still there, new
23727c74787SPoul-Henning Kampgeoms will instantiate themselves anew.
23827c74787SPoul-Henning Kamp.Pp
23927c74787SPoul-Henning KampNow for the fine print:
24027c74787SPoul-Henning Kamp.Pp
24127c74787SPoul-Henning KampIf any of the paths through the MBR or BSD module were open, they
24227c74787SPoul-Henning Kampwould have opened downwards with an exclusive bit rendering it
24327c74787SPoul-Henning Kampimpossible to open "da0" for writing in that case and conversely
24427c74787SPoul-Henning Kampthe requested exclusive bit would render it impossible to open a
24527c74787SPoul-Henning Kamppath through the MBR geom while "da0" is open for writing.
24627c74787SPoul-Henning Kamp.Pp
24727c74787SPoul-Henning KampFrom this it also follows that changing the size of open geoms can
24827c74787SPoul-Henning Kamponly be done through their cooperation.
24927c74787SPoul-Henning Kamp.Pp
25027c74787SPoul-Henning KampFinally: the spoiling only happens when the write count goes from
25127c74787SPoul-Henning Kampzero to non-zero and the retasting only when the write count goes
25227c74787SPoul-Henning Kampback to zero.
25327c74787SPoul-Henning Kamp.Pp
25427c74787SPoul-Henning Kamp.Em INSERT/DELETE
25527c74787SPoul-Henning Kampare a very special operation which allows a new geom
25627c74787SPoul-Henning Kampto be instantiated between a consumer and a provider attached to
25727c74787SPoul-Henning Kampeach other and to remove it again.
25827c74787SPoul-Henning Kamp.Pp
25927c74787SPoul-Henning KampTo understand the utility of this, imagine a provider with
26027c74787SPoul-Henning Kampbeing mounted as a file system.
26127c74787SPoul-Henning KampBetween the DEVFS geoms consumer and its provider we insert
26256cf50adSPoul-Henning Kampa mirror module which configures itself with one mirror
26327c74787SPoul-Henning Kampcopy and consequently is transparent to the I/O requests
26427c74787SPoul-Henning Kampon the path.
26527c74787SPoul-Henning KampWe can now configure yet a mirror copy on the mirror geom,
26656cf50adSPoul-Henning Kamprequest a synchronization, and finally drop the first mirror
26727c74787SPoul-Henning Kampcopy.
26827c74787SPoul-Henning KampWe have now in essence moved a mounted file system from one
26927c74787SPoul-Henning Kampdisk to another while it was being used.
27027c74787SPoul-Henning KampAt this point the mirror geom can be deleted from the path
27127c74787SPoul-Henning Kampagain, it has served its purpose.
27227c74787SPoul-Henning Kamp.Pp
27327c74787SPoul-Henning Kamp.Em CONFIGURE
27427c74787SPoul-Henning Kampis the process where the administrator issues instructions
27527c74787SPoul-Henning Kampfor a particular class to instantiate itself.  There are multiple
27627c74787SPoul-Henning Kampways to express intent in this case, a particular provider can be
27727c74787SPoul-Henning Kampspecified with a level of override forcing for instance a BSD
27827c74787SPoul-Henning Kampdisklabel module to attach to a provider which was not found palatable
27927c74787SPoul-Henning Kampduring the TASTE operation.
28027c74787SPoul-Henning Kamp.Pp
28127c74787SPoul-Henning KampFinally IO is the reason we even do this: it concerns itself with
28227c74787SPoul-Henning Kampsending I/O requests through the graph.
28327c74787SPoul-Henning Kamp.Pp
28427c74787SPoul-Henning Kamp.Em "I/O REQUESTS
28527c74787SPoul-Henning Kamprepresented by struct bio, originate at a consumer,
28656cf50adSPoul-Henning Kampare scheduled on its attached provider, and when processed, returned
28727c74787SPoul-Henning Kampto the consumer.
28827c74787SPoul-Henning KampIt is important to realize that the struct bio which
28957bd0fc6SJens Schweikhardtenters through the provider of a particular geom does not "come
29027c74787SPoul-Henning Kampout on the other side".
29127c74787SPoul-Henning KampEven simple transformations like MBR and BSD will clone the
29256cf50adSPoul-Henning Kampstruct bio, modify the clone, and schedule the clone on their
29327c74787SPoul-Henning Kampown consumer.
29427c74787SPoul-Henning KampNote that cloning the struct bio does not involve cloning the
29527c74787SPoul-Henning Kampactual data area specified in the IO request.
29627c74787SPoul-Henning Kamp.Pp
29727c74787SPoul-Henning KampIn total five different IO requests exist in GEOM: read, write,
29856cf50adSPoul-Henning Kampdelete, format, get attribute, and set attribute.
29927c74787SPoul-Henning Kamp.Pp
30056cf50adSPoul-Henning KampRead and write are self explanatory.
30127c74787SPoul-Henning Kamp.Pp
30227c74787SPoul-Henning KampDelete indicates that a certain range of data is no longer used
30327c74787SPoul-Henning Kampand that it can be erased or freed as the underlying technology
30427c74787SPoul-Henning Kampsupports.
30527c74787SPoul-Henning KampTechnologies like flash adaptation layers can arrange to erase
30627c74787SPoul-Henning Kampthe relevant blocks before they will become reassigned and
30756cf50adSPoul-Henning Kampcryptographic devices may want to fill random bits into the
30827c74787SPoul-Henning Kamprange to reduce the amount of data available for attack.
30927c74787SPoul-Henning Kamp.Pp
31027c74787SPoul-Henning KampIt is important to recognize that a delete indication is not a
31127c74787SPoul-Henning Kamprequest and consequently there is no guarantee that the data actually
31227c74787SPoul-Henning Kampwill be erased or made unavailable unless guaranteed by specific
31327c74787SPoul-Henning Kampgeoms in the graph.  If "secure delete" semantics are required, a
31427c74787SPoul-Henning Kampgeom should be pushed which converts delete indications into (a
31527c74787SPoul-Henning Kampsequence of) write requests.
31627c74787SPoul-Henning Kamp.Pp
31727c74787SPoul-Henning KampGet attribute and set attribute supports inspection and manipulation
31827c74787SPoul-Henning Kampof out-of-band attributes on a particular provider or path.
31927c74787SPoul-Henning KampAttributes are named by ascii strings and they will be discussed in
32027c74787SPoul-Henning Kampa separate section below.
32127c74787SPoul-Henning Kamp.Pp
32227c74787SPoul-Henning Kamp(stay tuned while the author rests his brain and fingers: more to come.)
32327c74787SPoul-Henning Kamp.Sh HISTORY
32427c74787SPoul-Henning KampThis software was developed for the FreeBSD Project by Poul-Henning Kamp
32527c74787SPoul-Henning Kampand NAI Labs, the Security Research Division of Network Associates, Inc.
32627c74787SPoul-Henning Kampunder DARPA/SPAWAR contract N66001-01-C-8035 ("CBOSS"), as part of the
32727c74787SPoul-Henning KampDARPA CHATS research program.
32827c74787SPoul-Henning Kamp.Pp
32927c74787SPoul-Henning KampThe first precursor for GEOM was a gruesome hack to Minix 1.2 and was
33056cf50adSPoul-Henning Kampnever distributed.  An earlier attempt to implement a less general scheme
33156cf50adSPoul-Henning Kampin FreeBSD never succeeded.
33227c74787SPoul-Henning Kamp.Sh AUTHORS
33327c74787SPoul-Henning Kamp.An "Poul-Henning Kamp" Aq phk@FreeBSD.org
334