ToDo:
FreeBSD/amd64環境にて、sectorsizeが non-zeroかつ stripsizeが zeroの レアケースで発生するrecoverdiskのerrataです
stable/9で見つけましたが、headにも同様の問題があると思われる
結果として、ioctl(fdr, DIOCGSECTORSIZE, §orsize)の呼び出し後に ioctl(fdr, DIOCGSTRIPESIZE, &stripesize)を呼び出した時点で、sectorsize が上書きされて zeroになり bigsize = (bigsize / sectorsize) * sectorsize にて除算例外が発生する
diskinfoは正しく実装されてるのでケアレスミスの類ですが off_t型を返す ioctlの実装が直感的では無い気がします
DIOCGSTRIPESIZEと対になるDIOCGSTRIPEOFFSETが off_t型を返すのは当然ですが、 値の範囲は stripe offsetと同じなので同じ型なのだと思いますが、 本来は DIOCGSECTORSIZE/DIOCGSTRIPESIZE共に size_t型で戻す方が 現代的な Cの型システム的には自然に思えます
Index: sbin/recoverdisk/recoverdisk.c =================================================================== --- sbin/recoverdisk/recoverdisk.c (revision 247904) +++ sbin/recoverdisk/recoverdisk.c (working copy) @@ -156,7 +156,7 @@ int error, state; u_char *buf; u_int sectorsize; - u_int stripesize; + off_t stripesize; time_t t1, t2; struct stat sb; u_int n, snapshot = 60;
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記