|
[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 |