From: K. Y. Srinivasan Date: Wed, 6 Apr 2011 18:25:38 +0000 (-0700) Subject: Staging: hv: Properly capture the error state X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=a617e395de55762f337f4d9002a3408d7e9be381;p=linux-beck.git Staging: hv: Properly capture the error state Properly capture the error state after the completion of I/O. This fixes a bug that was introduced in the patch-set titled: Staging: hv: Cleanup-storage-drivers-phase-II. A corrected version of this patch-set was sent out earlier, however the earlier (buggy) version of this patch-set was already applied. This patch fixes the problem. Signed-off-by: K. Y. Srinivasan Signed-off-by: Hank Janssen Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/hv/storvsc.c b/drivers/staging/hv/storvsc.c index 55865fae7145..d7ce3933b1db 100644 --- a/drivers/staging/hv/storvsc.c +++ b/drivers/staging/hv/storvsc.c @@ -279,6 +279,7 @@ static void stor_vsc_on_io_completion(struct hv_device *device, struct hv_storvsc_request *request) { struct storvsc_device *stor_device; + struct vstor_packet *stor_pkt; stor_device = must_get_stor_device(device); if (!stor_device) { @@ -287,19 +288,24 @@ static void stor_vsc_on_io_completion(struct hv_device *device, return; } - DPRINT_DBG(STORVSC, "IO_COMPLETE_OPERATION - request %p " + DPRINT_DBG(STORVSC, "IO_COMPLETE_OPERATION - request %p " "completed bytes xfer %u", request, vstor_packet->vm_srb.data_transfer_length); + stor_pkt = &request->vstor_packet; /* Copy over the status...etc */ + stor_pkt->vm_srb.scsi_status = vstor_packet->vm_srb.scsi_status; + stor_pkt->vm_srb.srb_status = vstor_packet->vm_srb.srb_status; + stor_pkt->vm_srb.sense_info_length = + vstor_packet->vm_srb.sense_info_length; if (vstor_packet->vm_srb.scsi_status != 0 || vstor_packet->vm_srb.srb_status != 1) { DPRINT_WARN(STORVSC, "cmd 0x%x scsi status 0x%x srb status 0x%x\n", - vstor_packet->vm_srb.cdb[0], + stor_pkt->vm_srb.cdb[0], vstor_packet->vm_srb.scsi_status, vstor_packet->vm_srb.srb_status); } @@ -319,6 +325,8 @@ static void stor_vsc_on_io_completion(struct hv_device *device, } } + stor_pkt->vm_srb.data_transfer_length = + vstor_packet->vm_srb.data_transfer_length; request->on_io_completion(request); @@ -535,6 +543,7 @@ int stor_vsc_on_io_request(struct hv_device *device, request->device = device; + vstor_packet->flags |= REQUEST_COMPLETION_FLAG; vstor_packet->vm_srb.length = sizeof(struct vmscsi_request);