From: Brad Peters <bpeters@redhat.com> Date: Thu, 7 Aug 2008 16:50:39 -0400 Subject: [scsi] DLPAR remove operation fails on LSI SCSI adapter Message-id: 20080807205039.32303.98292.sendpatchset@squad5-lp1.lab.bos.redhat.com O-Subject: [PATCH RHEL5.3] DLPAR remove operation fails on LSI SCSI adapter Bugzilla: 457852 RH-Acked-by: David Howells <dhowells@redhat.com> RHBZ#: ====== https://bugzilla.redhat.com/show_bug.cgi?id=457852 Description: =========== DLPAR remove I/O Internal adapter operations fails in removing a LSI scsi adapter. This patch frees the luntbl dma area in sym_hcb_free if allocated. Since the luntbl is part of a larger dma coherent area not freeing the luntbl kept a 64k dma coherent area previous allocated through dma_alloc_coherent allocated. This prevented a DLPAR remove IO operation from completing sucessfully. RHEL Version Found: ================ RHEL 5.1 kABI Status: ============ No symbols were harmed. Brew: ===== Built on all platforms. http://brewweb.devel.redhat.com/brew/taskinfo?taskID=1423678 Upstream Status: ================ http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commitdiff;h=e41443ec3bb3dc4b12c861e91a5d36feb45f8a46 Test Status: ============ Fix confirmed through following steps: 1.) verify using lsslot that the lpar contains a LSI adapter to remove. 2.) Execute a drslot_chrp_slot remove command on slot containing a LSI scsi adapter. 3.) The remove operation will fail without patch Mike Anderson <andmike@linux.vnet.ibm.com>, 8/4/08 =============================================================== Brad Peters 1-978-392-1000 x 23183 IBM on-site partner. Proposed Patch: =============== This patch is based on 2.6.18-101.el5 diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index 9a5d8e5..6c64a33 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c @@ -5738,6 +5738,8 @@ void sym_hcb_free(struct sym_hcb *np) for (target = 0; target < SYM_CONF_MAX_TARGET ; target++) { tp = &np->target[target]; + if (tp->luntbl) + sym_mfree_dma(tp->luntbl, 256, "LUNTBL"); #if SYM_CONF_MAX_LUN > 1 kfree(tp->lunmp); #endif