All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] MVSAS: hot plug handling and IO issues
@ 2010-02-16 11:10 Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
       [not found] ` <6B62480106F2B34D8404CF2FDAA4D9EF71F646BECA@CHN-HCLT-EVS06.HCLT.CORP.H CL.IN>
                   ` (2 more replies)
  0 siblings, 3 replies; 26+ messages in thread
From: Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech @ 2010-02-16 11:10 UTC (permalink / raw)
  To: linux-scsi@vger.kernel.org, James Bottomley

[-- Attachment #1: Type: text/plain, Size: 1265 bytes --]

From: Srinivas <satyasrinivasp@hcl.in>
Date: Mon, 15 Feb 2010
Subject: [PATCH]: Fix for hot plug handling and IO issues.
	Added code for handling of hot-plugging drives and tape issues. 

Signed-off-by: Srinivas <satyasrinivasp@hcl.in>
---
Thanks
Srini


DISCLAIMER:
-----------------------------------------------------------------------------------------------------------------------

The contents of this e-mail and any attachment(s) are confidential and intended for the named recipient(s) only. 
It shall not attach any liability on the originator or HCL or its affiliates. Any views or opinions presented in 
this email are solely those of the author and may not necessarily reflect the opinions of HCL or its affiliates. 
Any form of reproduction, dissemination, copying, disclosure, modification, distribution and / or publication of 
this message without the prior written consent of the author of this e-mail is strictly prohibited. If you have 
received this email in error please delete it and notify the sender immediately. Before opening any mail and 
attachments please check them for viruses and defect.

-----------------------------------------------------------------------------------------------------------------------

[-- Attachment #2: mvsas.patch --]
[-- Type: application/octet-stream, Size: 22187 bytes --]

diff -uprN linux-2.6.32.7/drivers/scsi/mvsas_org/mv_64xx.c linux-2.6.32.7/drivers/scsi/mvsas/mv_64xx.c
--- linux-2.6.32.7/drivers/scsi/mvsas_org/mv_64xx.c	2010-02-12 00:25:26.000000000 +0530
+++ linux-2.6.32.7/drivers/scsi/mvsas/mv_64xx.c	2010-02-12 00:44:37.000000000 +0530
@@ -132,9 +132,9 @@ static void mvs_64xx_phy_reset(struct mv
 	tmp &= ~PHYEV_RDY_CH;
 	mvs_write_port_irq_stat(mvi, phy_id, tmp);
 	tmp = mvs_read_phy_ctl(mvi, phy_id);
-	if (hard)
+	if (hard == 1)
 		tmp |= PHY_RST_HARD;
-	else
+	else if (hard == 0)
 		tmp |= PHY_RST;
 	mvs_write_phy_ctl(mvi, phy_id, tmp);
 	if (hard) {
@@ -144,6 +144,27 @@ static void mvs_64xx_phy_reset(struct mv
 	}
 }
 
+void mvs_64xx_clear_srs_irq(struct mvs_info *mvi, u8 reg_set, u8 clear_all) {
+       void __iomem *regs = mvi->regs;
+       u32 tmp;
+       if (clear_all) {
+               tmp = mr32(MVS_INT_STAT_SRS_0);
+               if (tmp) {
+                       printk("check SRS 0 %08X.\n", tmp);
+                       mw32(MVS_INT_STAT_SRS_0, tmp);
+               }
+       } else {
+               tmp = mr32(MVS_INT_STAT_SRS_0);
+               if (tmp &  (1 << (reg_set % 32))) {
+                       printk("register set 0x%x was stopped.\n", reg_set);
+                       mw32(MVS_INT_STAT_SRS_0, 1 << (reg_set % 32));
+               }
+       }
+}
+
+
+
+
 static int __devinit mvs_64xx_chip_reset(struct mvs_info *mvi)
 {
 	void __iomem *regs = mvi->regs;
@@ -761,6 +782,7 @@ const struct mvs_dispatch mvs_64xx_dispa
 	mvs_write_port_irq_mask,
 	mvs_get_sas_addr,
 	mvs_64xx_command_active,
+	mvs_64xx_clear_srs_irq,
 	mvs_64xx_issue_stop,
 	mvs_start_delivery,
 	mvs_rx_update,
diff -uprN linux-2.6.32.7/drivers/scsi/mvsas_org/mv_init.c linux-2.6.32.7/drivers/scsi/mvsas/mv_init.c
--- linux-2.6.32.7/drivers/scsi/mvsas_org/mv_init.c	2010-02-12 00:25:26.000000000 +0530
+++ linux-2.6.32.7/drivers/scsi/mvsas/mv_init.c	2010-02-12 00:44:37.000000000 +0530
@@ -37,6 +37,7 @@ static const struct mvs_chip_info mvs_ch
 };
 
 #define SOC_SAS_NUM 2
+#define SG_MX 64
 
 static struct scsi_host_template mvs_sht = {
 	.module			= THIS_MODULE,
@@ -53,10 +54,10 @@ static struct scsi_host_template mvs_sht
 	.can_queue		= 1,
 	.cmd_per_lun		= 1,
 	.this_id		= -1,
-	.sg_tablesize		= SG_ALL,
+	.sg_tablesize		= SG_MX,
 	.max_sectors		= SCSI_DEFAULT_MAX_SECTORS,
 	.use_clustering		= ENABLE_CLUSTERING,
-	.eh_device_reset_handler	= sas_eh_device_reset_handler,
+	.eh_device_reset_handler= sas_eh_device_reset_handler,
 	.eh_bus_reset_handler	= sas_eh_bus_reset_handler,
 	.slave_alloc		= mvs_slave_alloc,
 	.target_destroy		= sas_target_destroy,
@@ -65,19 +66,17 @@ static struct scsi_host_template mvs_sht
 
 static struct sas_domain_function_template mvs_transport_ops = {
 	.lldd_dev_found 	= mvs_dev_found,
-	.lldd_dev_gone	= mvs_dev_gone,
-
+	.lldd_dev_gone		= mvs_dev_gone,
 	.lldd_execute_task	= mvs_queue_command,
 	.lldd_control_phy	= mvs_phy_control,
 
 	.lldd_abort_task	= mvs_abort_task,
 	.lldd_abort_task_set    = mvs_abort_task_set,
 	.lldd_clear_aca         = mvs_clear_aca,
-       .lldd_clear_task_set    = mvs_clear_task_set,
+    	.lldd_clear_task_set    = mvs_clear_task_set,
 	.lldd_I_T_nexus_reset	= mvs_I_T_nexus_reset,
 	.lldd_lu_reset 		= mvs_lu_reset,
 	.lldd_query_task	= mvs_query_task,
-
 	.lldd_port_formed	= mvs_port_formed,
 	.lldd_port_deformed     = mvs_port_deformed,
 
@@ -177,7 +176,7 @@ static void mvs_tasklet(unsigned long op
 		mvi = ((struct mvs_prv_info *)sha->lldd_ha)->mvi[i];
 		stat = MVS_CHIP_DISP->isr_status(mvi, mvi->irq);
 		if (stat)
-			MVS_CHIP_DISP->isr(mvi, mvi->irq, stat);
+			 MVS_CHIP_DISP->isr(mvi, mvi->irq, stat);
 	}
 
 }
@@ -213,7 +212,11 @@ static irqreturn_t mvs_interrupt(int irq
 
 static int __devinit mvs_alloc(struct mvs_info *mvi, struct Scsi_Host *shost)
 {
-	int i, slot_nr;
+	int i = 0, j = 0, slot_nr;
+	unsigned long buf_size;
+    void *buf;
+    dma_addr_t buf_dma;
+    struct mvs_slot_info *slot = 0;
 
 	if (mvi->flags & MVF_FLAG_SOC)
 		slot_nr = MVS_SOC_SLOTS;
@@ -232,6 +235,7 @@ static int __devinit mvs_alloc(struct mv
 		mvi->devices[i].dev_type = NO_DEVICE;
 		mvi->devices[i].device_id = i;
 		mvi->devices[i].dev_status = MVS_DEV_NORMAL;
+		init_timer(&mvi->devices[i].timer);
 	}
 
 	/*
@@ -437,6 +441,7 @@ static int __devinit mvs_prep_sas_ha_ini
 
 	sha->sas_phy = arr_phy;
 	sha->sas_port = arr_port;
+	sha->core.shost = shost;
 
 	sha->lldd_ha = kzalloc(sizeof(struct mvs_prv_info), GFP_KERNEL);
 	if (!sha->lldd_ha)
@@ -574,6 +579,10 @@ static int __devinit mvs_pci_init(struct
 		}
 		nhost++;
 	} while (nhost < chip->n_host);
+#ifdef MVS_USE_TASKLET
+       tasklet_init(&mv_tasklet, mvs_tasklet,
+               (unsigned long)SHOST_TO_SAS_HA(shost));
+#endif
 
 	mvs_post_sas_ha_init(shost, chip);
 
diff -uprN linux-2.6.32.7/drivers/scsi/mvsas_org/mv_sas.c linux-2.6.32.7/drivers/scsi/mvsas/mv_sas.c
--- linux-2.6.32.7/drivers/scsi/mvsas_org/mv_sas.c	2010-02-12 00:25:26.000000000 +0530
+++ linux-2.6.32.7/drivers/scsi/mvsas/mv_sas.c	2010-02-12 18:27:18.000000000 +0530
@@ -259,8 +259,6 @@ static inline void mvs_free_reg_set(stru
 		mv_printk("device has been free.\n");
 		return;
 	}
-	if (dev->runing_req != 0)
-		return;
 	if (dev->taskfileset == MVS_ID_NOT_MAPPED)
 		return;
 	MVS_CHIP_DISP->free_reg_set(mvi, &dev->taskfileset);
@@ -597,7 +595,7 @@ static int mvs_task_prep_ata(struct mvs_
 	struct mvs_slot_info *slot;
 	void *buf_prd;
 	u32 tag = tei->tag, hdr_tag;
-	u32 flags, del_q;
+	u32 flags, del_q, phy_mask;
 	void *buf_tmp;
 	u8 *buf_cmd, *buf_oaf;
 	dma_addr_t buf_tmp_dma;
@@ -762,8 +760,6 @@ static int mvs_task_prep_ssp(struct mvs_
 	}
 	if (is_tmf)
 		flags |= (MCH_SSP_FR_TASK << MCH_SSP_FR_TYPE_SHIFT);
-	else
-		flags |= (MCH_SSP_FR_CMD << MCH_SSP_FR_TYPE_SHIFT);
 	hdr->flags = cpu_to_le32(flags | (tei->n_elem << MCH_PRD_LEN_SHIFT));
 	hdr->tags = cpu_to_le32(tag);
 	hdr->data_len = cpu_to_le32(task->total_xfer_len);
@@ -878,14 +874,15 @@ static int mvs_task_exec(struct sas_task
 	struct mvs_slot_info *slot;
 	u32 tag = 0xdeadbeef, rc, n_elem = 0;
 	u32 n = num, pass = 0;
-	unsigned long flags = 0;
+	unsigned long flags = 0,  flags_libsas = 0;
 
 	if (!dev->port) {
 		struct task_status_struct *tsm = &t->task_status;
 
 		tsm->resp = SAS_TASK_UNDELIVERED;
 		tsm->stat = SAS_PHY_DOWN;
-		t->task_done(t);
+		if (dev->dev_type != SATA_DEV)
+			t->task_done(t);
 		return 0;
 	}
 
@@ -910,12 +907,23 @@ static int mvs_task_exec(struct sas_task
 		else
 			tei.port = &mvi->port[dev->port->id];
 
-		if (!tei.port->port_attached) {
+		if (tei.port && !tei.port->port_attached) {
 			if (sas_protocol_ata(t->task_proto)) {
 				mv_dprintk("port %d does not"
 					"attached device.\n", dev->port->id);
-				rc = SAS_PHY_DOWN;
-				goto out_done;
+			 	struct task_status_struct *ts = &t->task_status;
+                ts->stat = SAS_PROTO_RESPONSE;
+                ts->stat = SAS_PHY_DOWN;
+	            spin_unlock_irqrestore(dev->sata_dev.ap->lock,
+                                          flags_libsas);
+                spin_unlock_irqrestore(&mvi->lock, flags);
+                t->task_done(t);
+                spin_lock_irqsave(&mvi->lock, flags);
+                spin_lock_irqsave(dev->sata_dev.ap->lock,
+                                  flags_libsas);
+                if (n > 1)
+                	t = list_entry(t->list.next,struct sas_task, list);
+                    continue;
 			} else {
 				struct task_status_struct *ts = &t->task_status;
 				ts->resp = SAS_TASK_UNDELIVERED;
@@ -972,8 +980,7 @@ static int mvs_task_exec(struct sas_task
 			rc = mvs_task_prep_ata(mvi, &tei);
 			break;
 		default:
-			dev_printk(KERN_ERR, mvi->dev,
-				"unknown sas_task proto: 0x%x\n",
+			dev_printk(KERN_ERR, mvi->dev, "unknown sas_task proto: 0x%x\n",
 				t->task_proto);
 			rc = -EINVAL;
 			break;
@@ -993,11 +1000,16 @@ static int mvs_task_exec(struct sas_task
 		spin_unlock(&t->task_state_lock);
 
 		mvs_hba_memory_dump(mvi, tag, t->task_proto);
-		mvi_dev->runing_req++;
+		mvi_dev->running_req++;
 		++pass;
 		mvi->tx_prod = (mvi->tx_prod + 1) & (MVS_CHIP_SLOT_SZ - 1);
 		if (n > 1)
 			t = list_entry(t->list.next, struct sas_task, list);
+		if (likely(pass)) {
+       		        MVS_CHIP_DISP->start_delivery(mvi,(mvi->tx_prod - 1) & (MVS_CHIP_SLOT_SZ - 1));
+               }
+	
+
 	} while (--n);
 	rc = 0;
 	goto out_done;
@@ -1012,10 +1024,6 @@ err_out:
 			dma_unmap_sg(mvi->dev, t->scatter, n_elem,
 				     t->data_dir);
 out_done:
-	if (likely(pass)) {
-		MVS_CHIP_DISP->start_delivery(mvi,
-			(mvi->tx_prod - 1) & (MVS_CHIP_SLOT_SZ - 1));
-	}
 	spin_unlock_irqrestore(&mvi->lock, flags);
 	return rc;
 }
@@ -1187,7 +1195,7 @@ void mvs_update_phyinfo(struct mvs_info
 				MVS_CHIP_DISP->phy_reset(mvi, i, 0);
 				goto out_done;
 			}
-		}		else if (phy->phy_type & PORT_TYPE_SAS
+		}	else if (phy->phy_type & PORT_TYPE_SAS
 			|| phy->att_dev_info & PORT_SSP_INIT_MASK) {
 			phy->phy_attached = 1;
 			phy->identify.device_type =
@@ -1256,7 +1264,20 @@ static void mvs_port_notify_formed(struc
 
 static void mvs_port_notify_deformed(struct asd_sas_phy *sas_phy, int lock)
 {
-	/*Nothing*/
+       struct domain_device *dev;
+       struct mvs_phy *phy = sas_phy->lldd_phy;
+       struct mvs_info *mvi = phy->mvi;
+       struct asd_sas_port *port = sas_phy->port;
+       int phy_no = 0;
+
+       while (phy != &mvi->phy[phy_no]) {
+               phy_no++;
+               if (phy_no >= MVS_MAX_PHYS)
+                       return;
+       }
+       list_for_each_entry(dev, &port->dev_list, dev_list_node)
+               mvs_do_release_task(phy->mvi, phy_no, NULL);
+
 }
 
 
@@ -1316,6 +1337,7 @@ int mvs_dev_found_notify(struct domain_d
 		goto found_out;
 	}
 	dev->lldd_dev = mvi_device;
+	mvi_device->dev_status = MVS_DEV_NORMAL;
 	mvi_device->dev_type = dev->dev_type;
 	mvi_device->mvi_info = mvi;
 	if (parent_dev && DEV_IS_EXPANDER(parent_dev->dev_type)) {
@@ -1351,18 +1373,18 @@ int mvs_dev_found(struct domain_device *
 	return mvs_dev_found_notify(dev, 1);
 }
 
-void mvs_dev_gone_notify(struct domain_device *dev, int lock)
+void mvs_dev_gone_notify(struct domain_device *dev)
 {
 	unsigned long flags = 0;
 	struct mvs_device *mvi_dev = dev->lldd_dev;
 	struct mvs_info *mvi = mvi_dev->mvi_info;
 
-	if (lock)
-		spin_lock_irqsave(&mvi->lock, flags);
+	spin_lock_irqsave(&mvi->lock, flags);
 
 	if (mvi_dev) {
 		mv_dprintk("found dev[%d:%x] is gone.\n",
 			mvi_dev->device_id, mvi_dev->dev_type);
+		mvs_release_task(mvi, dev);
 		mvs_free_reg_set(mvi, mvi_dev);
 		mvs_free_dev(mvi_dev);
 	} else {
@@ -1370,14 +1392,13 @@ void mvs_dev_gone_notify(struct domain_d
 	}
 	dev->lldd_dev = NULL;
 
-	if (lock)
 		spin_unlock_irqrestore(&mvi->lock, flags);
 }
 
 
 void mvs_dev_gone(struct domain_device *dev)
 {
-	mvs_dev_gone_notify(dev, 1);
+	mvs_dev_gone_notify(dev);
 }
 
 static  struct sas_task *mvs_alloc_task(void)
@@ -1540,7 +1561,7 @@ int mvs_lu_reset(struct domain_device *d
 		num = mvs_find_dev_phyno(dev, phyno);
 		spin_lock_irqsave(&mvi->lock, flags);
 		for (i = 0; i < num; i++)
-			mvs_release_task(mvi, phyno[i], dev);
+			mvs_release_task(mvi, dev);
 		spin_unlock_irqrestore(&mvi->lock, flags);
 	}
 	/* If failed, fall-through I_T_Nexus reset */
@@ -1552,8 +1573,8 @@ int mvs_lu_reset(struct domain_device *d
 int mvs_I_T_nexus_reset(struct domain_device *dev)
 {
 	unsigned long flags;
-	int i, phyno[WIDE_PORT_MAX_PHY], num , rc = TMF_RESP_FUNC_FAILED;
-	struct mvs_device * mvi_dev = (struct mvs_device *)dev->lldd_dev;
+	int rc = TMF_RESP_FUNC_FAILED;
+    struct mvs_device * mvi_dev = (struct mvs_device *)dev->lldd_dev;
 	struct mvs_info *mvi = mvi_dev->mvi_info;
 
 	if (mvi_dev->dev_status != MVS_DEV_EH)
@@ -1563,10 +1584,8 @@ int mvs_I_T_nexus_reset(struct domain_de
 		__func__, mvi_dev->device_id, rc);
 
 	/* housekeeper */
-	num = mvs_find_dev_phyno(dev, phyno);
 	spin_lock_irqsave(&mvi->lock, flags);
-	for (i = 0; i < num; i++)
-		mvs_release_task(mvi, phyno[i], dev);
+	mvs_release_task(mvi, dev);
 	spin_unlock_irqrestore(&mvi->lock, flags);
 
 	return rc;
@@ -1603,6 +1622,9 @@ int mvs_query_task(struct sas_task *task
 		case TMF_RESP_FUNC_FAILED:
 		case TMF_RESP_FUNC_COMPLETE:
 			break;
+		default:
+			rc = TMF_RESP_FUNC_COMPLETE; 
+			break;
 		}
 	}
 	mv_printk("%s:rc= %d\n", __func__, rc);
@@ -1621,8 +1643,11 @@ int mvs_abort_task(struct sas_task *task
 	unsigned long flags;
 	u32 tag;
 
-	if (mvi->exp_req)
-		mvi->exp_req--;
+	if (!mvi_dev) {
+		mv_printk("%s:%d TMF_RESP_FUNC_FAILED\n", __func__, __LINE__);
+		rc = TMF_RESP_FUNC_FAILED;
+	}
+	
 	spin_lock_irqsave(&task->task_state_lock, flags);
 	if (task->task_state_flags & SAS_TASK_STATE_DONE) {
 		spin_unlock_irqrestore(&task->task_state_lock, flags);
@@ -1630,6 +1655,7 @@ int mvs_abort_task(struct sas_task *task
 		goto out;
 	}
 	spin_unlock_irqrestore(&task->task_state_lock, flags);
+	mvi_dev->dev_status = MVS_DEV_EH;
 	if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) {
 		struct scsi_cmnd * cmnd = (struct scsi_cmnd *)task->uldd_task;
 
@@ -1654,12 +1680,32 @@ int mvs_abort_task(struct sas_task *task
 			if (task->lldd_task) {
 				slot = task->lldd_task;
 				slot_no = (u32) (slot - mvi->slot_info);
+				spin_lock_irqsave(&mvi->lock, flags);
 				mvs_slot_complete(mvi, slot_no, 1);
+				spin_unlock_irqrestore(&mvi->lock, flags);
 			}
 		}
+	
 	} else if (task->task_proto & SAS_PROTOCOL_SATA ||
 		task->task_proto & SAS_PROTOCOL_STP) {
 		/* to do free register_set */
+		if (SATA_DEV == dev->dev_type) {
+        	struct mvs_slot_info *slot = task->lldd_task;
+			struct task_status_struct *tstat;
+	        tstat = &task->task_status;
+            u32    slot_idx =    (u32)(slot - mvi->slot_info);
+			mv_dprintk(KERN_DEBUG "mv_abort_task() mvi=%p task=%p \
+                               slot=%p slot_idx=x%x\n",
+                               mvi, task, slot, slot_idx);
+			tstat->stat = SAS_ABORTED_TASK;
+			if (mvi_dev)
+			if (mvi_dev && mvi_dev->running_req)
+				mvi_dev->running_req--;
+			if (sas_protocol_ata(task->task_proto))
+				mvs_free_reg_set(mvi, mvi_dev);
+			mvs_slot_task_free(mvi, task, slot, slot_idx);
+			return -1;
+		}
 	} else {
 		/* SMP */
 
@@ -1717,8 +1763,13 @@ static int mvs_sata_done(struct mvs_info
 	       SATA_RECEIVED_D2H_FIS(mvi_dev->taskfileset),
 	       sizeof(struct dev_to_host_fis));
 	tstat->buf_valid_size = sizeof(*resp);
-	if (unlikely(err))
-		stat = SAS_PROTO_RESPONSE;
+	if (unlikely(err)) {
+	      if (unlikely(err & CMD_ISS_STPD))
+                       stat = SAS_OPEN_REJECT;
+               else
+                       stat = SAS_PROTO_RESPONSE;
+       }
+
 	return stat;
 }
 
@@ -1728,6 +1779,7 @@ static int mvs_slot_err(struct mvs_info
 	struct mvs_slot_info *slot = &mvi->slot_info[slot_idx];
 	int stat;
 	u32 err_dw0 = le32_to_cpu(*(u32 *) (slot->response));
+	u32 err_dw1 = le32_to_cpu(*((u32 *)slot->response+1));
 	u32 tfs = 0;
 	enum mvs_port_type type = PORT_TYPE_SAS;
 
@@ -1753,9 +1805,7 @@ static int mvs_slot_err(struct mvs_info
 			mv_printk("find reserved error, why?\n");
 
 		task->ata_task.use_ncq = 0;
-		stat = SAS_PROTO_RESPONSE;
-		mvs_sata_done(mvi, task, slot_idx, 1);
-
+		mvs_sata_done(mvi, task, slot_idx, err_dw0);
 	}
 		break;
 	default:
@@ -1772,18 +1822,20 @@ int mvs_slot_complete(struct mvs_info *m
 	struct sas_task *task = slot->task;
 	struct mvs_device *mvi_dev = NULL;
 	struct task_status_struct *tstat;
+	struct domain_device *dev;	
+	u32 aborted;
 
-	bool aborted;
 	void *to;
 	enum exec_status sts;
 
 	if (mvi->exp_req)
-		mvi->exp_req--;
-	if (unlikely(!task || !task->lldd_task))
+		mvi->exp_req--; 
+	if (unlikely(!task || !task->lldd_task || !task->dev))
 		return -1;
 
 	tstat = &task->task_status;
-	mvi_dev = task->dev->lldd_dev;
+	dev = task->dev;
+	mvi_dev = dev->lldd_dev;
 
 	mvs_hba_cq_dump(mvi);
 
@@ -1801,7 +1853,8 @@ int mvs_slot_complete(struct mvs_info *m
 	if (unlikely(aborted)) {
 		tstat->stat = SAS_ABORTED_TASK;
 		if (mvi_dev)
-			mvi_dev->runing_req--;
+		if (mvi_dev && mvi_dev->running_req)
+			mvi_dev->running_req--;
 		if (sas_protocol_ata(task->task_proto))
 			mvs_free_reg_set(mvi, mvi_dev);
 
@@ -1809,24 +1862,17 @@ int mvs_slot_complete(struct mvs_info *m
 		return -1;
 	}
 
-	if (unlikely(!mvi_dev || !slot->port->port_attached || flags)) {
-		mv_dprintk("port has not device.\n");
+	if (unlikely(!mvi_dev || flags)) {
+		if (!mvi_dev)
+		    mv_dprintk("port has not device.\n");
 		tstat->stat = SAS_PHY_DOWN;
 		goto out;
 	}
 
-	/*
-	if (unlikely((rx_desc & RXQ_ERR) || (*(u64 *) slot->response))) {
-		 mv_dprintk("Find device[%016llx] RXQ_ERR %X,
-		 err info:%016llx\n",
-		 SAS_ADDR(task->dev->sas_addr),
-		 rx_desc, (u64)(*(u64 *) slot->response));
-	}
-	*/
-
 	/* error info record present */
 	if (unlikely((rx_desc & RXQ_ERR) && (*(u64 *) slot->response))) {
 		tstat->stat = mvs_slot_err(mvi, task, slot_idx);
+		tstat->resp = SAS_TASK_COMPLETE;
 		goto out;
 	}
 
@@ -1868,11 +1914,16 @@ int mvs_slot_complete(struct mvs_info *m
 		tstat->stat = SAM_CHECK_COND;
 		break;
 	}
+	if (!slot->port->port_attached) {
+	       	mv_dprintk("port %d has removed.\n", slot->port->sas_port.id);
+        	tstat->stat = SAS_PHY_DOWN;
+       }
+
 
 out:
-	if (mvi_dev) {
-		mvi_dev->runing_req--;
-		if (sas_protocol_ata(task->task_proto))
+	if (mvi_dev && mvi_dev->running_req) {
+		mvi_dev->running_req--;
+		if (sas_protocol_ata(task->task_proto) && !mvi_dev->running_req)
 			mvs_free_reg_set(mvi, mvi_dev);
 	}
 	mvs_slot_task_free(mvi, task, slot, slot_idx);
@@ -1888,10 +1939,10 @@ out:
 	return sts;
 }
 
-void mvs_release_task(struct mvs_info *mvi,
+void mvs_do_release_task(struct mvs_info *mvi,
 		int phy_no, struct domain_device *dev)
 {
-	int i = 0; u32 slot_idx;
+	u32 slot_idx;
 	struct mvs_phy *phy;
 	struct mvs_port *port;
 	struct mvs_slot_info *slot, *slot2;
@@ -1900,6 +1951,10 @@ void mvs_release_task(struct mvs_info *m
 	port = phy->port;
 	if (!port)
 		return;
+	/* clean cmpl queue in case request is already finished */
+ 	      mvs_int_rx(mvi, false);
+
+
 
 	list_for_each_entry_safe(slot, slot2, &port->list, entry) {
 		struct sas_task *task;
@@ -1911,18 +1966,22 @@ void mvs_release_task(struct mvs_info *m
 
 		mv_printk("Release slot [%x] tag[%x], task [%p]:\n",
 			slot_idx, slot->slot_tag, task);
-
-		if (task->task_proto & SAS_PROTOCOL_SSP) {
-			mv_printk("attached with SSP task CDB[");
-			for (i = 0; i < 16; i++)
-				mv_printk(" %02x", task->ssp_task.cdb[i]);
-			mv_printk(" ]\n");
-		}
+		MVS_CHIP_DISP->command_active(mvi, slot_idx);
 
 		mvs_slot_complete(mvi, slot_idx, 1);
 	}
 }
 
+void mvs_release_task(struct mvs_info *mvi,
+                       struct domain_device *dev)
+{
+       int i, phyno[WIDE_PORT_MAX_PHY], num;
+       /* housekeeper */
+       num = mvs_find_dev_phyno(dev, phyno);
+       for (i = 0; i < num; i++)
+               mvs_do_release_task(mvi, phyno[i], dev);
+}
+
 static void mvs_phy_disconnected(struct mvs_phy *phy)
 {
 	phy->phy_attached = 0;
@@ -2029,16 +2088,18 @@ void mvs_int_port(struct mvs_info *mvi,
 	* we need check the interrupt status which belongs to per port.
 	*/
 
-	if (phy->irq_status & PHYEV_DCDR_ERR)
+	if (phy->irq_status & PHYEV_DCDR_ERR) {
 		mv_dprintk("port %d STP decoding error.\n",
-		phy_no+mvi->id*mvi->chip->n_phy);
+		phy_no + mvi->id*mvi->chip->n_phy);
+	}
 
 	if (phy->irq_status & PHYEV_POOF) {
 		if (!(phy->phy_event & PHY_PLUG_OUT)) {
 			int dev_sata = phy->phy_type & PORT_TYPE_SATA;
 			int ready;
-			mvs_release_task(mvi, phy_no, NULL);
+			mvs_do_release_task(mvi, phy_no, NULL);
 			phy->phy_event |= PHY_PLUG_OUT;
+			MVS_CHIP_DISP->clear_srs_irq(mvi, 0, 1);
 			mvs_handle_event(mvi,
 				(void *)(unsigned long)phy_no,
 				PHY_PLUG_EVENT);
@@ -2085,6 +2146,11 @@ void mvs_int_port(struct mvs_info *mvi,
 							phy_no, tmp);
 			}
 			mvs_update_phyinfo(mvi, phy_no, 0);
+			 if (phy->phy_type & PORT_TYPE_SAS) {
+                               MVS_CHIP_DISP->phy_reset(mvi, phy_no, 2);
+                               mdelay(100);
+                       }
+
 			mvs_bytes_dmaed(mvi, phy_no);
 			/* whether driver is going to handle hot plug */
 			if (phy->phy_event & PHY_PLUG_OUT) {
diff -uprN linux-2.6.32.7/drivers/scsi/mvsas_org/mv_sas.h linux-2.6.32.7/drivers/scsi/mvsas/mv_sas.h
--- linux-2.6.32.7/drivers/scsi/mvsas_org/mv_sas.h	2010-02-12 00:25:26.000000000 +0530
+++ linux-2.6.32.7/drivers/scsi/mvsas/mv_sas.h	2010-02-12 00:44:37.000000000 +0530
@@ -38,6 +38,7 @@
 #include <linux/irq.h>
 #include <linux/vmalloc.h>
 #include <scsi/libsas.h>
+#include <scsi/scsi.h>
 #include <scsi/scsi_tcq.h>
 #include <scsi/sas_ata.h>
 #include <linux/version.h>
@@ -48,7 +49,7 @@
 #define _MV_DUMP		0
 #define MVS_ID_NOT_MAPPED	0x7f
 /* #define DISABLE_HOTPLUG_DMA_FIX */
-#define MAX_EXP_RUNNING_REQ	2
+// #define MAX_EXP_RUNNING_REQ	2
 #define WIDE_PORT_MAX_PHY		4
 #define	MV_DISABLE_NCQ	0
 #define mv_printk(fmt, arg ...)	\
@@ -128,6 +129,7 @@ struct mvs_dispatch {
 
 	void (*get_sas_addr)(void *buf, u32 buflen);
 	void (*command_active)(struct mvs_info *mvi, u32 slot_idx);
+	void (*clear_srs_irq)(struct mvs_info *mvi, u8 reg_set, u8 clear_all);
 	void (*issue_stop)(struct mvs_info *mvi, enum mvs_port_type type,
 				u32 tfs);
 	void (*start_delivery)(struct mvs_info *mvi, u32 tx);
@@ -235,9 +237,10 @@ struct mvs_device {
 	enum sas_dev_type dev_type;
 	struct mvs_info *mvi_info;
 	struct domain_device *sas_device;
+	struct timer_list timer;
 	u32 attached_phy;
 	u32 device_id;
-	u32 runing_req;
+	u32 running_req;
 	u8 taskfileset;
 	u8 dev_status;
 	u16 reserved;
@@ -396,7 +399,9 @@ int mvs_lu_reset(struct domain_device *d
 int mvs_slot_complete(struct mvs_info *mvi, u32 rx_desc, u32 flags);
 int mvs_I_T_nexus_reset(struct domain_device *dev);
 int mvs_query_task(struct sas_task *task);
-void mvs_release_task(struct mvs_info *mvi, int phy_no,
+void mvs_release_task(struct mvs_info *mvi,
+			struct domain_device *dev);
+void mvs_do_release_task(struct mvs_info *mvi, int phy_no,
 			struct domain_device *dev);
 void mvs_int_port(struct mvs_info *mvi, int phy_no, u32 events);
 void mvs_update_phyinfo(struct mvs_info *mvi, int i, int get_st);

^ permalink raw reply	[flat|nested] 26+ messages in thread
* Re: [PATCH] MVSAS: hot plug handling and IO issues
@ 2010-02-23 11:41 Caspar Smit
  2010-02-23 12:26 ` Konstantinos Skarlatos
  2010-02-24  4:46 ` Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
  0 siblings, 2 replies; 26+ messages in thread
From: Caspar Smit @ 2010-02-23 11:41 UTC (permalink / raw)
  To: linux-scsi@vger.kernel.org

[-- Attachment #1: Type: text/plain, Size: 1978 bytes --]

Another note:

--
4) One thing that occured was the following: during a raid1 initialization
of 2 SAS disks and a raid5 init of 8x SSD's i got a call trace by
libata-core.c (see attachment for details). The system continued to work
fine after the trace.
--

I noticed later that after the above happened, one of my SAS disks was
TERRIBLY slow (5MB/s raid1 sync in stead of 120MB/s) after a reboot all
was fine so it wasn't a defective disk.

Then something else I posted somewhat earlier.
The disks are detected during boot in reverse order (port 1 -> /dev/sde,
port 2 -> /dev/sdd, port 3 -> /dev/sdc, port 4, /dev/sdb) is it possible
with a simple patch to fix this?

Thanks for all your great work!

Kind regards,
Caspar Smit

> On Wed, Feb 17, 2010 at 12:53 PM, Srinivas Naga Venkatasatya
> Pasagadugula - ERS, HCL Tech <satyasrinivasp@hcl.in> wrote:
>> Hi Smit,
>>
>> This patch is not exactly replaced with Nov-09 patches.
>> My patch addresses the RAID5/6 issues also. Below issues are addressed
by my patch.
>> 1. Tape issues.
>> 2. RAID-5/6 I/O fails.
>> 3. LVM IO fails and subsequent init 6 hang (connect SAS+SATA in
cascaded        expanders, crate volume group and logical volumes, run
file I/O         (alltest), unplug one drive)
>> 4. Disk stress I/O on 4096 sector size.
>> 5. Hot insertion of drives giving panic.
>> 6. 'fdisk -l' hangs with hot plugging of SATA/SAS drives in expander
while      IO (Diskstress and alltest) is going on and IO stopped.
>>
>> I can't combined my patch with November-09 patches. James also rejected
those patches as those are not proper. Let me know if you have issues
with my patch.
>>
>> --Srini.
>
>
> I haven't tested yet, but looks like you're doing excellent work, and
your documentation/overview of the work is superb.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: mvsas-patch.log --]
[-- Type: text/x-log; name="mvsas-patch.log", Size: 9631 bytes --]

[ 1100.142515] xfs_db[3741]: segfault at 40 ip 00007f77b49b14aa sp 00007fff97e87ec0 error 4 in libpthread-2.7.so[7f77b49a9000+16000]
[ 1105.078922] xfs_db[3762]: segfault at 40 ip 00007f358fc264aa sp 00007fff802ba850 error 4 in libpthread-2.7.so[7f358fc1e000+16000]
[ 1108.135893] xfs_db[3777]: segfault at 40 ip 00007f10890a04aa sp 00007fff2f96c140 error 4 in libpthread-2.7.so[7f1089098000+16000]
[ 1131.700988] md: md1 stopped.
[ 1131.701083] md: unbind<sdg>
[ 1131.717573] md: export_rdev(sdg)
[ 1131.717665] md: unbind<sdh>
[ 1131.737511] md: export_rdev(sdh)
[ 1131.737617] md: unbind<sdi>
[ 1131.769010] md: export_rdev(sdi)
[ 1131.769115] md: unbind<sdj>
[ 1131.801010] md: export_rdev(sdj)
[ 1131.801110] md: unbind<sdk>
[ 1131.833010] md: export_rdev(sdk)
[ 1131.833111] md: unbind<sdd>
[ 1131.865009] md: export_rdev(sdd)
[ 1131.865108] md: unbind<sde>
[ 1131.897010] md: export_rdev(sde)
[ 1131.897115] md: unbind<sdf>
[ 1131.929009] md: export_rdev(sdf)
[ 1140.771637] md: md0 stopped.
[ 1140.771723] md: unbind<sdm>
[ 1140.785584] md: export_rdev(sdm)
[ 1140.785672] md: unbind<sdl>
[ 1140.809512] md: export_rdev(sdl)
[ 1160.695681] md: bind<sdb>
[ 1160.729238] md: bind<sdc>
[ 1160.771823] raid1: md0 is not clean -- starting background reconstruction
[ 1160.771899] raid1: raid set md0 active with 2 out of 2 mirrors
[ 1160.771991] md0: detected capacity change from 0 to 299999887360
[ 1160.772138]  md0: unknown partition table
[ 1160.777851] md: md0 switched to read-write mode.
[ 1160.778032] md: resync of RAID array md0
[ 1160.778103] md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
[ 1160.778176] md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for resync.
[ 1160.778277] md: using 128k window, over a total of 292968640 blocks.
[ 1188.740257] md: bind<sdd>
[ 1188.742869] md: bind<sde>
[ 1188.746254] md: bind<sdf>
[ 1188.748809] md: bind<sdg>
[ 1188.752187] md: bind<sdh>
[ 1188.754698] md: bind<sdi>
[ 1188.758394] md: bind<sdj>
[ 1188.762040] md: bind<sdk>
[ 1188.805114] async_tx: api initialized (async)
[ 1188.806118] xor: automatically using best checksumming function: generic_sse
[ 1188.825503]    generic_sse:  7623.000 MB/sec
[ 1188.825574] xor: using function: generic_sse (7623.000 MB/sec)
[ 1188.893508] raid6: int64x1   1658 MB/s
[ 1188.961522] raid6: int64x2   2219 MB/s
[ 1189.029509] raid6: int64x4   1809 MB/s
[ 1189.097524] raid6: int64x8   1476 MB/s
[ 1189.165520] raid6: sse2x1    3208 MB/s
[ 1189.233504] raid6: sse2x2    5342 MB/s
[ 1189.301514] raid6: sse2x4    6115 MB/s
[ 1189.301583] raid6: using algorithm sse2x4 (6115 MB/s)
[ 1189.307208] md: raid6 personality registered for level 6
[ 1189.307281] md: raid5 personality registered for level 5
[ 1189.307351] md: raid4 personality registered for level 4
[ 1189.307517] raid5: md1 is not clean -- starting background reconstruction
[ 1189.307606] raid5: device sdk operational as raid disk 7
[ 1189.307677] raid5: device sdj operational as raid disk 6
[ 1189.307748] raid5: device sdi operational as raid disk 5
[ 1189.307824] raid5: device sdh operational as raid disk 4
[ 1189.307904] raid5: device sdg operational as raid disk 3
[ 1189.307975] raid5: device sdf operational as raid disk 2
[ 1189.308053] raid5: device sde operational as raid disk 1
[ 1189.308124] raid5: device sdd operational as raid disk 0
[ 1189.309007] raid5: allocated 8490kB for md1
[ 1189.309106] 7: w=1 pa=0 pr=8 m=1 a=2 r=8 op1=0 op2=0
[ 1189.309178] 6: w=2 pa=0 pr=8 m=1 a=2 r=8 op1=0 op2=0
[ 1189.309249] 5: w=3 pa=0 pr=8 m=1 a=2 r=8 op1=0 op2=0
[ 1189.309320] 4: w=4 pa=0 pr=8 m=1 a=2 r=8 op1=0 op2=0
[ 1189.309402] 3: w=5 pa=0 pr=8 m=1 a=2 r=8 op1=0 op2=0
[ 1189.309488] 2: w=6 pa=0 pr=8 m=1 a=2 r=8 op1=0 op2=0
[ 1189.309560] 1: w=7 pa=0 pr=8 m=1 a=2 r=8 op1=0 op2=0
[ 1189.309631] 0: w=8 pa=0 pr=8 m=1 a=2 r=8 op1=0 op2=0
[ 1189.309704] raid5: raid level 5 set md1 active with 8 out of 8 devices, algorithm 2
[ 1189.309793] RAID5 conf printout:
[ 1189.309871]  --- rd:8 wd:8
[ 1189.309952]  disk 0, o:1, dev:sdd
[ 1189.310020]  disk 1, o:1, dev:sde
[ 1189.310088]  disk 2, o:1, dev:sdf
[ 1189.310155]  disk 3, o:1, dev:sdg
[ 1189.310223]  disk 4, o:1, dev:sdh
[ 1189.310290]  disk 5, o:1, dev:sdi
[ 1189.310374]  disk 6, o:1, dev:sdj
[ 1189.310452]  disk 7, o:1, dev:sdk
[ 1189.310554] md1: detected capacity change from 0 to 1120292569088
[ 1189.310798]  md1: unknown partition table
[ 1189.316651] md: md1 switched to read-write mode.
[ 1189.316769] md: resync of RAID array md1
[ 1189.316841] md: minimum _guaranteed_  speed: 1000 KB/sec/disk.
[ 1189.316913] md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for resync.
[ 1189.317016] md: using 128k window, over a total of 156290816 blocks.
[ 1284.699817] xfs_db[7994]: segfault at 40 ip 00007f70c0b364aa sp 00007fff884bea30 error 4 in libpthread-2.7.so[7f70c0b2e000+16000]
[ 1296.888175] md: bind<sdl>
[ 1297.219915] md: bind<sdm>
[ 1297.276953] md: raid0 personality registered for level 0
[ 1297.277236] raid0: looking at sdm
[ 1297.277325] raid0:   comparing sdm(976772864)
[ 1297.277431]  with sdm(976772864)
[ 1297.277586] raid0:   END
[ 1297.277667] raid0:   ==> UNIQUE
[ 1297.277773] raid0: 1 zones
[ 1297.284951] raid0: looking at sdl
[ 1297.285020] raid0:   comparing sdl(976772864)
[ 1297.285075]  with sdm(976772864)
[ 1297.285232] raid0:   EQUAL
[ 1297.285300] raid0: FINAL 1 zones
[ 1297.285374] raid0: done.
[ 1297.285443] raid0 : md_size is 1953545728 sectors.
[ 1297.285513] ******* md2 configuration *********
[ 1297.285613] zone0=[sdl/sdm/]
[ 1297.285823]         zone offset=0kb device offset=0kb size=976772864kb
[ 1297.285897] **********************************
[ 1297.285898] 
[ 1297.286080] md2: detected capacity change from 0 to 1000215412736
[ 1297.288874]  md2: unknown partition table
[ 1342.746487] xfs_db[9907]: segfault at 40 ip 00007f164988d4aa sp 00007fffcea0bc30 error 4 in libpthread-2.7.so[7f1649885000+16000]
[ 1834.791615] ------------[ cut here ]------------
[ 1834.791722] WARNING: at /tmp/buildd/linux-2.6-2.6.32/debian/build/source_amd64_none/drivers/ata/libata-core.c:5186 ata_qc_issue+0x10a/0x347 [libata]()
[ 1834.791823] Hardware name: X7DWU
[ 1834.791890] Modules linked in: raid0 raid456 async_raid6_recov async_pq raid6_pq async_xor xor async_memcpy async_tx iscsi_trgt crc32c nfsd lockd nfs_acl auth_rpcgss sunrpc exportfs coretemp w83627hf w83793 hwmon_vid loop netconsole configfs i2c_i801 evdev rng_core i2c_core ioatdma uhci_hcd ehci_hcd container usbcore nls_base i5k_amb snd_pcsp snd_pcm snd_timer snd soundcore snd_page_alloc i5400_edac edac_core button processor shpchp pci_hotplug dm_mirror dm_region_hash dm_log dm_snapshot dm_mod raid10 raid1 md_mod thermal fan thermal_sys mvsas libsas scsi_transport_sas sata_mv e1000e igb dca ext3 jbd mbcache sd_mod crc_t10dif ata_piix libata scsi_mod
[ 1834.795527] Pid: 3070, comm: smartd Not tainted 2.6.32-bpo.2-amd64 #1
[ 1834.795527] Call Trace:
[ 1834.795527]  [<ffffffffa0034129>] ? ata_qc_issue+0x10a/0x347 [libata]
[ 1834.795527]  [<ffffffffa0034129>] ? ata_qc_issue+0x10a/0x347 [libata]
[ 1834.795527]  [<ffffffff8104dbe4>] ? warn_slowpath_common+0x77/0xa3
[ 1834.795527]  [<ffffffffa0038471>] ? ata_scsi_pass_thru+0x0/0x238 [libata]
[ 1834.795527]  [<ffffffffa0034129>] ? ata_qc_issue+0x10a/0x347 [libata]
[ 1834.795527]  [<ffffffffa0038471>] ? ata_scsi_pass_thru+0x0/0x238 [libata]
[ 1834.795527]  [<ffffffffa00008a5>] ? scsi_done+0x0/0xc [scsi_mod]
[ 1834.795527]  [<ffffffffa003966a>] ? __ata_scsi_queuecmd+0x185/0x1dc [libata]
[ 1834.795527]  [<ffffffffa00008a5>] ? scsi_done+0x0/0xc [scsi_mod]
[ 1834.795527]  [<ffffffffa010ad48>] ? sas_queuecommand+0x93/0x283 [libsas]
[ 1834.795527]  [<ffffffffa0000b77>] ? scsi_dispatch_cmd+0x1c0/0x23c [scsi_mod]
[ 1834.795527]  [<ffffffffa0006325>] ? scsi_request_fn+0x4be/0x506 [scsi_mod]
[ 1834.795527]  [<ffffffffa000620c>] ? scsi_request_fn+0x3a5/0x506 [scsi_mod]
[ 1834.795527]  [<ffffffff81177ba0>] ? __blk_run_queue+0x35/0x66
[ 1834.795527]  [<ffffffff8116f914>] ? elv_insert+0xad/0x260
[ 1834.795527]  [<ffffffff8117af74>] ? blk_execute_rq_nowait+0x5d/0x89
[ 1834.795527]  [<ffffffff8117b035>] ? blk_execute_rq+0x95/0xd0
[ 1834.795527]  [<ffffffff81177077>] ? __freed_request+0x26/0x82
[ 1834.795527]  [<ffffffff811770f6>] ? freed_request+0x23/0x41
[ 1834.795527]  [<ffffffff81055efe>] ? capable+0x22/0x41
[ 1834.795527]  [<ffffffff8117e1c1>] ? sg_io+0x280/0x3b5
[ 1834.795527]  [<ffffffff8104a182>] ? try_to_wake_up+0x249/0x259
[ 1834.795527]  [<ffffffff8117e7f5>] ? scsi_cmd_ioctl+0x217/0x3f2
[ 1834.795527]  [<ffffffff8103a7a5>] ? scale_rt_power+0x1f/0x64
[ 1834.795527]  [<ffffffff81188057>] ? kobject_get+0x12/0x17
[ 1834.795527]  [<ffffffff8117ce78>] ? get_disk+0x95/0xb4
[ 1834.795527]  [<ffffffffa0079a7e>] ? sd_ioctl+0x9d/0xcb [sd_mod]
[ 1834.795527]  [<ffffffff8117c1e9>] ? __blkdev_driver_ioctl+0x69/0x7e
[ 1834.795527]  [<ffffffff8117c9e4>] ? blkdev_ioctl+0x7e6/0x836
[ 1834.795527]  [<ffffffff81110e93>] ? blkdev_open+0x0/0x96
[ 1834.795527]  [<ffffffff81110efa>] ? blkdev_open+0x67/0x96
[ 1834.795527]  [<ffffffff810ebc59>] ? __dentry_open+0x1c4/0x2bf
[ 1834.795527]  [<ffffffff810f729a>] ? do_filp_open+0x4c4/0x92b
[ 1834.795527]  [<ffffffff8110fcce>] ? block_ioctl+0x38/0x3c
[ 1834.795527]  [<ffffffff810f8ede>] ? vfs_ioctl+0x21/0x6c
[ 1834.795527]  [<ffffffff810f942c>] ? do_vfs_ioctl+0x48d/0x4cb
[ 1834.795527]  [<ffffffff810e4405>] ? virt_to_head_page+0x9/0x2b
[ 1834.795527]  [<ffffffff810f94bb>] ? sys_ioctl+0x51/0x70
[ 1834.795527]  [<ffffffff81010b42>] ? system_call_fastpath+0x16/0x1b
[ 1834.795527] ---[ end trace f12657df187e0997 ]---

^ permalink raw reply	[flat|nested] 26+ messages in thread
* RE: [PATCH] MVSAS: hot plug handling and IO issues
@ 2010-02-26 11:16 Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
  0 siblings, 0 replies; 26+ messages in thread
From: Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech @ 2010-02-26 11:16 UTC (permalink / raw)
  To: linux-scsi@vger.kernel.org, James Bottomley

James,

Please let me know the status of this patch. Please consider this patch to include in coming rc tree. 

--Srini.

-----Original Message-----
From: Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech 
Sent: Tuesday, February 16, 2010 4:41 PM
To: 'linux-scsi@vger.kernel.org'; 'James Bottomley'
Subject: [PATCH] MVSAS: hot plug handling and IO issues

From: Srinivas <satyasrinivasp@hcl.in>
Date: Mon, 15 Feb 2010
Subject: [PATCH]: Fix for hot plug handling and IO issues.
	Added code for handling of hot-plugging drives and tape issues. 

Signed-off-by: Srinivas <satyasrinivasp@hcl.in>
---
Thanks
Srini


DISCLAIMER:
-----------------------------------------------------------------------------------------------------------------------

The contents of this e-mail and any attachment(s) are confidential and intended for the named recipient(s) only. 
It shall not attach any liability on the originator or HCL or its affiliates. Any views or opinions presented in 
this email are solely those of the author and may not necessarily reflect the opinions of HCL or its affiliates. 
Any form of reproduction, dissemination, copying, disclosure, modification, distribution and / or publication of 
this message without the prior written consent of the author of this e-mail is strictly prohibited. If you have 
received this email in error please delete it and notify the sender immediately. Before opening any mail and 
attachments please check them for viruses and defect.

-----------------------------------------------------------------------------------------------------------------------

^ permalink raw reply	[flat|nested] 26+ messages in thread

end of thread, other threads:[~2010-07-28  1:19 UTC | newest]

Thread overview: 26+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-16 11:10 [PATCH] MVSAS: hot plug handling and IO issues Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
     [not found] ` <6B62480106F2B34D8404CF2FDAA4D9EF71F646BECA@CHN-HCLT-EVS06.HCLT.CORP.H CL.IN>
2010-02-16 13:43   ` Caspar Smit
2010-02-16 13:46     ` Mikael Abrahamsson
2010-02-17  6:37     ` Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
2010-02-16 13:47 ` Mikael Abrahamsson
2010-02-16 14:41   ` Caspar Smit
2010-02-17 12:53     ` Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
2010-02-17 13:16       ` Kristleifur Daðason
2010-02-23 10:11         ` Caspar Smit
2010-02-23 23:06           ` Graham Reed
2010-02-25 13:35           ` Audio Haven
2010-03-05  8:57             ` Audio Haven
2010-03-05 10:46 ` James Bottomley
2010-03-08 11:58   ` Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
2010-03-14 11:54     ` Konstantinos Skarlatos
2010-03-14 13:37       ` Konstantinos Skarlatos
2010-06-29 11:46     ` Audio Haven
2010-06-29 12:16       ` Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
2010-06-30 17:43         ` Audio Haven
2010-07-28  1:19         ` Audio Haven
  -- strict thread matches above, loose matches on Subject: below --
2010-02-23 11:41 Caspar Smit
2010-02-23 12:26 ` Konstantinos Skarlatos
2010-02-23 13:10   ` Mikael Abrahamsson
2010-02-24  4:55   ` Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
2010-02-24  4:46 ` Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech
2010-02-26 11:16 Srinivas Naga Venkatasatya Pasagadugula - ERS, HCL Tech

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.