<!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>