G_BIO(9) | FreeBSD Kernel Developer's Manual | G_BIO(9) |
名称
g_new_bio, g_clone_bio, g_destroy_bio, g_print_bio — GEOM bio 制御関数書式
#include < sys/bio.h>#include < geom/geom.h>
struct bio *
g_new_bio( void);
struct bio *
g_alloc_bio( void);
struct bio *
g_clone_bio( struct bio *bp);
struct bio *
g_duplicate_bio( struct bio *bp);
void
g_destroy_bio( struct bio *bp);
void
g_print_bio( struct bio *bp);
解説
struct bio は I/O 要求を表現するために GEOM によって使用され、最も重要なフィールドは次で説明されます:- bio_cmd
-
I/O 要求コマンド。 GEOM で利用可能な 4 つの I/O 要求があります:
- BIO_READ
- 読み込み要求。
- BIO_WRITE
- 書き込み要求。
- BIO_DELETE
- 特定の範囲のデータがもう使用されないで、基本的な技術サポートとして、それを消すか、または解放することができることを示します。関連ブロックを消すように準備することができ、暗号デバイスが攻撃に利用可能なデータの量を減少させるための範囲にランダムビットを満たしたいかもしれません。
- BIO_GETATTR
- 特定のプロバイダかパスで帯域外の属性を検査して操作します。属性は、ASCII 文字列によって名前が付けられ bio_attribute フィールドに格納されます。
- BIO_FLUSH
- それらの書き込みキャッシュをフラッシュするために基本的なプロバイダに伝えます。
- bio_flags
-
利用可能なフラグは次の通りです:
- BIO_ERROR
- 要求は失敗しました (エラー値は bio_error フィールドに格納されます)。
- BIO_DONE
- 要求は終了しました。
- bio_cflags
- コンシューマ (消費者) によってプライベートに使用。
- bio_pflags
- プロバイダによってプライベートに使用。
- bio_offset
- プロバイダへのオフセット。
- bio_data
- データバッファへのポインタ。
- bio_error
- BIO_ERROR が設定されるときのエラー値。
- bio_done
- 要求が終了するときに呼び出される関数へのポインタ。
- bio_driver1
- プロバイダによってプライベートに使用。
- bio_driver2
- プロバイダによってプライベートに使用。
- bio_caller1
- コンシューマによってプライベートに使用。
- bio_caller2
- コンシューマによってプライベートに使用。
- bio_attribute
- BIO_GETATTR 要求のための属性文字列。
- bio_from
- ( bio_to フィールド (クラスでは通常読み込み専用) に格納されたプロバイダにアタッチされた) 要求を使用するコンシューマ。
- bio_to
- 宛先プロバイダ (クラスでは通常読み込み専用)。
- bio_length
- バイト単位の要の長さ。
- bio_completed
- 要求の前部から完了する必要はありませんが、完了したバイト数。
- bio_children
- bio クローン (クラスでは通常読み込み専用) の数。
- bio_inbed
- 終了した bio クローンの数。
- bio_parent
- 親の bio へのポインタ。
g_new_bio() 関数は新しく、空の bio 構造体を割り付けます。
g_alloc_bio() - g_new_bio() と同じですが、常に成功します ( M_WAITOK malloc フラグで bio を割り付け)。
g_clone_bio() 関数は、新しい bio 構造体を割り付けて、クローンへの引数として与えられた bio から次のフィールドをコピーします: bio_cmd, bio_length, bio_offset, bio_data, bio_attribute。クローンでのフィールド bio_parent は渡された bio を指し、渡された bio でフィールド bio_children は増加されます。
この関数は特定の geom のプロバイダを通して入るあらゆる要求に使用されるべきです、そして、スケジュールされる必要性は減ります。適切な順序は次の通りです:
- 受信された struct bio のクローンです。
- クローンを修正します。
- それ自体のコンシューマでクローンをスケジュールします。
g_duplicate_bio() - g_clone_bio() と同じですが、常に成功します ( M_WAITOK malloc フラグで bio を割り付け)。
g_destroy_bio() 関数は、与えられた bio 構造体の割り付けを解放して、破壊します。
g_print_bio() 関数は (デバッグ目的のために) 与えられた bio 構造体に関する情報を印刷 (表示) します。
戻り値
g_new_bio() と g_clone_bio() 関数は割り付けられた bio へのポインタを返すか、またはエラーが起こったなら、 NULL を返します。使用例
“ NULL-変換”の実装は I/O 要求はクローンされ、少しの変更なしでスケジュールが減ることを意味します。構造体 example_softc のフィールド ex_consumer が操作したいと望んでいるプロバイダにアタッチされたコンシューマを含んでいると仮定しましょう。
void example_start(struct bio *bp) { struct example_softc *sc; struct bio *cbp; printf("Request received: "); g_print_bio(bp); printf("\n"); sc = bp->bio_to->geom->softc; if (sc == NULL) { g_io_deliver(bp, ENXIO); return; } /* 我々の bio 要求をクローンにする. */ cbp = g_clone_bio(bp); if (cbp == NULL) { g_io_deliver(bp, ENOMEM); return; } cbp->bio_done = g_std_done; /* 標準の 'done' 関数. */ /* OK, そのスケジュールを降ろします. */ /* * コンシューマは我々の geom に 1 つのみあるなら, 同様に * LIST_FIRST(&bp->bio_to->geom->consumers) から * 取得することができます. */ g_io_request(cbp, sc->ex_consumer); }
関連項目
geom(4), DECLARE_GEOM_CLASS(9), g_access(9), g_attach(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>によって書かれました。November 1, 2006 | FreeBSD |