diff options
Diffstat (limited to 'arch/s390/pci/pci_event.c')
| -rw-r--r-- | arch/s390/pci/pci_event.c | 15 | 
1 files changed, 12 insertions, 3 deletions
diff --git a/arch/s390/pci/pci_event.c b/arch/s390/pci/pci_event.c index 4d9773ef9e0a..dbe95ec5917e 100644 --- a/arch/s390/pci/pci_event.c +++ b/arch/s390/pci/pci_event.c @@ -267,6 +267,7 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf)  	zpci_err_hex(ccdf, sizeof(*ccdf));  	if (zdev) { +		mutex_lock(&zdev->state_lock);  		zpci_update_fh(zdev, ccdf->fh);  		if (zdev->zbus->bus)  			pdev = pci_get_slot(zdev->zbus->bus, zdev->devfn); @@ -294,6 +295,8 @@ static void __zpci_event_error(struct zpci_ccdf_err *ccdf)  	}  	pci_dev_put(pdev);  no_pdev: +	if (zdev) +		mutex_unlock(&zdev->state_lock);  	zpci_zdev_put(zdev);  } @@ -326,6 +329,10 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)  	zpci_dbg(3, "avl fid:%x, fh:%x, pec:%x\n",  		 ccdf->fid, ccdf->fh, ccdf->pec); + +	if (existing_zdev) +		mutex_lock(&zdev->state_lock); +  	switch (ccdf->pec) {  	case 0x0301: /* Reserved|Standby -> Configured */  		if (!zdev) { @@ -348,7 +355,7 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)  		break;  	case 0x0303: /* Deconfiguration requested */  		if (zdev) { -			/* The event may have been queued before we confirgured +			/* The event may have been queued before we configured  			 * the device.  			 */  			if (zdev->state != ZPCI_FN_STATE_CONFIGURED) @@ -359,7 +366,7 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)  		break;  	case 0x0304: /* Configured -> Standby|Reserved */  		if (zdev) { -			/* The event may have been queued before we confirgured +			/* The event may have been queued before we configured  			 * the device.:  			 */  			if (zdev->state == ZPCI_FN_STATE_CONFIGURED) @@ -383,8 +390,10 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)  	default:  		break;  	} -	if (existing_zdev) +	if (existing_zdev) { +		mutex_unlock(&zdev->state_lock);  		zpci_zdev_put(zdev); +	}  }  void zpci_event_availability(void *data)  |