head	1.6;
access;
symbols
	RELENG_8_4:1.6.0.2
	RELENG_9_1_0_RELEASE:1.5.28.1.4.2
	RELENG_9_1:1.5.28.1.0.4
	RELENG_9_1_BP:1.5.28.1
	RELENG_8_3_0_RELEASE:1.5.22.1.8.1
	RELENG_8_3:1.5.22.1.0.8
	RELENG_8_3_BP:1.5.22.1
	RELENG_9_0_0_RELEASE:1.5.28.1.2.1
	RELENG_9_0:1.5.28.1.0.2
	RELENG_9_0_BP:1.5.28.1
	RELENG_9:1.5.0.28
	RELENG_9_BP:1.5
	RELENG_7_4_0_RELEASE:1.5.26.1
	RELENG_8_2_0_RELEASE:1.5.22.1.6.1
	RELENG_7_4:1.5.0.26
	RELENG_7_4_BP:1.5
	RELENG_8_2:1.5.22.1.0.6
	RELENG_8_2_BP:1.5.22.1
	RELENG_8_1_0_RELEASE:1.5.22.1.4.1
	RELENG_8_1:1.5.22.1.0.4
	RELENG_8_1_BP:1.5.22.1
	RELENG_7_3_0_RELEASE:1.5.24.1
	RELENG_7_3:1.5.0.24
	RELENG_7_3_BP:1.5
	RELENG_8_0_0_RELEASE:1.5.22.1.2.1
	RELENG_8_0:1.5.22.1.0.2
	RELENG_8_0_BP:1.5.22.1
	RELENG_8:1.5.0.22
	RELENG_8_BP:1.5
	RELENG_7_2_0_RELEASE:1.5.20.1
	RELENG_7_2:1.5.0.20
	RELENG_7_2_BP:1.5
	RELENG_7_1_0_RELEASE:1.5.18.1
	RELENG_6_4_0_RELEASE:1.5.16.1
	RELENG_7_1:1.5.0.18
	RELENG_7_1_BP:1.5
	RELENG_6_4:1.5.0.16
	RELENG_6_4_BP:1.5
	RELENG_7_0_0_RELEASE:1.5
	RELENG_6_3_0_RELEASE:1.5
	RELENG_7_0:1.5.0.14
	RELENG_7_0_BP:1.5
	RELENG_6_3:1.5.0.12
	RELENG_6_3_BP:1.5
	RELENG_7:1.5.0.10
	RELENG_7_BP:1.5
	RELENG_6_2_0_RELEASE:1.5
	RELENG_6_2:1.5.0.8
	RELENG_6_2_BP:1.5
	RELENG_5_5_0_RELEASE:1.4.6.1
	RELENG_5_5:1.4.6.1.0.6
	RELENG_5_5_BP:1.4.6.1
	RELENG_6_1_0_RELEASE:1.5
	RELENG_6_1:1.5.0.6
	RELENG_6_1_BP:1.5
	RELENG_6_0_0_RELEASE:1.5
	RELENG_6_0:1.5.0.4
	RELENG_6_0_BP:1.5
	RELENG_6:1.5.0.2
	RELENG_6_BP:1.5
	RELENG_5_4_0_RELEASE:1.4.6.1
	RELENG_5_4:1.4.6.1.0.4
	RELENG_5_4_BP:1.4.6.1
	RELENG_5_3_0_RELEASE:1.4.6.1
	RELENG_5_3:1.4.6.1.0.2
	RELENG_5_3_BP:1.4.6.1
	RELENG_5:1.4.0.6
	RELENG_5_BP:1.4
	RELENG_5_2_1_RELEASE:1.4
	RELENG_5_2_0_RELEASE:1.4
	RELENG_5_2:1.4.0.4
	RELENG_5_2_BP:1.4
	RELENG_5_1_0_RELEASE:1.4
	RELENG_5_1:1.4.0.2
	RELENG_5_1_BP:1.4;
locks; strict;
comment	@# @;


1.6
date	2012.11.17.01.52.31;	author svnexp;	state Exp;
branches
	1.6.2.1;
next	1.5;

1.5
date	2004.09.05.21.15.58;	author phk;	state Exp;
branches
	1.5.2.1
	1.5.10.1
	1.5.16.1
	1.5.18.1
	1.5.20.1
	1.5.22.1
	1.5.24.1
	1.5.26.1
	1.5.28.1;
next	1.4;

1.4
date	2003.03.23.10.08.13;	author phk;	state Exp;
branches
	1.4.6.1;
next	1.3;

1.3
date	2003.02.11.14.57.33;	author phk;	state Exp;
branches;
next	1.2;

1.2
date	2003.02.09.17.04.57;	author phk;	state Exp;
branches;
next	1.1;

1.1
date	2003.02.07.23.08.24;	author phk;	state Exp;
branches;
next	;

1.6.2.1
date	2012.11.17.01.52.31;	author svnexp;	state dead;
branches;
next	1.6.2.2;

1.6.2.2
date	2013.03.28.13.05.03;	author svnexp;	state Exp;
branches;
next	;

1.5.2.1
date	2012.11.17.07.43.48;	author svnexp;	state Exp;
branches;
next	;

1.5.10.1
date	2012.11.17.08.06.18;	author svnexp;	state Exp;
branches;
next	;

1.5.16.1
date	2008.10.02.02.57.24;	author kensmith;	state Exp;
branches;
next	;

1.5.18.1
date	2008.11.25.02.59.29;	author kensmith;	state Exp;
branches;
next	;

1.5.20.1
date	2009.04.15.03.14.26;	author kensmith;	state Exp;
branches;
next	;

1.5.22.1
date	2009.08.03.08.13.06;	author kensmith;	state Exp;
branches
	1.5.22.1.2.1
	1.5.22.1.4.1
	1.5.22.1.6.1
	1.5.22.1.8.1;
next	1.5.22.2;

1.5.22.2
date	2012.11.17.10.36.49;	author svnexp;	state Exp;
branches;
next	;

1.5.22.1.2.1
date	2009.10.25.01.10.29;	author kensmith;	state Exp;
branches;
next	;

1.5.22.1.4.1
date	2010.06.14.02.09.06;	author kensmith;	state Exp;
branches;
next	;

1.5.22.1.6.1
date	2010.12.21.17.09.25;	author kensmith;	state Exp;
branches;
next	;

1.5.22.1.8.1
date	2012.03.03.06.15.13;	author kensmith;	state Exp;
branches;
next	1.5.22.1.8.2;

1.5.22.1.8.2
date	2012.11.17.08.25.26;	author svnexp;	state Exp;
branches;
next	;

1.5.24.1
date	2010.02.10.00.26.20;	author kensmith;	state Exp;
branches;
next	;

1.5.26.1
date	2010.12.21.17.10.29;	author kensmith;	state Exp;
branches;
next	1.5.26.2;

1.5.26.2
date	2012.11.17.08.17.21;	author svnexp;	state Exp;
branches;
next	;

1.5.28.1
date	2011.09.23.00.51.37;	author kensmith;	state Exp;
branches
	1.5.28.1.2.1
	1.5.28.1.4.1;
next	1.5.28.2;

1.5.28.2
date	2012.11.17.11.37.10;	author svnexp;	state Exp;
branches;
next	;

1.5.28.1.2.1
date	2011.11.11.04.20.22;	author kensmith;	state Exp;
branches;
next	1.5.28.1.2.2;

1.5.28.1.2.2
date	2012.11.17.08.37.06;	author svnexp;	state Exp;
branches;
next	;

1.5.28.1.4.1
date	2012.08.05.23.54.33;	author kensmith;	state Exp;
branches;
next	1.5.28.1.4.2;

1.5.28.1.4.2
date	2012.11.17.08.47.58;	author svnexp;	state Exp;
branches;
next	;

1.4.6.1
date	2004.09.13.06.26.57;	author phk;	state Exp;
branches;
next	;


desc
@@


1.6
log
@Switching exporter and resync
@
text
@$FreeBSD: head/sys/geom/notes 134824 2004-09-05 21:15:58Z phk $

For the lack of a better place to put them, this file will contain
notes on some of the more intricate details of geom.

-----------------------------------------------------------------------
Locking of bio_children and bio_inbed

bio_children is used by g_std_done() and g_clone_bio() to keep track
of children cloned off a request.  g_clone_bio will increment the
bio_children counter for each time it is called and g_std_done will
increment bio_inbed for every call, and if the two counters are
equal, call g_io_deliver() on the parent bio.

The general assumption is that g_clone_bio() is called only in
the g_down thread, and g_std_done() only in the g_up thread and
therefore the two fields do not generally need locking.  These
restrictions are not enforced by the code, but only with great
care should they be violated.

It is the responsibility of the class implementation to avoid the
following race condition:  A class intend to split a bio in two
children.  It clones the bio, and requests I/O on the child. 
This I/O operation completes before the second child is cloned
and g_std_done() sees the counters both equal 1 and finishes off
the bio.

There is no race present in the common case where the bio is split
in multiple parts in the class start method and the I/O is requested
on another GEOM class below:  There is only one g_down thread and
the class below will not get its start method run until we return
from our start method, and consequently the I/O cannot complete
prematurely.

In all other cases, this race needs to be mitigated, for instance
by cloning all children before I/O is request on any of them.

Notice that cloning an "extra" child and calling g_std_done() on
it directly opens another race since the assumption is that
g_std_done() only is called in the g_up thread.

-----------------------------------------------------------------------
Statistics collection

Statistics collection can run at three levels controlled by the
"kern.geom.collectstats" sysctl.

At level zero, only the number of transactions started and completed
are counted, and this is only because GEOM internally uses the difference
between these two as sanity checks.

At level one we collect the full statistics.  Higher levels are
reserved for future use.  Statistics are collected independently
on both the provider and the consumer, because multiple consumers
can be active against the same provider at the same time.

The statistics collection falls in two parts:

The first and simpler part consists of g_io_request() timestamping
the struct bio when the request is first started and g_io_deliver()
updating the consumer and providers statistics based on fields in
the bio when it is completed.  There are no concurrency or locking
concerns in this part.  The statistics collected consists of number
of requests, number of bytes, number of ENOMEM errors, number of
other errors and duration of the request for each of the three
major request types: BIO_READ, BIO_WRITE and BIO_DELETE.

The second part is trying to keep track of the "busy%".

If in g_io_request() we find that there are no outstanding requests,
(based on the counters for scheduled and completed requests being
equal), we set a timestamp in the "wentbusy" field.  Since there
are no outstanding requests, and as long as there is only one thread
pushing the g_down queue, we cannot possibly conflict with
g_io_deliver() until we ship the current request down.

In g_io_deliver() we calculate the delta-T from wentbusy and add this
to the "bt" field, and set wentbusy to the current timestamp.  We
take care to do this before we increment the "requests completed"
counter, since that prevents g_io_request() from touching the
"wentbusy" timestamp concurrently.

The statistics data is made available to userland through the use
of a special allocator (in geom_stats.c) which through a device
allows userland to mmap(2) the pages containing the statistics data.
In order to indicate to userland when the data in a statstics
structure might be inconsistent, g_io_deliver() atomically sets a
flag "updating" and resets it when the structure is again consistent.
-----------------------------------------------------------------------
maxsize, stripesize and stripeoffset

maxsize is the biggest request we are willing to handle.  If not
set there is no upper bound on the size of a request and the code
is responsible for chopping it up.  Only hardware methods should
set an upper bound in this field.  Geom_disk will inherit the upper
bound set by the device driver.

stripesize is the width of any natural request boundaries for the
device.  This would be the width of a stripe on a raid-5 unit or
one zone in GBDE.  The idea with this field is to hint to clustering
type code to not trivially overrun these boundaries.

stripeoffset is the amount of the first stripe which lies before the
devices beginning.

If we have a device with 64k stripes:
	[0...64k[
	[64k...128k[
	[128k..192k[
Then it will have stripesize = 64k and stripeoffset = 0.

If we put a MBR on this device, where slice#1 starts on sector#63,
then this slice will have: stripesize = 64k, stripeoffset = 63 * sectorsize.

If the clustering code wants to widen a request which writes to
sector#53 of the slice, it can calculate how many bytes till the end of
the stripe as:
	stripewith - (53 * sectorsize + stripeoffset) % stripewidth.
-----------------------------------------------------------------------

#include file usage:

                 geom.h|geom_int.h|geom_ext.h|geom_ctl.h|libgeom.h
----------------+------+----------+----------+----------+--------+
geom class      |      |          |          |          |        |
implementation  |   X  |          |          |          |        |
----------------+------+----------+----------+----------+--------+
geom kernel     |      |          |          |          |        |
infrastructure  |   X  |      X   |  X       |    X     |        |
----------------+------+----------+----------+----------+--------+
libgeom         |      |          |          |          |        |
implementation  |      |          |  X       |    X     |  X     |
----------------+------+----------+----------+----------+--------+
geom aware      |      |          |          |          |        |
application     |      |          |          |    X     |  X     |
----------------+------+----------+----------+----------+--------+

geom_slice.h is special in that it documents a "library" for implementing
a specific kind of class, and consequently does not appear in the above
matrix.
-----------------------------------------------------------------------
Removable media.

In general, the theory is that a drive creates the provider when it has
a media and destroys it when the media disappears.

In a more realistic world, we will allow a provider to be opened medialess
(set any sectorsize and a mediasize==0) in order to allow operations like
open/close tray etc.

@


1.6.2.1
log
@file notes was added on branch RELENG_8_4 on 2013-03-28 13:05:03 +0000
@
text
@d1 150
@


1.6.2.2
log
@## SVN ## Exported commit - http://svnweb.freebsd.org/changeset/base/248810
## SVN ## CVS IS DEPRECATED: http://wiki.freebsd.org/CvsIsDeprecated
@
text
@a0 150
$FreeBSD: releng/8.4/sys/geom/notes 199583 2009-11-20 15:27:52Z jhb $

For the lack of a better place to put them, this file will contain
notes on some of the more intricate details of geom.

-----------------------------------------------------------------------
Locking of bio_children and bio_inbed

bio_children is used by g_std_done() and g_clone_bio() to keep track
of children cloned off a request.  g_clone_bio will increment the
bio_children counter for each time it is called and g_std_done will
increment bio_inbed for every call, and if the two counters are
equal, call g_io_deliver() on the parent bio.

The general assumption is that g_clone_bio() is called only in
the g_down thread, and g_std_done() only in the g_up thread and
therefore the two fields do not generally need locking.  These
restrictions are not enforced by the code, but only with great
care should they be violated.

It is the responsibility of the class implementation to avoid the
following race condition:  A class intend to split a bio in two
children.  It clones the bio, and requests I/O on the child. 
This I/O operation completes before the second child is cloned
and g_std_done() sees the counters both equal 1 and finishes off
the bio.

There is no race present in the common case where the bio is split
in multiple parts in the class start method and the I/O is requested
on another GEOM class below:  There is only one g_down thread and
the class below will not get its start method run until we return
from our start method, and consequently the I/O cannot complete
prematurely.

In all other cases, this race needs to be mitigated, for instance
by cloning all children before I/O is request on any of them.

Notice that cloning an "extra" child and calling g_std_done() on
it directly opens another race since the assumption is that
g_std_done() only is called in the g_up thread.

-----------------------------------------------------------------------
Statistics collection

Statistics collection can run at three levels controlled by the
"kern.geom.collectstats" sysctl.

At level zero, only the number of transactions started and completed
are counted, and this is only because GEOM internally uses the difference
between these two as sanity checks.

At level one we collect the full statistics.  Higher levels are
reserved for future use.  Statistics are collected independently
on both the provider and the consumer, because multiple consumers
can be active against the same provider at the same time.

The statistics collection falls in two parts:

The first and simpler part consists of g_io_request() timestamping
the struct bio when the request is first started and g_io_deliver()
updating the consumer and providers statistics based on fields in
the bio when it is completed.  There are no concurrency or locking
concerns in this part.  The statistics collected consists of number
of requests, number of bytes, number of ENOMEM errors, number of
other errors and duration of the request for each of the three
major request types: BIO_READ, BIO_WRITE and BIO_DELETE.

The second part is trying to keep track of the "busy%".

If in g_io_request() we find that there are no outstanding requests,
(based on the counters for scheduled and completed requests being
equal), we set a timestamp in the "wentbusy" field.  Since there
are no outstanding requests, and as long as there is only one thread
pushing the g_down queue, we cannot possibly conflict with
g_io_deliver() until we ship the current request down.

In g_io_deliver() we calculate the delta-T from wentbusy and add this
to the "bt" field, and set wentbusy to the current timestamp.  We
take care to do this before we increment the "requests completed"
counter, since that prevents g_io_request() from touching the
"wentbusy" timestamp concurrently.

The statistics data is made available to userland through the use
of a special allocator (in geom_stats.c) which through a device
allows userland to mmap(2) the pages containing the statistics data.
In order to indicate to userland when the data in a statstics
structure might be inconsistent, g_io_deliver() atomically sets a
flag "updating" and resets it when the structure is again consistent.
-----------------------------------------------------------------------
maxsize, stripesize and stripeoffset

maxsize is the biggest request we are willing to handle.  If not
set there is no upper bound on the size of a request and the code
is responsible for chopping it up.  Only hardware methods should
set an upper bound in this field.  Geom_disk will inherit the upper
bound set by the device driver.

stripesize is the width of any natural request boundaries for the
device.  This would be the width of a stripe on a raid-5 unit or
one zone in GBDE.  The idea with this field is to hint to clustering
type code to not trivially overrun these boundaries.

stripeoffset is the amount of the first stripe which lies before the
devices beginning.

If we have a device with 64k stripes:
	[0...64k[
	[64k...128k[
	[128k..192k[
Then it will have stripesize = 64k and stripeoffset = 0.

If we put a MBR on this device, where slice#1 starts on sector#63,
then this slice will have: stripesize = 64k, stripeoffset = 63 * sectorsize.

If the clustering code wants to widen a request which writes to
sector#53 of the slice, it can calculate how many bytes till the end of
the stripe as:
	stripewith - (53 * sectorsize + stripeoffset) % stripewidth.
-----------------------------------------------------------------------

#include file usage:

                 geom.h|geom_int.h|geom_ext.h|geom_ctl.h|libgeom.h
----------------+------+----------+----------+----------+--------+
geom class      |      |          |          |          |        |
implementation  |   X  |          |          |          |        |
----------------+------+----------+----------+----------+--------+
geom kernel     |      |          |          |          |        |
infrastructure  |   X  |      X   |  X       |    X     |        |
----------------+------+----------+----------+----------+--------+
libgeom         |      |          |          |          |        |
implementation  |      |          |  X       |    X     |  X     |
----------------+------+----------+----------+----------+--------+
geom aware      |      |          |          |          |        |
application     |      |          |          |    X     |  X     |
----------------+------+----------+----------+----------+--------+

geom_slice.h is special in that it documents a "library" for implementing
a specific kind of class, and consequently does not appear in the above
matrix.
-----------------------------------------------------------------------
Removable media.

In general, the theory is that a drive creates the provider when it has
a media and destroys it when the media disappears.

In a more realistic world, we will allow a provider to be opened medialess
(set any sectorsize and a mediasize==0) in order to allow operations like
open/close tray etc.

@


1.5
log
@For removable devices without media we set a zero mediasize but a non-zero
sectorsize in order to avoid a lot of checks around various divisions etc.

Enforce the sectorsize being > 0 with a KASSERT on successful open.

Fix scsi_cd.c to return 2k sectors when no media inserted.
@
text
@d1 1
a1 1
$FreeBSD$
@


1.5.10.1
log
@Switch importer
@
text
@d1 1
a1 1
$FreeBSD: stable/7/sys/geom/notes 134824 2004-09-05 21:15:58Z phk $
@


1.5.2.1
log
@Switch importer
@
text
@d1 1
a1 1
$FreeBSD: stable/6/sys/geom/notes 134824 2004-09-05 21:15:58Z phk $
@


1.5.28.1
log
@SVN rev 225736 on 2011-09-23 00:51:37Z by kensmith

Copy head to stable/9 as part of 9.0-RELEASE release cycle.

Approved by:	re (implicit)
@
text
@@


1.5.28.2
log
@## SVN ##
## SVN ## Exported commit - http://svnweb.freebsd.org/changeset/base/ 242902
## SVN ## CVS IS DEPRECATED: http://wiki.freebsd.org/CvsIsDeprecated
## SVN ##
## SVN ## ------------------------------------------------------------------------
## SVN ## r242902 | dteske | 2012-11-11 23:29:45 +0000 (Sun, 11 Nov 2012) | 10 lines
## SVN ##
## SVN ## Fix a regression introduced by SVN r211417 that saw the breakage of a feature
## SVN ## documented in usr.sbin/sysinstall/help/shortcuts.hlp (reproduced below):
## SVN ##
## SVN ## If /usr/sbin/sysinstall is linked to another filename, say
## SVN ## `/usr/local/bin/configPackages', then the basename will be used
## SVN ## as an implicit command name.
## SVN ##
## SVN ## Reviewed by:	adrian (co-mentor)
## SVN ## Approved by:	adrian (co-mentor)
## SVN ##
## SVN ## ------------------------------------------------------------------------
## SVN ##
@
text
@d1 1
a1 1
$FreeBSD: stable/9/sys/geom/notes 134824 2004-09-05 21:15:58Z phk $
@


1.5.28.1.4.1
log
@SVN rev 239080 on 2012-08-05 23:54:33Z by kensmith

Copy stable/9 to releng/9.1 as part of the 9.1-RELEASE release process.

Approved by:	re (implicit)
@
text
@@


1.5.28.1.4.2
log
@Switch importer
@
text
@d1 1
a1 1
$FreeBSD: releng/9.1/sys/geom/notes 134824 2004-09-05 21:15:58Z phk $
@


1.5.28.1.2.1
log
@SVN rev 227445 on 2011-11-11 04:20:22Z by kensmith

Copy stable/9 to releng/9.0 as part of the FreeBSD 9.0-RELEASE release
cycle.

Approved by:	re (implicit)
@
text
@@


1.5.28.1.2.2
log
@Switch importer
@
text
@d1 1
a1 1
$FreeBSD: releng/9.0/sys/geom/notes 134824 2004-09-05 21:15:58Z phk $
@


1.5.26.1
log
@SVN rev 216618 on 2010-12-21 17:10:29Z by kensmith

Copy stable/7 to releng/7.4 in preparation for FreeBSD-7.4 release.

Approved by:	re (implicit)
@
text
@@


1.5.26.2
log
@Switch importer
@
text
@d1 1
a1 1
$FreeBSD: releng/7.4/sys/geom/notes 134824 2004-09-05 21:15:58Z phk $
@


1.5.24.1
log
@SVN rev 203736 on 2010-02-10 00:26:20Z by kensmith

Copy stable/7 to releng/7.3 as part of the 7.3-RELEASE process.

Approved by:	re (implicit)
@
text
@@


1.5.22.1
log
@SVN rev 196045 on 2009-08-03 08:13:06Z by kensmith

Copy head to stable/8 as part of 8.0 Release cycle.

Approved by:	re (Implicit)
@
text
@@


1.5.22.2
log
@## SVN ##
## SVN ## Exported commit - http://svnweb.freebsd.org/changeset/base/ 242909
## SVN ## CVS IS DEPRECATED: http://wiki.freebsd.org/CvsIsDeprecated
## SVN ##
## SVN ## ------------------------------------------------------------------------
## SVN ## r242909 | dim | 2012-11-12 07:47:19 +0000 (Mon, 12 Nov 2012) | 20 lines
## SVN ##
## SVN ## MFC r242625:
## SVN ##
## SVN ## Remove duplicate const specifiers in many drivers (I hope I got all of
## SVN ## them, please let me know if not).  Most of these are of the form:
## SVN ##
## SVN ## static const struct bzzt_type {
## SVN ##       [...list of members...]
## SVN ## } const bzzt_devs[] = {
## SVN ##       [...list of initializers...]
## SVN ## };
## SVN ##
## SVN ## The second const is unnecessary, as arrays cannot be modified anyway,
## SVN ## and if the elements are const, the whole thing is const automatically
## SVN ## (e.g. it is placed in .rodata).
## SVN ##
## SVN ## I have verified this does not change the binary output of a full kernel
## SVN ## build (except for build timestamps embedded in the object files).
## SVN ##
## SVN ## Reviewed by:	yongari, marius
## SVN ##
## SVN ## ------------------------------------------------------------------------
## SVN ##
@
text
@d1 1
a1 1
$FreeBSD: stable/8/sys/geom/notes 199583 2009-11-20 15:27:52Z jhb $
@


1.5.22.1.8.1
log
@SVN rev 232438 on 2012-03-03 06:15:13Z by kensmith

Copy stable/8 to releng/8.3 as part of 8.3-RELEASE release cycle.

Approved by:	re (implicit)
@
text
@@


1.5.22.1.8.2
log
@Switch importer
@
text
@d1 1
a1 1
$FreeBSD: releng/8.3/sys/geom/notes 199583 2009-11-20 15:27:52Z jhb $
@


1.5.22.1.6.1
log
@SVN rev 216617 on 2010-12-21 17:09:25Z by kensmith

Copy stable/8 to releng/8.2 in preparation for FreeBSD-8.2 release.

Approved by:	re (implicit)
@
text
@@


1.5.22.1.4.1
log
@SVN rev 209145 on 2010-06-14 02:09:06Z by kensmith

Copy stable/8 to releng/8.1 in preparation for 8.1-RC1.

Approved by:	re (implicit)
@
text
@@


1.5.22.1.2.1
log
@SVN rev 198460 on 2009-10-25 01:10:29Z by kensmith

Copy stable/8 to releng/8.0 as part of 8.0-RELEASE release procedure.

Approved by:	re (implicit)
@
text
@@


1.5.20.1
log
@SVN rev 191087 on 2009-04-15 03:14:26Z by kensmith

Create releng/7.2 from stable/7 in preparation for 7.2-RELEASE.

Approved by:	re (implicit)
@
text
@@


1.5.18.1
log
@SVN rev 185281 on 2008-11-25 02:59:29Z by kensmith

Create releng/7.1 in preparation for moving into RC phase of 7.1 release
cycle.

Approved by:	re (implicit)
@
text
@@


1.5.16.1
log
@SVN rev 183531 on 2008-10-02 02:57:24Z by kensmith

Create releng/6.4 from stable/6 in preparation for 6.4-RC1.

Approved by:	re (implicit)
@
text
@@


1.4
log
@A note about which #include files may be used where.
@
text
@d141 10
@


1.4.6.1
log
@MFC:
   For removable devices without media we set a zero mediasize but a non-zero
   sectorsize in order to avoid a lot of checks around various divisions etc.
   Enforce the sectorsize being > 0 with a KASSERT on successful open.
   Fix scsi_cd.c to return 2k sectors when no media inserted.

Approved by:	re::kensmith
@
text
@a140 10
-----------------------------------------------------------------------
Removable media.

In general, the theory is that a drive creates the provider when it has
a media and destroys it when the media disappears.

In a more realistic world, we will allow a provider to be opened medialess
(set any sectorsize and a mediasize==0) in order to allow operations like
open/close tray etc.

@


1.3
log
@Better names for struct disk elements:  d_maxsize, d_stripeoffset
and d_stripesisze;

Introduce si_stripesize and si_stripeoffset in struct cdev so we
can make the visible to clustering code.

Add stripesize and stripeoffset to providers.

DTRT with stripesize and stripeoffset in various places in GEOM.
@
text
@d119 22
@


1.2
log
@Update the statistics collection code to track busy time instead of
idle time.

Statistics now default to "on" and can be turned off with
        sysctl kern.geom.collectstats=0

Performance impact of statistics collection is on the order of
800 nsec per consumer/provider set on a 700MHz Athlon.
@
text
@d89 30
@


1.1
log
@Commit the correct copy of the g_stat structure.

Add debug.sizeof.g_stat sysctl.

Set the id field of the g_stat when we create consumers and providers.

Remove biocount from consumer, we will use the counters in the g_stat
structure instead.  Replace one field which will need to be atomically
manipulated with two fields which will not (stat.nop and stat.nend).

Change add companion field to bio_children: bio_inbed for the exact
same reason.

Don't output the biocount in the confdot output.

Fix KASSERT in g_io_request().

Add sysctl kern.geom.collectstats defaulting to off.

Collect the following raw statistics conditioned on this sysctl:

    for each consumer and provider {
        total number of operations started.
        total number of operations completed.
        time last operation completed.
        sum of idle-time.
        for each of BIO_READ, BIO_WRITE and BIO_DELETE {
            number of operations completed.
            number of bytes completed.
            number of ENOMEM errors.
            number of other errors.
            sum of transaction time.
        }
    }

API for getting hold of these statistics data not included yet.
@
text
@d41 48
@

