DVD+RW にはマルチセッションの概念がありませんが、DVD-ROM との互換性により
“CLOSE TRACK/SESSION (5Bh)” という MMC コマンドを発行しなければならないことがあります。 例えばメディアをイジェクトしようとしたら、バックグラウンドフォーマットが行われていたため終了/中断しなければならない場合や、単に読み込みを速くする目的で
read-only でマウントし直したりする場合などです。
パッチの第1の目的はこれらを可能とすることです。 つまりメディアへの書込みが行われていることや、ドアがロックされずに
“ファイナライズ” 処理が行われていることを知ることです。
第2に、どのようなファイルシステムでも断片化の問題を避けて通れません。 “断片化”
とは次のようなことです。
例えば 2KB 単位のデータを扱う場合でもそのデータは物理的に 32KB 単位の塊で処理されるということです。
具体的には、2KB のデータを書き込む場合、まず 32KB の塊が読み込まれ、その内の
2KB に相当する部分が置き換えられ、最後にその変更された 32KB の塊が書き出されます。
“断片化を伴う要求(Fragmented requests)” とは、このように 32KB より小さいか、32KB
の塊の間にまたがる要求のことです。 ドライブ内のファームウェアには処理最適化のためのキャッシングアルゴリズムが実装されていますが、これがどんな場合もうまく働くわけではありません。
不幸にもうまく機能しなくなった場合、ドライブは “COMMAND SEQUENCE ERROR
(2Ch)” を返し、勝手にI/O処理を止めてしまいます。 この状況に対処するためには
“SYNCHRONIZE CACHE (35h)” と呼ばれる MMC コマンドを発行し、ドライブのキャッシュをフラッシュさせて処理を継続しなければなりません。
これを行うようにすることが “DVD+RWサポート(パッチ)” の第2の目的です。
残念ながら上の段落の内容は第1世代のドライブ・・・すなわち Ricoh MP5120A
およびその派生機には当てはまらないようです:-( 。 “SYNCHRONIZE CACHE (35h)”
は効かないらしく、 “COMMAND SEQUENCE ERROR (2Ch)” を吐き続けて無限ループに陥るようです。
これでは任意のファイルシステムに対応させることはできません。とりあえずメディアがアンマウントされるまで
I/O 処理を停止するようにしていますが、何か良い考えがあれば教えてください。
第2世代のドライブでもごくまれに、特殊な状況下で似たような[しかし異なる]動作をするものがあることが報告されています。
少なくとも私はそれを再現することができませんでした。 その問題はファームウェアのアップグレードで解消されたと報告されています。
ほとんどのベンダでは、[ほとんど?]のポスト第2世代のドライブについて、どうも
DVD+RW の仕様、例えば “2KB のグラニュラリティ (粒状性=データの塊の単位)
での真のランダムライト” のような部分への準拠を怠っているようです。
ベンダ側は、DVD-RW の Restricted Overwrite と似た方法を使ってホスト側で処理することを期待しているようです。
具体的には、ホスト側で複数の 2KB の書込み要求を DVD ECC ブロックサイズである
32KB にまとめ、書き込むようにすることです。 本来はそんなことを要求されるのは筋違いです。が、これが業界の実情なのです。
私はこの手の問題に随分悩まされています。 あるドライブはベンダ固有のポジショニングエラーコードである
03h/15h/82h などを吐いて止まってしまうことがありました。 特にメディアが新しくフォーマッティングされた場合に見られるようです。
理由はいくつか考えられます。 そのひとつは、ブロックバッファキャッシュのリオーダーリクエストにより、キャッシュの内容の連続性が失われた状況です。
これは “FLASH CACHE” により起こると考えられます。
もう一つは、“アンダーラン” の状態でバックグラウンドフォーマッティングが始まり、これを明示的に停止させなければならない状況です。
“アンダーラン” を強調したのは、ドライブ側でデータの流れが止まった状況に対処すべきだからです。
もしこの状況に陥ったら(多分陥ることになると思いますが)、growisofs のコマンドラインの最初に
-poor-man オプションを付加してみてください。 このオプションはリオーダーリクエストを抑止すると共に、“アンダーラン”
状態が発生する可能性を低くします (VMサブシステムへの過負荷防止機能を外すことで)。
最初は DVD+RW サポートを drivers/cdrom/cdrom.c に組み込むつもりでした。
しかし残念ながら SCSI レイヤは WRITE コマンドの発行可否を制御するための独自の
“書込み可” フラグを持っており、これがCD-ROM 共通ドライバ (sr_mod.c) から見えないため、諦めざるを得ませんでした。
IDE ドライブしかないのになぜ SCSI ドライバを? と思うかもしれませんが、同じドライブを使ってcdrecord
でCD-R['W'] を焼く場合、ide-scsi エミュレーションレイヤを経由するからです。
だから DVD+RW 用なのにSCSI CD-ROM ドライバに注目せざるを得ないわけです。
残念ながら必要なもの全てを sr_mod.o に組み込むのは不可能でした :-( 。 メディアに書込許可可能かどうかが判断される前にメディアをセンスしなければならないため、
drivers/cdrom/cdrom.c の小変更が必要なのです。 DVD+RW ドライブはマウントされるメディアによってその特性を変えるため、新しいメディアが挿入されたことを真っ先に検出する必要があるのです。
|