[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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.