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