DISK(9) | FreeBSD Kernel Developer's Manual | DISK(9) |
名称
disk — カーネルディスク記憶域 API書式
#include < geom/geom_disk.h> struct disk *
disk_alloc( void);
void
disk_create( struct disk *disk, int version);
void
disk_gone( struct disk *disk);
void
disk_destroy( struct disk *disk);
int
disk_resize( struct disk *disk, int flags);
解説
ディスク記憶域 API は、 GEOM(4) と devfs(5) を含む、他のカーネルコンポーネントにデバイスを通知するためにディスクのような記憶域デバイスへのアクセスを提供するカーネルデバイスドライバを可能にします。各ディスクデバイスは、ディスクデバイスのためのさまざまなパラメータ、デバイスドライバのためのプライベートなデータ記憶域と同様に、デバイスで実行されるかもしれない様々なメソッドのための関数ポインタを含む struct disk 構造体によって説明されます。さらに、いくつかのフィールドは、デバイスへのアクセスとその統計値を管理する GEOM によって使用するために予約されています。
GEOM には struct disk の所有権があり、デバイスがサービス要求の準備ができているとき、ドライバは、 disk_alloc() 関数でそれのための記憶域を割り付けて、フィールドに書き込み、 disk_create() を呼び出さなければなりません。ディスクの容量の変更に関して GEOM に通知するために d_mediasize を修正した後に、ドライバによって disk_resize() を呼び出すことができます。 flags フィールドは、M_WAITOK または M_NOWAIT のいずれかに設定されるべきです。 disk_gone() は、それぞれ ENXIO のエラー条件を設定して、ドライブに関連しているすべてのプロバイダを孤立化します。さらに、エラー条件がプロバイダで設定されたなら、書き込みのために最後のクローズで再味 (re-taste) を防ぎます。 disk_destroy() の呼び出しの後では、デバイスドライバは、もはや struct disk の内容にアクセスすることができません。
disk_create() 関数は、常に DISK_VERSION に渡さなければならない、2 番目のパラメータ version を取ります。 GEOM がサポートされないバージョンに対してコンパイルされているドライバを検出するなら、デバイスを無視して、コンソールに警告を印刷 (表示) します。
説明的なフィールド
次のフィールドは、構造体のインスタンスによって説明されるディスクデバイスを識別して、 disk_create() へ構造体を提出する前に書き込まなければなりません、そして、その後は変更できません:- u_int d_flags
- とのようなオプション機能か、または記憶域デバイスドライバのサポートを説明する、記憶域フレームワークを示すオプションのフラグ。現在サポートされているフラグは、 DISKFLAG_NEEDSGIANT (デバイスドライバによって維持される)、 DISKFLAG_OPEN (記憶域フレームワークによって維持される)、 DISKFLAG_CANDELETE (デバイスドライバによって維持される) と DISKFLAG_CANFLUSHCACHE (デバイスドライバによって維持される) です。
- const char * d_name
-
記憶域デバイスクラス、例えば、“
ahd
”、の名前を保持します。この値は、通常特定のドライバデバイスをユニークに識別します、そして他のデバイスドライバによってサービスされるデバイスと競合してはいけません。 - u_int d_unit
-
記憶域デバイスクラスのインスタンス、例えば、“
4
”、を保持します。この名前空間は、デバイスドライバによって管理されて、ユニット番号の割り当ては、プローブ順の優先順位か、またはある場合はトポロジであるかもしれません。 d_name と d_unit 値は共にディスク記憶域デバイスをユニークに識別します。
ディスクデバイスメソッド
次のフィールドは、実装されるなら、様々なディスクデバイスメソッドを識別します:- disk_open_t * d_open
- オプション: ディスクデバイスがオープンされるとき、呼び出されます。メソッドが提供されないなら、オープンは常に成功します。
- disk_close_t * d_close
- オプション: ディスクデバイスがクローズされるとき、呼び出されます。エラーコードが返されるかもしれませんが、対応するオープンしているメソッド呼び出しによってどんな状態のセットアップの呼び出しも常に終了されるべきです。
- disk_strategy_t * d_strategy
- 強制的: 新しい struct bio がディスクデバイスで開始されるときに、呼び出されます。
- disk_ioctl_t * d_ioctl
- オプション: I/O 制御操作ががディスクデバイスで開始されるとき、呼び出されます。セキュリティの理由で、これらの操作はそれらが実行されるもの以外の他のデバイスに影響することができないはずであることに注意してください。
- dumper_t * d_dump
- オプション: dumpon(8) によって設定されるなら、この関数は、カーネルパニックの後の制限されたシステム状態からシステム RAM のコピーをディスクに記録するために呼び出されます。
- disk_getattr_t * d_getattr
- オプション: このメソッドが提供されるなら、BIO_GETATTR 要求へのデフォルトの GEOM 応答を上書きする機会をディスクドライバに与えます。この関数は、属性が扱われないなら、-1 を返し、属性が扱われるなら、0 を返し、または g_io_deliver() に渡される errno を返すべきです。
- disk_gone_t * d_gone
- オプション: このメソッドが提供されるなら、いったん GEOM がそのクリーンアッププロセスを終了したならば、disk_gone() が呼び出された後に、それが呼び出されます。いったん、このコールバックが呼び出されると、GEOM からさらに呼び出しを受け付けないので、そのリソースをすべてを解放するディスクドライバに対して安全です。
強制的なメディアの特性
次のフィールドはディスクデバイスのサイズと精度を識別します。これらのフィールドは、クローズメソッドが呼び出されない場合、ドライバのオープンメソッドの返りから安定していた状態のままでなければなりませんが、返る前にオープンメソッドでそれらを変更することは完全に正当です。- u_int d_sectorsize
- バイト単位のディスクデバイスのセクタサイズ。
- off_t d_mediasize
- バイト単位のディスクデバイスのサイズ。
- u_int d_maxsize
- I/O 要求のバイト単位の最大のサポートサイズ。このサイズより大きい要求は GEOM によって細かく切られます。
オプションのメディアの特性
これらのオプションフィールドは、ディスクデバイスに関する特別の情報を提供することができます。フィールド/コンセプトが適用されないなら、これらのフィールドは初期化していけません。これらのフィールドは、クローズメソッドが呼び出されない場合、ドライバのオープンメソッドの返りから安定していた状態のままでなければなりませんが、返る前にオープンメソッドでそれらを変更することは完全に正当です。- u_int d_fwsectors, u_int d_fwheads
- ファームウェアか BIOS によってディスクデバイスで通知されるセクタとヘッドの数。これらの値は、ほとんど例外なく偽ですが、いくつかのアーキテクチャでは、ディスクのパーティショニングの正しい計算に必要です。
- u_int d_stripeoffset, u_int d_stripesize
- これらの 2 つのフィールドは、多くのディスク技術のために自然な性能限界の幅と位置について説明するために使用することができます。詳細については src/sys/geom/notes を参照してください。
- char d_ident[DISK_IDENT_SIZE]
- このフィールドは、上に記述された d_getattr メソッドが実装されないなら、または、それが GEOM::ident 属性をサポートしていないなら、ディスクのシリアル番号を格納するために使用することができ、また、使用されるべきです。
- char d_descr[DISK_IDENT_SIZE]
- このフィールドは、ディスクベンダと製品の説明を格納するために使用することができます。
- uint16_t d_hba_vendor
- このフィールドは、ディスクに接続された HBA のための PCI ベンダ ID を格納するために使用することができます。
- uint16_t d_hba_device
- このフィールドは、ディスクに接続された HBA のための PCI デバイス ID を格納するために使用することができます。
- uint16_t d_hba_subvendor
- このフィールドは、ディスクに接続された HBA のための PCI サブベンダ ID を格納するために使用することができます。
- uint16_t d_hba_subdevice
- このフィールドは、ディスクに接続された HBA のための PCI サブデバイス ID を格納するために使用することができます。
ドライバのプライベートデータ
このフィールドは、ディスクサービスを実装するためのプライベートデータへのポインタを格納するために、デバイスドライバによって使用されます。- void * d_drv1
- プライベテートデータポインタ。このディスクデバイスのためにドライバ softc 構造体へのポインタを格納するために通常使用されます。
作者
このマニュアルページは、 によって書かれました。October 30, 2012 | FreeBSD |