All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH][linux 2.6.18] scsiback: free resources after error
@ 2014-07-04  4:41 jgross
  2014-07-04  9:40 ` [PATCH v2][linux " Jan Beulich
  0 siblings, 1 reply; 3+ messages in thread
From: jgross @ 2014-07-04  4:41 UTC (permalink / raw)
  To: xen-devel, jbeulich; +Cc: Juergen Gross

From: Juergen Gross <jgross@suse.com>

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@suse.com>

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);

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2][linux 2.6.18] scsiback: free resources after error
  2014-07-04  4:41 [PATCH][linux 2.6.18] scsiback: free resources after error jgross
@ 2014-07-04  9:40 ` Jan Beulich
  2014-07-04 10:02   ` Juergen Gross
  0 siblings, 1 reply; 3+ messages in thread
From: Jan Beulich @ 2014-07-04  9:40 UTC (permalink / raw)
  To: xen-devel; +Cc: Juergen Gross

[-- Attachment #1: Type: text/plain, Size: 4433 bytes --]

From: Juergen Gross <jgross@suse.com>

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@suse.com>

Some formatting adjustments to the changes above, and some more releasing
of resources (in the VSCSIIF_ACT_SCSI_RESET and default cases of the switch
in scsiback_do_cmd_fn()).

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/drivers/xen/scsiback/common.h
+++ b/drivers/xen/scsiback/common.h
@@ -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);
 
 
--- a/drivers/xen/scsiback/emulate.c
+++ b/drivers/xen/scsiback/emulate.c
@@ -345,16 +345,16 @@ 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)
 {
-	if (__pre_do_emulation(pending_req, NULL)) {
-		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);
-	}
+	if (__pre_do_emulation(pending_req, NULL))
+		return scsiback_cmd_exec(pending_req);
+
+	scsiback_fast_flush_area(pending_req);
+	scsiback_do_resp_with_sense(pending_req->sense_buffer,
+				    pending_req->rslt, pending_req->resid,
+				    pending_req);
+	return 0;
 }
 
 
--- a/drivers/xen/scsiback/scsiback.c
+++ b/drivers/xen/scsiback/scsiback.c
@@ -429,14 +429,14 @@ 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;
 	unsigned int nr_segments = (unsigned int)pending_req->nr_segments;
 	unsigned int timeout;
 	struct request *rq;
-	int write;
+	int write, err;
 
 	DPRINTK("%s\n",__FUNCTION__);
 
@@ -463,17 +463,19 @@ void scsiback_cmd_exec(pending_req_t *pe
 	rq->end_io_data = pending_req;
 
 	if (nr_segments) {
-
-		if (request_map_sg(rq, pending_req, nr_segments)) {
-			printk(KERN_ERR "scsiback: SG Request Map Error\n");
-			return;
+		err = request_map_sg(rq, pending_req, nr_segments);
+		if (err) {
+			printk(KERN_ERR "scsiback: SG Request Map error %d\n",
+			       err);
+			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;
 }
 
 
@@ -615,17 +617,28 @@ static int scsiback_do_cmd_fn(struct vsc
 		switch (err ?: pending_req->act) {
 		case VSCSIIF_ACT_SCSI_CDB:
 			/* The Host mode is through as for Emulation. */
-			if (info->feature == VSCSI_TYPE_HOST)
-				scsiback_cmd_exec(pending_req);
-			else
-				scsiback_req_emulation_or_cmdexec(pending_req);
+			if (info->feature == VSCSI_TYPE_HOST ?
+			    scsiback_cmd_exec(pending_req) :
+			    scsiback_req_emulation_or_cmdexec(pending_req)) {
+				scsiback_fast_flush_area(pending_req);
+				scsiback_do_resp_with_sense(NULL,
+							    DRIVER_ERROR << 24,
+							    0, pending_req);
+			}
 			break;
 		case VSCSIIF_ACT_SCSI_RESET:
+			/* Just for pointlessly specified segments: */
+			scsiback_fast_flush_area(pending_req);
 			scsiback_device_reset_exec(pending_req);
 			break;
 		default:
-			if(!err && printk_ratelimit())
-				printk(KERN_ERR "scsiback: invalid request\n");
+			if(!err) {
+				scsiback_fast_flush_area(pending_req);
+				if (printk_ratelimit())
+					printk(KERN_ERR
+					       "scsiback: invalid request %#x\n",
+					       pending_req->act);
+			}
 			scsiback_do_resp_with_sense(NULL, DRIVER_ERROR << 24,
 						    0, pending_req);
 			break;



[-- Attachment #2: xen-scsiback-free-resources-after-error.patch --]
[-- Type: text/plain, Size: 4428 bytes --]

scsiback: free resources after error

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@suse.com>

Some formatting adjustments to the changes above, and some more releasing
of resources (in the VSCSIIF_ACT_SCSI_RESET and default cases of the switch
in scsiback_do_cmd_fn()).

Signed-off-by: Jan Beulich <jbeulich@suse.com>

--- a/drivers/xen/scsiback/common.h
+++ b/drivers/xen/scsiback/common.h
@@ -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);
 
 
--- a/drivers/xen/scsiback/emulate.c
+++ b/drivers/xen/scsiback/emulate.c
@@ -345,16 +345,16 @@ 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)
 {
-	if (__pre_do_emulation(pending_req, NULL)) {
-		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);
-	}
+	if (__pre_do_emulation(pending_req, NULL))
+		return scsiback_cmd_exec(pending_req);
+
+	scsiback_fast_flush_area(pending_req);
+	scsiback_do_resp_with_sense(pending_req->sense_buffer,
+				    pending_req->rslt, pending_req->resid,
+				    pending_req);
+	return 0;
 }
 
 
--- a/drivers/xen/scsiback/scsiback.c
+++ b/drivers/xen/scsiback/scsiback.c
@@ -429,14 +429,14 @@ 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;
 	unsigned int nr_segments = (unsigned int)pending_req->nr_segments;
 	unsigned int timeout;
 	struct request *rq;
-	int write;
+	int write, err;
 
 	DPRINTK("%s\n",__FUNCTION__);
 
@@ -463,17 +463,19 @@ void scsiback_cmd_exec(pending_req_t *pe
 	rq->end_io_data = pending_req;
 
 	if (nr_segments) {
-
-		if (request_map_sg(rq, pending_req, nr_segments)) {
-			printk(KERN_ERR "scsiback: SG Request Map Error\n");
-			return;
+		err = request_map_sg(rq, pending_req, nr_segments);
+		if (err) {
+			printk(KERN_ERR "scsiback: SG Request Map error %d\n",
+			       err);
+			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;
 }
 
 
@@ -615,17 +617,28 @@ static int scsiback_do_cmd_fn(struct vsc
 		switch (err ?: pending_req->act) {
 		case VSCSIIF_ACT_SCSI_CDB:
 			/* The Host mode is through as for Emulation. */
-			if (info->feature == VSCSI_TYPE_HOST)
-				scsiback_cmd_exec(pending_req);
-			else
-				scsiback_req_emulation_or_cmdexec(pending_req);
+			if (info->feature == VSCSI_TYPE_HOST ?
+			    scsiback_cmd_exec(pending_req) :
+			    scsiback_req_emulation_or_cmdexec(pending_req)) {
+				scsiback_fast_flush_area(pending_req);
+				scsiback_do_resp_with_sense(NULL,
+							    DRIVER_ERROR << 24,
+							    0, pending_req);
+			}
 			break;
 		case VSCSIIF_ACT_SCSI_RESET:
+			/* Just for pointlessly specified segments: */
+			scsiback_fast_flush_area(pending_req);
 			scsiback_device_reset_exec(pending_req);
 			break;
 		default:
-			if(!err && printk_ratelimit())
-				printk(KERN_ERR "scsiback: invalid request\n");
+			if(!err) {
+				scsiback_fast_flush_area(pending_req);
+				if (printk_ratelimit())
+					printk(KERN_ERR
+					       "scsiback: invalid request %#x\n",
+					       pending_req->act);
+			}
 			scsiback_do_resp_with_sense(NULL, DRIVER_ERROR << 24,
 						    0, pending_req);
 			break;

[-- Attachment #3: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH v2][linux 2.6.18] scsiback: free resources after error
  2014-07-04  9:40 ` [PATCH v2][linux " Jan Beulich
@ 2014-07-04 10:02   ` Juergen Gross
  0 siblings, 0 replies; 3+ messages in thread
From: Juergen Gross @ 2014-07-04 10:02 UTC (permalink / raw)
  To: Jan Beulich, xen-devel

On 07/04/2014 11:40 AM, Jan Beulich wrote:
> From: Juergen Gross <jgross@suse.com>
>
> 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@suse.com>
>
> Some formatting adjustments to the changes above, and some more releasing
> of resources (in the VSCSIIF_ACT_SCSI_RESET and default cases of the switch
> in scsiback_do_cmd_fn()).

For your additional changes:

Reviewed-by: Juergen Gross <jgross@suse.com>

>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
>
> --- a/drivers/xen/scsiback/common.h
> +++ b/drivers/xen/scsiback/common.h
> @@ -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);
>
>
> --- a/drivers/xen/scsiback/emulate.c
> +++ b/drivers/xen/scsiback/emulate.c
> @@ -345,16 +345,16 @@ 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)
>   {
> -	if (__pre_do_emulation(pending_req, NULL)) {
> -		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);
> -	}
> +	if (__pre_do_emulation(pending_req, NULL))
> +		return scsiback_cmd_exec(pending_req);
> +
> +	scsiback_fast_flush_area(pending_req);
> +	scsiback_do_resp_with_sense(pending_req->sense_buffer,
> +				    pending_req->rslt, pending_req->resid,
> +				    pending_req);
> +	return 0;
>   }
>
>
> --- a/drivers/xen/scsiback/scsiback.c
> +++ b/drivers/xen/scsiback/scsiback.c
> @@ -429,14 +429,14 @@ 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;
>   	unsigned int nr_segments = (unsigned int)pending_req->nr_segments;
>   	unsigned int timeout;
>   	struct request *rq;
> -	int write;
> +	int write, err;
>
>   	DPRINTK("%s\n",__FUNCTION__);
>
> @@ -463,17 +463,19 @@ void scsiback_cmd_exec(pending_req_t *pe
>   	rq->end_io_data = pending_req;
>
>   	if (nr_segments) {
> -
> -		if (request_map_sg(rq, pending_req, nr_segments)) {
> -			printk(KERN_ERR "scsiback: SG Request Map Error\n");
> -			return;
> +		err = request_map_sg(rq, pending_req, nr_segments);
> +		if (err) {
> +			printk(KERN_ERR "scsiback: SG Request Map error %d\n",
> +			       err);
> +			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;
>   }
>
>
> @@ -615,17 +617,28 @@ static int scsiback_do_cmd_fn(struct vsc
>   		switch (err ?: pending_req->act) {
>   		case VSCSIIF_ACT_SCSI_CDB:
>   			/* The Host mode is through as for Emulation. */
> -			if (info->feature == VSCSI_TYPE_HOST)
> -				scsiback_cmd_exec(pending_req);
> -			else
> -				scsiback_req_emulation_or_cmdexec(pending_req);
> +			if (info->feature == VSCSI_TYPE_HOST ?
> +			    scsiback_cmd_exec(pending_req) :
> +			    scsiback_req_emulation_or_cmdexec(pending_req)) {
> +				scsiback_fast_flush_area(pending_req);
> +				scsiback_do_resp_with_sense(NULL,
> +							    DRIVER_ERROR << 24,
> +							    0, pending_req);
> +			}
>   			break;
>   		case VSCSIIF_ACT_SCSI_RESET:
> +			/* Just for pointlessly specified segments: */
> +			scsiback_fast_flush_area(pending_req);
>   			scsiback_device_reset_exec(pending_req);
>   			break;
>   		default:
> -			if(!err && printk_ratelimit())
> -				printk(KERN_ERR "scsiback: invalid request\n");
> +			if(!err) {
> +				scsiback_fast_flush_area(pending_req);
> +				if (printk_ratelimit())
> +					printk(KERN_ERR
> +					       "scsiback: invalid request %#x\n",
> +					       pending_req->act);
> +			}
>   			scsiback_do_resp_with_sense(NULL, DRIVER_ERROR << 24,
>   						    0, pending_req);
>   			break;
>
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xen.org
> http://lists.xen.org/xen-devel
>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-07-04 10:02 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-04  4:41 [PATCH][linux 2.6.18] scsiback: free resources after error jgross
2014-07-04  9:40 ` [PATCH v2][linux " Jan Beulich
2014-07-04 10:02   ` Juergen Gross

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.