[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[dm-devel] [multipath-tools] [patch] retry tur on reset
- From: Brian Wong <bwong pillardata com>
- To: dm-devel redhat com
- Subject: [dm-devel] [multipath-tools] [patch] retry tur on reset
- Date: Wed, 31 May 2006 13:25:58 -0700
hi christophe,
this patch retries the tur sgio in the tur checker when the status
returned is a scsi reset.
cheers,
brian
diff --git a/libcheckers/tur.c b/libcheckers/tur.c
index d40a273..463dba9 100644
--- a/libcheckers/tur.c
+++ b/libcheckers/tur.c
@@ -43,7 +43,7 @@ tur (struct checker * c)
struct sg_io_hdr io_hdr;
unsigned char turCmdBlk[TUR_CMD_LEN] = { 0x00, 0, 0, 0, 0, 0 };
unsigned char sense_buffer[32];
-
+
memset(&io_hdr, 0, sizeof (struct sg_io_hdr));
io_hdr.interface_id = 'S';
io_hdr.cmd_len = sizeof (turCmdBlk);
@@ -53,10 +53,28 @@ tur (struct checker * c)
io_hdr.sbp = sense_buffer;
io_hdr.timeout = 20000;
io_hdr.pack_id = 0;
- if (ioctl(c->fd, SG_IO, &io_hdr) < 0) {
+ do_sgio:
+ if (ioctl(c->fd, SG_IO, &io_hdr) < 0) {
MSG(c, MSG_TUR_DOWN);
- return PATH_DOWN;
- }
+ return PATH_DOWN;
+ }
+ if (io_hdr.status == SCSI_CHECK_CONDITION) {
+ if (io_hdr.sbp && (io_hdr.sb_len_wr > 2)) {
+ int sense_key;
+ unsigned char * sense_buffer = io_hdr.sbp;
+
+ if (sense_buffer[0] & 0x2)
+ sense_key = sense_buffer[1] & 0xf;
+ else
+ sense_key = sense_buffer[2] & 0xf;
+
+ /* retry UA, SCSI RESET conditions */
+ if (sense_key == 0x06 && sense_buffer[12] == 0x29) {
+ goto do_sgio;
+ }
+
+ }
+ }
if (io_hdr.info & SG_INFO_OK_MASK) {
MSG(c, MSG_TUR_DOWN);
return PATH_DOWN;
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]