Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > fc11cd6e1c513a17304da94a5390f3cd > files > 2384

kernel-2.6.18-194.11.1.el5.src.rpm

From: Marcus Barrow <mbarrow@redhat.com>
Date: Wed, 18 Nov 2009 14:04:24 -0500
Subject: [net] qlge: fix crash with kvm guest device passthru
Message-id: <20091118140423.18027.42665.sendpatchset@file.bos.redhat.com>
Patchwork-id: 21413
O-Subject: [rhel 5.5 patch] qlge - crashes RHEL5.4 KVM guest when using Device
	Assignment
Bugzilla: 507689
RH-Acked-by: David S. Miller <davem@redhat.com>
RH-Acked-by: Neil Horman <nhorman@redhat.com>

BZ 507689

qlge - fix for KVM device pass thru.

This patch fixes a crash that was occuring in an error path when
being used in pass-thru mode for a KVM guest.

The fix is to initialize a couple of pointers a few lines earlier.
Tested at QLogic.


diff --git a/drivers/net/qlge/qlge.h b/drivers/net/qlge/qlge.h
index cb85fbb..9e64f6f 100644
--- a/drivers/net/qlge/qlge.h
+++ b/drivers/net/qlge/qlge.h
@@ -17,9 +17,9 @@
  */
 #define DRV_NAME	"qlge"
 #define DRV_STRING	"QLogic 10 Gigabit PCI-E Ethernet Driver "
-#define DRV_VERSION	"1.00.00.21"
-#define DIS_VERSION	"2.6.16-2.6.18-p21"
-#define REL_DATE	"090812"
+#define DRV_VERSION	"1.00.00.22"
+#define DIS_VERSION	"2.6.16-2.6.18-p22"
+#define REL_DATE	"090819"
 
 #define PFX "qlge: "
 #define QPRINTK(qdev, nlevel, klevel, fmt, args...) \
diff --git a/drivers/net/qlge/qlge_main.c b/drivers/net/qlge/qlge_main.c
index 3a2e108..274440f 100644
--- a/drivers/net/qlge/qlge_main.c
+++ b/drivers/net/qlge/qlge_main.c
@@ -4169,11 +4169,14 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
 		return err;
 	}
 
+	qdev->ndev = ndev;
+	qdev->pdev = pdev;
+	pci_set_drvdata(pdev, ndev);
 	pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
 	if (pos <= 0) {
 		dev_err(&pdev->dev, PFX "Cannot find PCI Express capability, "
 			"aborting.\n");
-		goto err_out;
+		return pos;
 	} else {
 		pci_read_config_word(pdev, pos + PCI_EXP_DEVCTL, &val16);
 		val16 &= ~PCI_EXP_DEVCTL_NOSNOOP_EN;
@@ -4197,7 +4200,7 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
 	err = pci_request_regions(pdev, DRV_NAME);
 	if (err) {
 		dev_err(&pdev->dev, "PCI region request failed.\n");
-		goto err_out;
+		return err;
 	}
 
 	if (!pci_set_dma_mask(pdev, DMA_64BIT_MASK)) {
@@ -4216,7 +4219,6 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
 
 	pci_set_master(pdev);
 	pci_save_state(pdev);
-	pci_set_drvdata(pdev, ndev);
 	qdev->reg_base =
 		ioremap_nocache(pci_resource_start(pdev, 1),
 				pci_resource_len(pdev, 1));
@@ -4235,8 +4237,6 @@ static int __devinit ql_init_device(struct pci_dev *pdev,
 		err = -ENOMEM;
 		goto err_out;
 	}
-	qdev->ndev = ndev;
-	qdev->pdev = pdev;
 
 	err = ql_get_board_info(qdev);
 	if (err) {