2011-10-02 7 views
6

あなたが私を助けることを望みます。 デバイスがリムーバブルかどうかを判断しようとしていますが、デバイス名(/ dev/sdc)だけです。実際には、このファイルのフルパスでリムーバブルメディア上またはローカルディスク上のファイルを判断する必要があります。デバイス名でデバイスフラグを取得する

Iは電流> FS-> PWD で検索するようにしようと試みていると私は見つけることができるすべてはここにフラグのセットです: *の電流> FS-> pwd.mnt-> mnt_sb- > s_bdev-> bd_disk->フラグ* リムーバブルデバイスのためのGENHD_FL_REMOVABLEセットが

しかし、私は常にセット同じフラグを取得します(私は理解し、s_bdevが常に同じデバイス(は/ dev/sdaに)を指します)。

これで、mtabを解析して自分のファイルを含むデバイス名(/ dev/sdc)を取得できますが、それでもリムーバブルであるかどうかはわかりません。

block_device構造体をデバイス名で取得する方法はありますか? (例えば、 "ファイル" 構造 "ファイル" 構造に FD =オープン( "名前") FL = fged(FD) ここFLポイントを呼び出すことによって得ることができる)

答えて

1

class_dev_iter_initclass_dev_iter_nextを使用してブロックデバイスを反復処理できます(dev-name =デバイスの名前:sda、hda、fd0、...)。使用方法についてはblock/genhd.cblk_lookup_devtのコードを参照してください。

デバイスをお持ちの場合は、dev_to_diskを使用してstruct gendisk *を取得し、リムーバブルフラグを確認できます。

+0

ありがとう、それは私の問題を解決するようです – Makc

+0

私はこのファイルへの完全なパスのみを持っている場合、この方法を使用して、ブロックデバイスのいずれが私の開いたファイルを含むかを判断する方法。 – Makc

+1

@Makc: 'vfs_stat'を使うと、' dev_t'をブロックデバイスと比較できる 'struct kstat'が得られます。 – Hasturkun

1

読み取り/ SYS /ブロック/ dev-name/removableはデバイスがリムーバブルの場合は1、そうでない場合は0を含める必要があります。

+0

私はこれについて知っていますが、古いLinuxバージョンでは動作しません。とにかく、ありがとうございます。 – Makc

+0

また、私はカーネルモジュールからファイルを読むための安全な方法を知らない。 (私はsys_read()とvfs_read()を試しました - それは "Oops"の原因です:))おそらく、あなたはカーネルモジュールからsysfsにアクセスする方法を知っていますか? – Makc

関連する問題