[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH][linux 2.6.18] scsiback: free resources after error
From: Juergen Gross <jgross@xxxxxxxx> In case of an error during preparing an I/O the already allocated resources should all be freed again and the frontend request should be terminated accordingly. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> diff -r 19448506c371 drivers/xen/scsiback/common.h --- a/drivers/xen/scsiback/common.h Wed Jul 02 15:09:18 2014 +0200 +++ b/drivers/xen/scsiback/common.h Fri Jul 04 06:38:14 2014 +0200 @@ -163,13 +163,13 @@ struct scsi_device *scsiback_do_translat void scsiback_release_translation_entry(struct vscsibk_info *info); -void scsiback_cmd_exec(pending_req_t *pending_req); +int scsiback_cmd_exec(pending_req_t *pending_req); void scsiback_do_resp_with_sense(char *sense_buffer, int32_t result, uint32_t resid, pending_req_t *pending_req); void scsiback_fast_flush_area(pending_req_t *req); void scsiback_rsp_emulation(pending_req_t *pending_req); -void scsiback_req_emulation_or_cmdexec(pending_req_t *pending_req); +int scsiback_req_emulation_or_cmdexec(pending_req_t *pending_req); void scsiback_emulation_init(void); diff -r 19448506c371 drivers/xen/scsiback/emulate.c --- a/drivers/xen/scsiback/emulate.c Wed Jul 02 15:09:18 2014 +0200 +++ b/drivers/xen/scsiback/emulate.c Fri Jul 04 06:38:14 2014 +0200 @@ -345,16 +345,19 @@ void scsiback_rsp_emulation(pending_req_ } -void scsiback_req_emulation_or_cmdexec(pending_req_t *pending_req) +int scsiback_req_emulation_or_cmdexec(pending_req_t *pending_req) { + int err = 0; + if (__pre_do_emulation(pending_req, NULL)) { - scsiback_cmd_exec(pending_req); + err = scsiback_cmd_exec(pending_req); } else { scsiback_fast_flush_area(pending_req); scsiback_do_resp_with_sense(pending_req->sense_buffer, pending_req->rslt, pending_req->resid, pending_req); } + return err; } diff -r 19448506c371 drivers/xen/scsiback/scsiback.c --- a/drivers/xen/scsiback/scsiback.c Wed Jul 02 15:09:18 2014 +0200 +++ b/drivers/xen/scsiback/scsiback.c Fri Jul 04 06:38:14 2014 +0200 @@ -429,7 +429,7 @@ free_bios: } -void scsiback_cmd_exec(pending_req_t *pending_req) +int scsiback_cmd_exec(pending_req_t *pending_req) { int cmd_len = (int)pending_req->cmd_len; int data_dir = (int)pending_req->sc_data_direction; @@ -437,6 +437,7 @@ void scsiback_cmd_exec(pending_req_t *pe unsigned int timeout; struct request *rq; int write; + int err; DPRINTK("%s\n",__FUNCTION__); @@ -464,16 +465,18 @@ void scsiback_cmd_exec(pending_req_t *pe if (nr_segments) { - if (request_map_sg(rq, pending_req, nr_segments)) { + err = request_map_sg(rq, pending_req, nr_segments); + if (err) { printk(KERN_ERR "scsiback: SG Request Map Error\n"); - return; + blk_put_request(rq); + return err; } } scsiback_get(pending_req->info); blk_execute_rq_nowait(rq->q, NULL, rq, 1, scsiback_cmd_done); - return ; + return 0; } @@ -616,9 +619,15 @@ static int _scsiback_do_cmd_fn(struct vs case VSCSIIF_ACT_SCSI_CDB: /* The Host mode is through as for Emulation. */ if (info->feature == VSCSI_TYPE_HOST) - scsiback_cmd_exec(pending_req); + err = scsiback_cmd_exec(pending_req); else - scsiback_req_emulation_or_cmdexec(pending_req); + err = scsiback_req_emulation_or_cmdexec( + pending_req); + if (err) { + scsiback_fast_flush_area(pending_req); + scsiback_do_resp_with_sense(NULL, + DRIVER_ERROR << 24, 0, pending_req); + } break; case VSCSIIF_ACT_SCSI_RESET: scsiback_device_reset_exec(pending_req); _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |