Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

open() エントリポイント (ブロックドライバ)

open (9E) エントリポイントは、指定されたデバイスへのアクセスを取得するために使用されます。ブロックドライバの open(9E) ルーチンは、ユーザースレッドがマイナーデバイスに関連付けられたブロック型特殊ファイルに対して open (2) または mount (2) システムコールを発行したとき、または階層化ドライバが open (9E) を呼び出したときに呼び出されます。詳細については、File I/Oを参照してください。

open() エントリポイントは、次の条件を確認します。

  • デバイスを開くことができる。つまり、デバイスがオンラインで、準備ができている。

  • 要求どおりにデバイスを開くことができる。デバイスがこの操作をサポートしている。デバイスの現在の状態が要求と競合していない。

  • 呼び出し元がデバイスを開くためのアクセス権を持っている。

次の例は、ブロックドライバの open (9E) エントリポイントを示しています。

使用例 16-2  ブロックドライバの open (9E) ルーチン
static int
xxopen(dev_t *devp, int flags, int otyp, cred_t *credp)
{
    minor_t         instance;
    struct xxstate        *xsp;

    instance = getminor(*devp);
    xsp = ddi_get_soft_state(statep, instance);
    if (xsp == NULL)
        return (ENXIO);
    mutex_enter(&xsp->mu);
    /*
     * only honor FEXCL. If a regular open or a layered open
     * is still outstanding on the device, the exclusive open
     * must fail.
     */
    if ((flags & FEXCL) && (xsp->open || xsp->nlayered)) {
        mutex_exit(&xsp->mu);
        return (EAGAIN);
    }
    switch (otyp) {
      case OTYP_LYR:
          xsp->nlayered++;
          break;
      case OTYP_BLK:
          xsp->open = 1;
          break;
      default:
          mutex_exit(&xsp->mu);
          return (EINVAL);
    }
    mutex_exit(&xsp->mu);
    return (0);
}

otyp 引数は、デバイスに対するオープンのタイプを指定するために使用されます。OTYP_BLK は、ブロックデバイスの標準的なオープンのタイプです。otypOTYP_BLK に設定されている場合は、デバイスを複数回開くことができます。close (9E) は、デバイスに対するタイプ OTYP_BLK の最後のクローズが実行されるときに 1 回だけ呼び出されます。デバイスが階層化デバイスとして使用されている場合、otypOTYP_LYR に設定されます。階層化ドライバは、タイプ OTYP_LYR のすべてのオープンに対してタイプ OTYP_LYR の対応するクローズを発行します。この例ではオープンの各タイプを常時監視しているため、ドライバはデバイスがいつ使用されていないかを close (9E) で判定できます。