G_ATTACH(9) | FreeBSD Kernel Developer's Manual | G_ATTACH(9) |
名称
g_attach, g_detach — プロバイダへの GEOM コンシューマ (消費者) をアタッチするか、プロバイダからの GEOM コンシューマ (消費者) をデタッチする書式
#include < geom/geom.h> int
g_attach( struct g_consumer *cp, struct g_provider *pp);
void
g_detach( struct g_consumer *cp);
解説
g_attach() 関数は、与えられたコンシューマ (消費者) cp を与えられたプロバイダ pp にアタッチします、その結果、アクセスカウントを変更して、I/O 操作を実行することができる、コンシューマとプロバイダの間の通信チャネルを確立します。g_detach() 関数は、対応するプロバイダから与えられたコンシューマ cp をデタッチし、それらの間の通信チャネルを取りこわします。
制限/条件
g_attach():- コンシューマはプロバイダにアタッチされてはなりません。
- 操作はトポロジループを作成してはいけません。
- トポロジロックは保持されなければなりません。
g_detach():
- コンシューマはアタッチされなければなりません。
- アクセスカウントは 0 でなければなりません。
- アクティブな要求はあるはずがありません。
- トポロジロックは保持されなければなりません。
戻り値
g_attach() 関数は、成功すれば 0 を返します。そうでなければ、エラーコードが返されます。使用例
コンシューマを作成し、与えられたプロバイダにアタッチし、読み込みアクセスを獲得し、クリーンアップします。
void some_function(struct g_geom *mygeom, struct g_provider *pp) { struct g_consumer *cp; g_topology_assert(); /* 新しいコンシューマを 'mygeom' geom に作成します。*/ cp = g_new_consumer(mygeom); /* 新たに作成されたコンシューマを与えられたプロバイダに アタッチします。*/ if (g_attach(cp, pp) != 0) { g_destroy_consumer(cp); return; } /* 我々のコンシューマを通して読み込みむためにプロバイダを オープンします。*/ if (g_access(cp, 1, 0, 0) != 0) { g_detach(cp); g_destroy_consumer(cp); return; } g_topology_unlock(); /* * プロバイダから、データを読み込む。 */ g_topology_lock(); /* プロバイダ (リリースアクセスカウント) の接続を切ります。*/ g_access(cp, -1, 0, 0); /* プロバイダからデタッチします。*/ g_detach(cp); /* コンシューマを破壊する。*/ g_destroy_consumer(cp); }
エラー
あり得るエラーは次の通りです:- [ ELOOP]
- 操作はトポロジループを作成しています。
関連項目
geom(4), DECLARE_GEOM_CLASS(9), g_access(9), g_bio(9), g_consumer(9), g_data(9), g_event(9), g_geom(9), g_provider(9), g_provider_by_name(9), g_wither_geom(9)作者
このマニュアルページは、 <pjd@FreeBSD.org>によって書かれました。January 16, 2004 | FreeBSD |