System Management
キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

FDDアクセスについて

Y_N
アドバイザー

FDDアクセスについて

お世話になります

FDハード故障を認識させるプログラミングについて、質問します。

現在、ハード故障の事象を電源断を行って検証しています。

検証している環境は

機種:B2600

OS :HP-UX Ver11i

検証している関数は

open

ioctl

read

write

close

の6関数です。

以上の関数を順に実行し、当該関数の前まで正常に動作することを確認し、FDDの電源を落として、当該関数を実行するテストを行いました。

○openの直前でFDD電源断:-1(エラー)が返却され、errnoがENXIOで返却されます。

○ioctlの直前でFDD電源断:0(正常)が返却される。

○readの直前でFDD電源断:待ち状態になり、返却されない。

○writeの直前でFDD電源断:待ち状態になり、返却されない。

○closeの直前でFDD電源断:未調査。

問題となっているのは、read、writeでエラー返却されない事です。

エラー返却されるようにするか、事前にチェックする方法がないか調査しています。

ちなみに呼出部分の抜粋を以下に記述します。

i_fcb=open(c_path,O_RDWR);

i_ret=ioctl(i_fcb,DIOC_DESCRIBE,&descr_type);

i_ret=read(i_fcb,pc_buf,(size_t)ui_length);

i_ret=write(i_fcb,pc_buf,ui_length);

i_ret=close(i_fcb);

/* ui_lengthは256 */

どなたか回答、よろしくお願いいたします。

12 件の返信
oops
貴重なコントリビューター

FDDアクセスについて

open(2) 時に何もフラグをつけなければ、read(2) や write(2) はブロックされてしまいます。エラーリターンをしてほしければ、open(2) 時にO_NONBLOCK や O_NDELAY などをつけるか、fcntl(2) で該当フラグをセットしなければいけません。read(2) や write(2)、open(2) の Online manual を見てください。ターゲットがキャラクタデバイスの場合や FIFO の場合等、場合分けして動作が詳細説明されています。
Y_N
アドバイザー

FDDアクセスについて

早速のご返事ありがとうございました。

ご指摘の方法を試して見ます。結果につきましては、別途お知らせします。
Y_N
アドバイザー

FDDアクセスについて

ご指摘の方法(open時またはfcntl時で該当フラグをセット)を試してみましたが、同様な結果(read、writeでエラー返却されない)となりました。

ちなみに、使用しているFDドライブはSCSIです。また、「ioscan」でFD装置の「Driver」は、「sdisk」となっています。このあたりが原因で上記方法はうまく返却されないのでしょうか。

oops
貴重なコントリビューター

FDDアクセスについて

FDD がないので、SCSI 接続の CDROM ドライブでやってみましたが、O_NDELAY をつけるとちゃんと EAGAIN が返ってきました。ちょっと新しいマシンでは試せるのがないので、10.20 でやってます。

root# ioscan -nfC disk

Class I H/W Path Driver S/W State H/W Type Description

============================================================================

disk 4 8/0/19/0.5.0 sdisk CLAIMED DEVICE IBM DDRS-39130WS

/dev/dsk/c0t5d0 /dev/rdsk/c0t5d0

disk 0 8/0/19/0.6.0 sdisk CLAIMED DEVICE IBM DDRS-34560WS

/dev/dsk/c0t6d0 /dev/rdsk/c0t6d0

disk 5 8/16/5.1.0 sdisk CLAIMED DEVICE TOSHIBA CD-ROM XM-5401TA

/dev/dsk/c1t1d0 /dev/rdsk/c1t1d0

root#cat dev_open.c

#include

#include

main(int argc, char *argv[])

{

int fd, ret;

extern int errno;

char buf;

if(argc != 2 ){

fprintf(stderr, "usage: %s device_path \n", argv);

fprintf(stderr, "example: %s /dev/rmt/0m \n", argv);

exit(1);

}

printf("open a device file with O_RDWR and O_NDELAY\n");

if ((fd = open(argv, O_RDWR, O_NDELAY)) < 0) {

perror("open");

fprintf(stderr, "errno = %d\n", errno);

exit(2);

} else {

printf("press return to continue.. \n");

getchar();

if ((ret = read(fd, buf, 255)) < 0) {

perror("read");

fprintf(stderr, "errno = %d\n", errno);

exit(2);

} else {

printf("reading the device file..\n");

printf("ret: %d, buf: %s\n", ret, buf);

}

}

printf("close the device file..\n");

close(fd);

}

root#./dev_open /dev/rdsk/c1t1d0

open a device file with O_RDWR and O_NDELAY

press return to continue.. << ここで CDROM の電源を切り、return key を押す。

read: Invalid argument

errno = 22<<< EAGAIN

root#ioscan -nfC disk

Class I H/W Path Driver S/W State H/W Type Description

============================================================================

disk 4 8/0/19/0.5.0 sdisk CLAIMED DEVICE IBM DDRS-39130WS

/dev/dsk/c0t5d0 /dev/rdsk/c0t5d0

disk 0 8/0/19/0.6.0 sdisk CLAIMED DEVICE IBM DDRS-34560WS

/dev/dsk/c0t6d0 /dev/rdsk/c0t6d0

disk 5 8/16/5.1.0 sdisk NO_HW DEVICE TOSHIBA CD-ROM XM-5401TA

/dev/dsk/c1t1d0 /dev/rdsk/c1t1d0

## 電源をきったので、ioscan では NO_HW になる。

例え電源を入れたままでも、メディアをいれてないので、やっぱり EAGAIN になってしまいますが…

ここでは O_NDELAY でしていますが、character device file の場合、O_NONBLOCK と同じ動きになるはずです。

man にも以下のように書いてありますし。

When attempting to read a file (other than a pipe or FIFO) that

supports non-blocking reads and has no data currently available:

+ If O_NONBLOCK is set, read() will return a -1 and set errno to

EAGAIN.

+ If O_NONBLOCK is clear, read() will block until some data

becomes available.

+ The use of the O_NONBLOCK flag has no effect if there is some

data available.

もちろん、最初から電源を切っている場合は、open(2) が ENXIO になります。
Y_N
アドバイザー

FDDアクセスについて

ご返事ありがとうございます。

oopsさんのとおりに試しているのですが、同様な結果(read、writeでエラー返却されない)です。

ちなみに、readのエラー返却までの時間はどのくらいかかったのでしょうか(非常にかかるとか?)

よろしくお願いいたします。
oops
貴重なコントリビューター

FDDアクセスについて

自己レスです。EAGAIN じゃなくて、EINVAL が帰ってきてますね… もしかしたら OS とか SCSI のパッチレベルとかで若干動きが変わるのかもしれません。ハードディスクか removable ディスクかでも違うのかも。
oops
貴重なコントリビューター

FDDアクセスについて

入れ違いになってしまいました…

read のエラーはあっという間に返ってきました。

ちなみに nishikawa さんが使われている OS って、なんですか?
Y_N
アドバイザー

FDDアクセスについて

ご回答ありがとうございます。

OSは、「HP-UX11i」になります。

パッチ等に関しては、知識不足な状態です。何かわかれば教えてください(参考になるのかわかりませんが、swlist結果を添付致します)。

===================================

# バンドル:

B5403BA B.11.11 MirrorDisk/UX

B6848BA 1.4.gm.46.2 Ximian GNOME 1.4 GTK+ Libraries for HP-UX 11.00 and 11i

B6859AAJ B.11.11.04 Japanese localized HP WTSharedX for Series 700

B6865AAJ B.11.11.04 Japanese localized HP Audio Clients for Series 700

B8111AA 1.2.2.14.02 Java 2 RTE for HP-UX (700/800), PA1.1 + PA2.0 Add On

B9098AA 1.2.2.14.02 Java 2 Plugin for HP-UX (700/800)

B9789AA 1.3.1.09.05 Java2 1.3 RTE for HP-UX

BUNDLE11i B.11.11.0306.1 Required Patch Bundle for HP-UX 11i, June 2003

Base-VXVM B.03.50.5 Base VERITAS Volume Manager Bundle 3.5 for HP-UX

CDE-Japanese B.11.11 Japanese CDE Environment

FDDI-00 B.11.11.02 PCI FDDI;Supptd HW=A3739A/A3739B;SW=J3626AA

FEATURE11-11 B.11.11.0209.5 Feature Enablement Patches for HP-UX 11i, Sept 2002

FibrChanl-00 B.11.11.09 PCI/HSC FibreChannel;Supptd HW=A6684A,A6685A,A5158A,A6795A

GOLDAPPS11i B.11.11.0306.4 Gold Applications Patches for HP-UX 11i,June 2003

GOLDBASE11i B.11.11.0306.4 Gold Base Patches for HP-UX 11i, June 2003

GigEther-00 B.11.11.14 PCI/HSC GigEther;Supptd HW=A4926A/A4929A/A4924A/A4925A;SW=J1642AA

GigEther-01 B.11.11.08 PCI/PCI-X GigEther;Supptd HW=A6794A/A6825A/A6847A/A9782A/A9784A/A7109A

HPUX11i-MTOE B.11.11.0306 HP-UX Minimal Technical OE Component

HPUXBase64 B.11.11 HP-UX 64-bit Base OS

HPUXBaseAux B.11.11.0306 HP-UX Base OS Auxiliary

HWEnable11i B.11.11.0306.4 Hardware Enablement Patches for HP-UX 11i, June 2003

IEther-00 B.11.11.03 PCI Ethernet;Supptd HW=A6974A

MOZILLA 1.2.1.00.05 Mozilla 1.2 for HP-UX

MOZILLAsrc 1.2.1.00.05 Mozilla 1.2 Source distribution

OnlineDiag B.11.11.11.08 HPUX 11.11 Support Tools Bundle, Jun 2003

RAID-00 B.11.11.01 PCI RAID; Supptd HW=A5856A

T1455AA 1.3.1.09.05 Java2 1.3 Netscape Plugin for HP-UX

hpuxwsApache A.1.0.01.02 HP-UX Apache-based Web Server

hpuxwsTomcat A.1.0.01.02 HP-UX Tomcat-based Servlet Engine

hpuxwsWebmin A.1.0.01.02 HP-UX Webmin-based Admin

hpuxwsXml A.1.0.01.02 HP-UX XML Web Server Tools

perl B.5.6.1.F Perl Programming Language

===================================
Y_N
アドバイザー

FDDアクセスについて

以前、以下のように報告いたしましたが、2分30秒待った後にエラー返却されました(待ちが足りなかったみたいです)。

>ご指摘の方法(open時またはfcntl時で該当フラグをセット)を試してみましたが、同様な結果(read、writeでエラー返却されない)となりました。

とりあえず解決いたしましたが、待ち時間を短くできないか調査してみます(何かわかれば教えてください)。

いろいろありがとうございました。
oops
貴重なコントリビューター

FDDアクセスについて

待ち時間を短くするのはハードコートされているので難しいと思います。ディスクドライバの retry 回数は、2秒おきに 45回だったと思ったのですが、2分30秒ということは 75回ですね。回数が変わったのかもしれません。ちなみに、エラーコードは EAGAIN でしたか?教えてください。
Y_N
アドバイザー

FDDアクセスについて

待ち時間を短くすることは難しいですね。

>ちなみに、エラーコードは EAGAIN でしたか?教えてください。

エラーコードは、「ENXIO」でした
oops
貴重なコントリビューター

FDDアクセスについて

早々の返信、ありがとうございました。

ENXIO なんですね。勉強になりました。