<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7652.24">
<TITLE>Enabling/disabling BIO_RW_FAILFAST at load time</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->
<P><FONT SIZE=2 FACE="Courier New">Hi Christophe and All, </FONT>
<BR><FONT SIZE=2 FACE="Courier New">During I/O on a path, the paths are marked as failed at DM Multipath, when the I/O returns with Error status as 0x20000 (host code 0x2 denotes DID_BUS_BUSY). What we understand here is, since I/O on multipath devices have BIO_RW_FAILFAST set(hence REQ_FASTFAIL ), retries are not allowed at SCSI mid layer for errors such as QUEUEFULL, UNDERRUN....(as captured in the below syslog snippet)</FONT></P>
<P><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">syslog snippet</FONT>
<BR><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">*******************</FONT>
<BR><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">May 23 16:51:49 lnx kernel: sd 2:0:3:8: SCSI error: return code = 0x20000<BR>
May 23 16:51:49 lnx kernel: end_request: I/O error, dev sdfg, sector 4188002<BR>
May 23 16:51:49 lnx kernel: end_request: I/O error, dev sdfg, sector 4188008<BR>
May 23 16:51:49 lnx kernel: device-mapper: dm-multipath: Failing path 130:32.<BR>
May 23 16:51:49 lnx kernel: sd 2:0:3:8: SCSI error: return code = 0x20000<BR>
May 23 16:51:49 lnx kernel: end_request: I/O error, dev sdfg, sector 4188302<BR>
May 23 16:51:49 lnx kernel: end_request: I/O error, dev sdfg, sector 4188303<BR>
May 23 16:52:00 lnx kernel: sd 1:0:2:12: SCSI error: return code = 0x20000</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New">As an option we can have user configurable BIO_RW_FAILFAST for enabling and disabling which allows scsi mid layer to retry for I/0 . Below is the patch for passing parameter at load time with DM multipath module for enabling/disabling BIO_RW_FAILFAST flag. </FONT></P>
<P><FONT SIZE=2 FACE="Courier New">* Flag can be set On/Off as follows</FONT>
</P>
<P> <FONT SIZE=2 FACE="Courier New">modprobe dm-multipath fastfailbit=0 //seting it off</FONT>
<BR> <FONT SIZE=2 FACE="Courier New">modprobe dm-multipath fastfailbit=0 //seting it on</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New">* By default the flag is kept on.</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New">It can also be set from modprobe.conf as :</FONT>
</P>
<P> <FONT SIZE=2 FACE="Courier New">options dm_multipath fastfailbit=0</FONT>
</P>
<BR>
<P><FONT SIZE=2 FACE="Courier New">Please comment !!</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New">***************************************</FONT>
<BR><FONT SIZE=2 FACE="Courier New">diff -Naur linux-2.6.18.x86_64-orig/drivers/md/dm-mpath.c linux-</FONT>
<BR><FONT SIZE=2 FACE="Courier New">2.6.18.x86_64/drivers/md/dm-mpath.c</FONT>
<BR><FONT SIZE=2 FACE="Courier New">--- linux-2.6.18.x86_64-orig/drivers/md/dm-mpath.c 2007-08-27 </FONT>
<BR><FONT SIZE=2 FACE="Courier New">02:18:51.000000000 +0530</FONT>
<BR><FONT SIZE=2 FACE="Courier New">+++ linux-2.6.18.x86_64/drivers/md/dm-mpath.c 2007-09-12 16:02:29.000000000 </FONT>
<BR><FONT SIZE=2 FACE="Courier New">+0530</FONT>
<BR><FONT SIZE=2 FACE="Courier New">@@ -19,6 +19,7 @@</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> #include <linux/slab.h></FONT>
<BR><FONT SIZE=2 FACE="Courier New"> #include <linux/time.h></FONT>
<BR><FONT SIZE=2 FACE="Courier New"> #include <linux/workqueue.h></FONT>
<BR><FONT SIZE=2 FACE="Courier New">+#include <linux/moduleparam.h></FONT>
<BR><FONT SIZE=2 FACE="Courier New"> #include <asm/atomic.h></FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New"> #define DM_MSG_PREFIX "multipath"</FONT>
<BR><FONT SIZE=2 FACE="Courier New">@@ -107,6 +108,7 @@</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> static void process_queued_ios(void *data);</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> static void trigger_event(void *data);</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New">+static int fastfailbit = 1; /*fastfail bit set on by default*/</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New"> /*-----------------------------------------------</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> * Allocation routines</FONT>
<BR><FONT SIZE=2 FACE="Courier New">@@ -800,7 +802,7 @@</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> dm_bio_record(&mpio->details, bio);</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New"> map_context->ptr = mpio;</FONT>
<BR><FONT SIZE=2 FACE="Courier New">- bio->bi_rw |= (1 << BIO_RW_FAILFAST);</FONT>
<BR><FONT SIZE=2 FACE="Courier New">+ bio->bi_rw |= (fastfailbit << BIO_RW_FAILFAST);</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> r = map_io(m, bio, mpio, 0);</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> if (r < 0 || r == DM_MAPIO_REQUEUE)</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> mempool_free(mpio, m->mpio_pool);</FONT>
<BR><FONT SIZE=2 FACE="Courier New">@@ -1340,6 +1342,10 @@</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> {</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> int r;</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New">+ /* validating fastfailbit */</FONT>
<BR><FONT SIZE=2 FACE="Courier New">+ if(fastfailbit)</FONT>
<BR><FONT SIZE=2 FACE="Courier New">+ fastfailbit=1;</FONT>
<BR><FONT SIZE=2 FACE="Courier New">+</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> /* allocate a slab for the dm_ios */</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> _mpio_cache = kmem_cache_create("dm_mpath", sizeof(struct mpath_io),</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> 0, 0, NULL, NULL);</FONT>
<BR><FONT SIZE=2 FACE="Courier New">@@ -1387,6 +1393,8 @@</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> module_init(dm_multipath_init);</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> module_exit(dm_multipath_exit);</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New">+module_param(fastfailbit, int, 0);</FONT>
<BR><FONT SIZE=2 FACE="Courier New">+MODULE_PARM_DESC(fastfailbit, "FASTFAIL bit flag ");</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> MODULE_DESCRIPTION(DM_NAME " multipath target");</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> MODULE_AUTHOR("Sistina Software <</FONT><A HREF="mailto:dm-devel@redhat.com"><U><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">dm-devel@redhat.com</FONT></U></A><FONT SIZE=2 FACE="Courier New">>");</FONT>
<BR><FONT SIZE=2 FACE="Courier New"> MODULE_LICENSE("GPL");</FONT>
</P>
<P><FONT SIZE=2 FACE="Courier New">******************************</FONT>
<BR><FONT FACE="Times New Roman"></FONT>
<BR><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">Thanks,</FONT>
</P>
<P><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">Vijay Kumar</FONT>
</P>
<P><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">[Kumar, Vijay (STSD)]</FONT>
<BR><FONT COLOR="#0000FF" SIZE=2 FACE="Courier New">mailto: vijay.kumar7@hp.com</FONT>
</P>
</BODY>
</HTML>