EN JA
G_GEOM(9)
G_GEOM(9) FreeBSD Kernel Developer's Manual G_GEOM(9)

名称

g_new_geomf, g_destroy_geomgeom 管理

書式

#include < geom/geom.h>

struct g_geom *
g_new_geomf( struct g_class *mp, const char *fmt, ...);

void
g_destroy_geom( struct g_geom *gp);

解説

geom (“GEOM”での“geom”と混同しなでください) は GEOM クラスのインスタンスです。例えば: 代表的な i386 FreeBSD システムでは、各ディスクにクラス MBR の 1 つの geom があります。 geom の名前は実際には重要ではありません、それは XML ダンプとデバッグ目的に使用されるだけです。同じ名前がある多くの geom が存在することができます。

g_new_geomf() 関数は、クラス mp のインスタンスになる新しい geom を作成します。 geom の名前は引数の残りから printf(3) のような方法で作成されます。

g_destroy_geom() 関数は直ちに与えられた geom を破壊し、すべての関連する保留中 (pending) のイベントをキャンセルします。

g_geom 構造体は、この geom に関連するどんなプロバイダまたはコンシューマを作成する前を除いて (すべてが必要であるというわけではありません)、 geom の作成の後に呼び出し側によって設定されるべきであるフィールドを含んでいます:

g_start_t * start
I/O 処理に使用される関数へのポインタ。
g_spoiled_t * spoiled
コンシューマスポイリング (仕損じ) に使用される関数へのポインタ。
g_dumpconf_t * dumpconf
XML 形式ダンプにおける設定に使用される関数へのポインタ。
g_access_t * access
アクセス制御に使用される関数へのポインタ。
g_orphan_t * orphan
親のないコンシューマに関する情報を提供するために使用される関数へのポインタ。
g_ioctl_t * ioctl
ioctl 要求の取り扱いに使用される関数へのポインタ。
void * softc
プライベート使用のためのフィールド。

制限/条件

この geom のプロバイダを使用しようとしているなら、利用者の geom のフィールド start を設定しなければなりません。

利用者の geom でコンシューマを使用する予定があるなら、フィールド orphanaccess を設定しなければなりません。

g_new_geomf():

  • クラス mp は (GEOM で登録された) 有効なものでなければなりません。
  • トポロジロックは保持されなければなりません。

g_destroy_geom():

  • geom はどんなプロバイダも保有することができません。
  • geom はどんなコンシューマも保有することができません。
  • トポロジロックは保持されなければなりません。

戻り値

g_new_geomf() 関数は新しく作成された geom へのポインタを返します。

使用例

例の geom を作成します。

static struct geom * 
g_example_start(struct bio *bp) 
{ 
 
 [...] 
} 
 
static void 
g_example_orphan(struct g_consumer *cp) 
{ 
 
 g_topology_assert(); 
 
 [...] 
} 
 
static void 
g_example_spoiled(struct g_consumer *cp) 
{ 
 
 g_topology_assert(); 
 
 [...] 
} 
 
static void 
g_example_access(struct g_provider *pp, int dr, int dw, int de) 
{ 
 
 [...] 
} 
 
static struct g_geom * 
create_example_geom(struct g_class *myclass) 
{ 
 struct g_geom *gp; 
 
 g_topology_lock(); 
 gp = g_new_geomf(myclass, "example_geom"); 
 g_topology_unlock(); 
 gp->start = g_example_start; 
 gp->orphan = g_example_orphan; 
 gp->spoiled = g_example_spoiled; 
 gp->access = g_example_access; 
 gp->softc = NULL; 
 
 return (gp); 
} 
 
static int 
destroy_example_geom(struct g_geom *gp) 
{ 
 
 g_topology_lock(); 
 if (!LIST_EMPTY(&gp->provider) || 
     !LIST_EMPTY(&gp->consumer)) { 
  g_topology_unlock(); 
  return (EBUSY); 
 } 
 g_destroy_geom(gp); 
 g_topology_unlock(); 
 
 return (0); 
}

作者

このマニュアルページは、 Pawel Jakub Dawidek <pjd@FreeBSD.org>によって書かれました。
January 16, 2004 FreeBSD