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

名称

g_accessGEOM コンシューマ (消費者) とそれらのプロバイダへのアクセスを制御する

書式

#include < geom/geom.h>

int
g_access( struct g_consumer *cp, int dcr, int dcw, int dce);

解説

g_access() 関数は一般的に、与えられたコンシューマ (消費者) cp にアタッチされるプロバイダへのアクセスをオープンし、クローズし、変更します。引数 dcr, dcwdce は関連する読み込み、書き込み、と排他的なアクセスカウントの変更を表します。読み込みと書き込みアクセスカウントは自明で、排他的なアクセスカウントは、他の関心がある部分への書き込みアクセスを拒否します。プロバイダのアクセスカウントはすべてのアタッチされたコンシューマのアクセスカウントの合計です。

g_attach(9) でコンシューマをプロバイダにアタッチした後に、 g_access() 関数は I/O 要求を始める前に、コンシューマ上で呼び出されなければなりません。

制限/条件

コンシューマはプロバイダにアタッチされなければなりません。

対象となる変更は負のアクセスカウントとなってはいけません。

ノーオペレーションは許可されません ( dcr = dcw = dce = 0)。

プロバイダの geom には、アクセス方法定義 (例えば、 gp->access) がなければなりません。

トポロジロックは保持されなければなりません。

戻り値

成功すれば、 g_access() 関数は 0 を返します。そうでなければ、エラーコードが返されます。引数 dcr, dcwdce が 0 以下であるときに、 g_access() が失敗するかもしれないことに注意してください。

使用例

コンシューマを作成して、それを与えられたプロバイダにアタッチし、読み込みアクセスを獲得し、最初のセクタを読み込みます。

void 
some_function(struct g_geom *mygeom, struct g_provider *pp) 
{ 
 struct g_consumer *cp; 
 void *ptr; 
 int error; 
 
 g_topology_assert(); 
 
 /* 新しいコンシューマを 'mygeom' geom に作成します。*/ 
 cp = g_new_consumer(mygeom); 
 /* 新たに作成されたコンシューマを与えられたプロバイダに 
    アタッチします。*/ 
 if (g_attach(cp, pp) != 0) { 
  g_destroy_consumer(cp); 
  return; 
 } 
 /* 我々のコンシューマを通して読み込みむためにプロバイダを 
    オープンします。*/ 
 error = g_access(cp, 1, 0, 0); 
 if (error != 0) { 
  printf("Cannot access provider: %s\n", error); 
  g_detach(cp); 
  g_destroy_consumer(cp); 
  return; 
 } 
 
 /* 
  * 読み込み間にトポロジロックを保持しない。 
  */ 
 g_topology_unlock(); 
 ptr = g_read_data(cp, 0, pp->sectorsize, &error); 
 if (ptr == NULL) 
  printf("Error while reading: %d\n", error); 
 /* 
  * データで何か便利にする。 
  */ 
 g_topology_lock(); 
 
 /* プロバイダ (リリースアクセスカウント) の接続を切ります。*/ 
 g_access(cp, -1, 0, 0); 
 /* プロバイダからデタッチします。*/ 
 g_detach(cp); 
 /* コンシューマを破壊する。*/ 
 g_destroy_consumer(cp); 
}

エラー

あり得るエラーは次の通りです:
[ EPERM]
関数は排他的なアクセスカウントでプロバイダをオープンしようとしていますが、それは既に書き込みモードでオープンされています。
[ EPERM]
関数は書き込みモードでプロバイダをオープンしようとしていますが、それは既に排他的にオープンされています。

プロバイダのアクセス方法によって返すことができる他のなんらかのエラーがあります。

作者

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