EN JA
G_ATTACH(9)
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]
操作はトポロジループを作成しています。

作者

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