<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 12 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"Trebuchet MS";
        panose-1:2 11 6 3 2 2 2 2 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hi,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Here is the patch I am currently testing to solve the OOPs  in  pg_init_done (from send_mode_select).<o:p></o:p></p><p class=MsoNormal>The patch  adds a reference count to pgpath, which  ensures that activate_path has the pgpath intact when the call to scsi_dh_activate returns; thus any call to send_mode_select from within scsi_dh_rdac will call pg_init_done with a valid pgpath. <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>This patch is over RHEL5.4.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>diff -r -U 2 a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c<o:p></o:p></p><p class=MsoNormal>--- a/drivers/md/dm-mpath.c    2011-01-23 14:26:51.483249000 +0200<o:p></o:p></p><p class=MsoNormal>+++ b/drivers/md/dm-mpath.c 2011-01-23 14:26:51.521889000 +0200<o:p></o:p></p><p class=MsoNormal>@@ -21,4 +21,5 @@<o:p></o:p></p><p class=MsoNormal>#include <linux/time.h><o:p></o:p></p><p class=MsoNormal>#include <linux/workqueue.h><o:p></o:p></p><p class=MsoNormal>+#include <linux/kref.h><o:p></o:p></p><p class=MsoNormal>#include <scsi/scsi_dh.h><o:p></o:p></p><p class=MsoNormal>#include <asm/atomic.h><o:p></o:p></p><p class=MsoNormal>@@ -34,4 +35,5 @@<o:p></o:p></p><p class=MsoNormal>                struct priority_group *pg;            /* Owning PG */<o:p></o:p></p><p class=MsoNormal>                unsigned fail_count;                       /* Cumulative failure count */<o:p></o:p></p><p class=MsoNormal>+             struct kref ref_count;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>                struct path path;<o:p></o:p></p><p class=MsoNormal>@@ -129,4 +131,6 @@<o:p></o:p></p><p class=MsoNormal>                                memset(pgpath, 0, sizeof(*pgpath));<o:p></o:p></p><p class=MsoNormal>                                pgpath->path.is_active = 1;<o:p></o:p></p><p class=MsoNormal>+                             kref_init(&pgpath->ref_count);<o:p></o:p></p><p class=MsoNormal>+                             kref_get(&pgpath->ref_count);<o:p></o:p></p><p class=MsoNormal>                                INIT_WORK(&pgpath->activate_path, activate_path, pgpath);<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>@@ -140,4 +144,11 @@<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>+static void release_pgpath(struct kref *kref)<o:p></o:p></p><p class=MsoNormal>+{<o:p></o:p></p><p class=MsoNormal>+        struct pgpath *pgpath = container_of(kref, struct pgpath, ref_count);<o:p></o:p></p><p class=MsoNormal>+             free_pgpath(pgpath);<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+}<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>static struct priority_group *alloc_priority_group(void)<o:p></o:p></p><p class=MsoNormal>{<o:p></o:p></p><p class=MsoNormal>@@ -164,5 +175,5 @@<o:p></o:p></p><p class=MsoNormal>                                                scsi_dh_detach(bdev_get_queue(pgpath->path.dev->bdev));<o:p></o:p></p><p class=MsoNormal>                                dm_put_device(ti, pgpath->path.dev);<o:p></o:p></p><p class=MsoNormal>-                              free_pgpath(pgpath);<o:p></o:p></p><p class=MsoNormal>+                             kref_put(&pgpath->ref_count, release_pgpath);<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal>@@ -449,6 +460,8 @@<o:p></o:p></p><p class=MsoNormal>                                                                if (queue_delayed_work(kmpath_handlerd,<o:p></o:p></p><p class=MsoNormal>                                                                    &tmp->activate_path, m->pg_init_delay ?<o:p></o:p></p><p class=MsoNormal>-                                                                  m->pg_init_delay_secs * HZ : 0))<o:p></o:p></p><p class=MsoNormal>+                                                                 m->pg_init_delay_secs * HZ : 0)) {<o:p></o:p></p><p class=MsoNormal>+                                                                             kref_get(&pgpath->ref_count);<o:p></o:p></p><p class=MsoNormal>                                                                                m->pg_init_in_progress++;<o:p></o:p></p><p class=MsoNormal>+                                                             }<o:p></o:p></p><p class=MsoNormal>                                                }<o:p></o:p></p><p class=MsoNormal>                                }<o:p></o:p></p><p class=MsoNormal>@@ -971,6 +984,8 @@<o:p></o:p></p><p class=MsoNormal>                                queue_work(kmultipathd, &m->process_queued_ios);<o:p></o:p></p><p class=MsoNormal>                } else if (m->hw_handler_name && (m->current_pg == pgpath->pg)) {<o:p></o:p></p><p class=MsoNormal>-                              if (queue_work(kmpath_handlerd, &pgpath->activate_path))<o:p></o:p></p><p class=MsoNormal>+                             if (queue_work(kmpath_handlerd, &pgpath->activate_path)) {<o:p></o:p></p><p class=MsoNormal>+                                             kref_get(&pgpath->ref_count);<o:p></o:p></p><p class=MsoNormal>                                                m->pg_init_in_progress++;<o:p></o:p></p><p class=MsoNormal>+                             }<o:p></o:p></p><p class=MsoNormal>                }<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>@@ -1215,4 +1230,5 @@<o:p></o:p></p><p class=MsoNormal>                scsi_dh_activate(bdev_get_queue(pgpath->path.dev->bdev),<o:p></o:p></p><p class=MsoNormal>                                                                pg_init_done, &pgpath->path);<o:p></o:p></p><p class=MsoNormal>+             kref_put(&pgpath->ref_count, release_pgpath);<o:p></o:p></p><p class=MsoNormal>}<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Trebuchet MS","sans-serif";color:#444444'>Menny Hamburger</span></b><span style='font-size:8.0pt;font-family:"Trebuchet MS","sans-serif";color:#444444'><o:p></o:p></span></p><p class=MsoNormal><span style='font-size:8.0pt;font-family:"Trebuchet MS","sans-serif";color:#444444'>Engineer<o:p></o:p></span></p><p class=MsoNormal><b><span style='font-size:8.0pt;font-family:"Trebuchet MS","sans-serif";color:#0085C3'>Dell</span></b><span style='font-size:8.0pt;font-family:"Trebuchet MS","sans-serif";color:#444444'> | IDC<b><o:p></o:p></b></span></p><p class=MsoNormal><b><span style='font-size:8.0pt;font-family:"Trebuchet MS","sans-serif";color:#444444'>office </span></b><span style='font-size:8.0pt;font-family:"Trebuchet MS","sans-serif";color:#444444'>+972 97698789<b>,  fax </b>+972 97698889<b><o:p></o:p></b></span></p><p class=MsoNormal><span style='font-size:8.0pt;font-family:"Trebuchet MS","sans-serif";color:#444444'>Dell IDC. 4 Hacharoshet St, Raanana 43657, Israel</span><span style='color:#1F497D'><o:p></o:p></span></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>