浏览代码

ibmvfc: Process async events before command responses

Since async events could indicate changes to link status, or
events which could affect decisions made during discovery, we should
process async events prior to command completion responses.

Signed-off-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Brian King 16 年之前
父节点
当前提交
f1d7fb7a8a
共有 1 个文件被更改,包括 10 次插入10 次删除
  1. 10 10
      drivers/scsi/ibmvscsi/ibmvfc.c

+ 10 - 10
drivers/scsi/ibmvscsi/ibmvfc.c

@@ -2783,27 +2783,27 @@ static void ibmvfc_tasklet(void *data)
 
 
 	spin_lock_irqsave(vhost->host->host_lock, flags);
 	spin_lock_irqsave(vhost->host->host_lock, flags);
 	while (!done) {
 	while (!done) {
-		/* Pull all the valid messages off the CRQ */
-		while ((crq = ibmvfc_next_crq(vhost)) != NULL) {
-			ibmvfc_handle_crq(crq, vhost);
-			crq->valid = 0;
-		}
-
 		/* Pull all the valid messages off the async CRQ */
 		/* Pull all the valid messages off the async CRQ */
 		while ((async = ibmvfc_next_async_crq(vhost)) != NULL) {
 		while ((async = ibmvfc_next_async_crq(vhost)) != NULL) {
 			ibmvfc_handle_async(async, vhost);
 			ibmvfc_handle_async(async, vhost);
 			async->valid = 0;
 			async->valid = 0;
 		}
 		}
 
 
-		vio_enable_interrupts(vdev);
-		if ((crq = ibmvfc_next_crq(vhost)) != NULL) {
-			vio_disable_interrupts(vdev);
+		/* Pull all the valid messages off the CRQ */
+		while ((crq = ibmvfc_next_crq(vhost)) != NULL) {
 			ibmvfc_handle_crq(crq, vhost);
 			ibmvfc_handle_crq(crq, vhost);
 			crq->valid = 0;
 			crq->valid = 0;
-		} else if ((async = ibmvfc_next_async_crq(vhost)) != NULL) {
+		}
+
+		vio_enable_interrupts(vdev);
+		if ((async = ibmvfc_next_async_crq(vhost)) != NULL) {
 			vio_disable_interrupts(vdev);
 			vio_disable_interrupts(vdev);
 			ibmvfc_handle_async(async, vhost);
 			ibmvfc_handle_async(async, vhost);
 			async->valid = 0;
 			async->valid = 0;
+		} else if ((crq = ibmvfc_next_crq(vhost)) != NULL) {
+			vio_disable_interrupts(vdev);
+			ibmvfc_handle_crq(crq, vhost);
+			crq->valid = 0;
 		} else
 		} else
 			done = 1;
 			done = 1;
 	}
 	}