All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
@ 2012-10-16 20:59 Mahesh Rajashekhara
  2012-10-16 21:34 ` Tomas Henzl
  0 siblings, 1 reply; 11+ messages in thread
From: Mahesh Rajashekhara @ 2012-10-16 20:59 UTC (permalink / raw)
  To: JBottomley, linux-scsi
  Cc: aacraid, Achim_Leubner, Tony_Ruiz, Mahesh_Rajashekhara

This patch handles SCSI dma mapping failure case. Reporting error code to the upper layer instead of BUG_ON().

This patch is created against current upstream kernel.

Signed-off-by: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
---
 drivers/scsi/aacraid/aachba.c  |   63 +++++++++++++++++++++++++++++++---------
 drivers/scsi/aacraid/aacraid.h |    2 +-
 2 files changed, 50 insertions(+), 15 deletions(-)

diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index d79457a..efa2900 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -971,6 +971,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 {
 	struct aac_dev *dev = fib->dev;
 	u16 fibsize, command;
+	unsigned long ret;
 
 	aac_fib_init(fib);
 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
@@ -982,7 +983,10 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 		readcmd2->byteCount = cpu_to_le32(count<<9);
 		readcmd2->cid = cpu_to_le16(scmd_id(cmd));
 		readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
-		aac_build_sgraw2(cmd, readcmd2, dev->scsi_host_ptr->sg_tablesize);
+		ret = aac_build_sgraw2(cmd, readcmd2,
+				dev->scsi_host_ptr->sg_tablesize);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo2;
 		fibsize = sizeof(struct aac_raw_io2) +
 			((le32_to_cpu(readcmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
@@ -996,7 +1000,9 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 		readcmd->flags = cpu_to_le16(RIO_TYPE_READ);
 		readcmd->bpTotal = 0;
 		readcmd->bpComplete = 0;
-		aac_build_sgraw(cmd, &readcmd->sg);
+		ret = aac_build_sgraw(cmd, &readcmd->sg);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo;
 		fibsize = sizeof(struct aac_raw_io) +
 			((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw));
@@ -1019,6 +1025,7 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 {
 	u16 fibsize;
 	struct aac_read64 *readcmd;
+	unsigned long ret;
 	aac_fib_init(fib);
 	readcmd = (struct aac_read64 *) fib_data(fib);
 	readcmd->command = cpu_to_le32(VM_CtHostRead64);
@@ -1028,7 +1035,9 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 	readcmd->pad   = 0;
 	readcmd->flags = 0;
 
-	aac_build_sg64(cmd, &readcmd->sg);
+	ret = aac_build_sg64(cmd, &readcmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_read64) +
 		((le32_to_cpu(readcmd->sg.count) - 1) *
 		 sizeof (struct sgentry64));
@@ -1050,6 +1059,8 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
 {
 	u16 fibsize;
 	struct aac_read *readcmd;
+	unsigned long ret;
+
 	aac_fib_init(fib);
 	readcmd = (struct aac_read *) fib_data(fib);
 	readcmd->command = cpu_to_le32(VM_CtBlockRead);
@@ -1057,7 +1068,9 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
 	readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 	readcmd->count = cpu_to_le32(count * 512);
 
-	aac_build_sg(cmd, &readcmd->sg);
+	ret = aac_build_sg(cmd, &readcmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_read) +
 			((le32_to_cpu(readcmd->sg.count) - 1) *
 			 sizeof (struct sgentry));
@@ -1079,6 +1092,7 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 {
 	struct aac_dev *dev = fib->dev;
 	u16 fibsize, command;
+	unsigned long ret;
 
 	aac_fib_init(fib);
 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
@@ -1093,7 +1107,10 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 						   (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
 			cpu_to_le16(RIO2_IO_TYPE_WRITE|RIO2_IO_SUREWRITE) :
 			cpu_to_le16(RIO2_IO_TYPE_WRITE);
-		aac_build_sgraw2(cmd, writecmd2, dev->scsi_host_ptr->sg_tablesize);
+		ret = aac_build_sgraw2(cmd, writecmd2,
+				dev->scsi_host_ptr->sg_tablesize);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo2;
 		fibsize = sizeof(struct aac_raw_io2) +
 			((le32_to_cpu(writecmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
@@ -1110,7 +1127,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 			cpu_to_le16(RIO_TYPE_WRITE);
 		writecmd->bpTotal = 0;
 		writecmd->bpComplete = 0;
-		aac_build_sgraw(cmd, &writecmd->sg);
+		ret = aac_build_sgraw(cmd, &writecmd->sg);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo;
 		fibsize = sizeof(struct aac_raw_io) +
 			((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw));
@@ -1133,6 +1152,7 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
 {
 	u16 fibsize;
 	struct aac_write64 *writecmd;
+	unsigned long ret;
 	aac_fib_init(fib);
 	writecmd = (struct aac_write64 *) fib_data(fib);
 	writecmd->command = cpu_to_le32(VM_CtHostWrite64);
@@ -1142,7 +1162,9 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
 	writecmd->pad	= 0;
 	writecmd->flags	= 0;
 
-	aac_build_sg64(cmd, &writecmd->sg);
+	ret = aac_build_sg64(cmd, &writecmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_write64) +
 		((le32_to_cpu(writecmd->sg.count) - 1) *
 		 sizeof (struct sgentry64));
@@ -1164,6 +1186,7 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 {
 	u16 fibsize;
 	struct aac_write *writecmd;
+	unsigned long ret;
 	aac_fib_init(fib);
 	writecmd = (struct aac_write *) fib_data(fib);
 	writecmd->command = cpu_to_le32(VM_CtBlockWrite);
@@ -1173,7 +1196,9 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 	writecmd->sg.count = cpu_to_le32(1);
 	/* ->stable is not used - it did mean which type of write */
 
-	aac_build_sg(cmd, &writecmd->sg);
+	ret = aac_build_sg(cmd, &writecmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_write) +
 		((le32_to_cpu(writecmd->sg.count) - 1) *
 		 sizeof (struct sgentry));
@@ -1235,8 +1260,11 @@ static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
 {
 	u16 fibsize;
 	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+	unsigned long ret;
 
-	aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
+	ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg);
+	if (ret < 0)
+		return ret;
 	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
 	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
@@ -1263,8 +1291,11 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
 {
 	u16 fibsize;
 	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+	unsigned long ret;
 
-	aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
+	ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg);
+	if (ret < 0)
+		return ret;
 	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
 	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
@@ -2883,7 +2914,8 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
 	psg->sg[0].count = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -2927,7 +2959,8 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
 	psg->sg[0].count = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -2972,7 +3005,8 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
 	psg->sg[0].flags = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -3011,7 +3045,8 @@ static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_
 	int nseg;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i, conformable = 0;
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 9e933a8..742f5d7 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -12,7 +12,7 @@
  *----------------------------------------------------------------------------*/
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 29800
+# define AAC_DRIVER_BUILD 29801
 # define AAC_DRIVER_BRANCH "-ms"
 #endif
 #define MAXIMUM_NUM_CONTAINERS	32
-- 
1.7.7.6


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

* Re: [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
  2012-10-16 20:59 [PATCH 1/1] aacraid: SCSI dma mapping failure case handling Mahesh Rajashekhara
@ 2012-10-16 21:34 ` Tomas Henzl
  2012-11-14  7:03   ` James Bottomley
  0 siblings, 1 reply; 11+ messages in thread
From: Tomas Henzl @ 2012-10-16 21:34 UTC (permalink / raw)
  To: Mahesh Rajashekhara
  Cc: JBottomley, linux-scsi, aacraid, Achim_Leubner, Tony_Ruiz

On 10/16/2012 10:59 PM, Mahesh Rajashekhara wrote:
> This patch handles SCSI dma mapping failure case. Reporting error code to the upper layer instead of BUG_ON().
>
> This patch is created against current upstream kernel.
>
> Signed-off-by: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
> ---
>  drivers/scsi/aacraid/aachba.c  |   63 +++++++++++++++++++++++++++++++---------
>  drivers/scsi/aacraid/aacraid.h |    2 +-
>  2 files changed, 50 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
> index d79457a..efa2900 100644
> --- a/drivers/scsi/aacraid/aachba.c
> +++ b/drivers/scsi/aacraid/aachba.c
> @@ -971,6 +971,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  {
>  	struct aac_dev *dev = fib->dev;
>  	u16 fibsize, command;
> +	unsigned long ret;
>  
>  	aac_fib_init(fib);
>  	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
> @@ -982,7 +983,10 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  		readcmd2->byteCount = cpu_to_le32(count<<9);
>  		readcmd2->cid = cpu_to_le16(scmd_id(cmd));
>  		readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
> -		aac_build_sgraw2(cmd, readcmd2, dev->scsi_host_ptr->sg_tablesize);
> +		ret = aac_build_sgraw2(cmd, readcmd2,
> +				dev->scsi_host_ptr->sg_tablesize);
> +		if (ret < 0)
> +			return ret;

Hi Mahesh, 'ret' is 'unsigned', the above test will not work.
Tomas

>  		command = ContainerRawIo2;
>  		fibsize = sizeof(struct aac_raw_io2) +
>  			((le32_to_cpu(readcmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
> @@ -996,7 +1000,9 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  		readcmd->flags = cpu_to_le16(RIO_TYPE_READ);
>  		readcmd->bpTotal = 0;
>  		readcmd->bpComplete = 0;
> -		aac_build_sgraw(cmd, &readcmd->sg);
> +		ret = aac_build_sgraw(cmd, &readcmd->sg);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo;
>  		fibsize = sizeof(struct aac_raw_io) +
>  			((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw));
> @@ -1019,6 +1025,7 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  {
>  	u16 fibsize;
>  	struct aac_read64 *readcmd;
> +	unsigned long ret;
>  	aac_fib_init(fib);
>  	readcmd = (struct aac_read64 *) fib_data(fib);
>  	readcmd->command = cpu_to_le32(VM_CtHostRead64);
> @@ -1028,7 +1035,9 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  	readcmd->pad   = 0;
>  	readcmd->flags = 0;
>  
> -	aac_build_sg64(cmd, &readcmd->sg);
> +	ret = aac_build_sg64(cmd, &readcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_read64) +
>  		((le32_to_cpu(readcmd->sg.count) - 1) *
>  		 sizeof (struct sgentry64));
> @@ -1050,6 +1059,8 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
>  {
>  	u16 fibsize;
>  	struct aac_read *readcmd;
> +	unsigned long ret;
> +
>  	aac_fib_init(fib);
>  	readcmd = (struct aac_read *) fib_data(fib);
>  	readcmd->command = cpu_to_le32(VM_CtBlockRead);
> @@ -1057,7 +1068,9 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
>  	readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
>  	readcmd->count = cpu_to_le32(count * 512);
>  
> -	aac_build_sg(cmd, &readcmd->sg);
> +	ret = aac_build_sg(cmd, &readcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_read) +
>  			((le32_to_cpu(readcmd->sg.count) - 1) *
>  			 sizeof (struct sgentry));
> @@ -1079,6 +1092,7 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  {
>  	struct aac_dev *dev = fib->dev;
>  	u16 fibsize, command;
> +	unsigned long ret;
>  
>  	aac_fib_init(fib);
>  	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
> @@ -1093,7 +1107,10 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  						   (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
>  			cpu_to_le16(RIO2_IO_TYPE_WRITE|RIO2_IO_SUREWRITE) :
>  			cpu_to_le16(RIO2_IO_TYPE_WRITE);
> -		aac_build_sgraw2(cmd, writecmd2, dev->scsi_host_ptr->sg_tablesize);
> +		ret = aac_build_sgraw2(cmd, writecmd2,
> +				dev->scsi_host_ptr->sg_tablesize);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo2;
>  		fibsize = sizeof(struct aac_raw_io2) +
>  			((le32_to_cpu(writecmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
> @@ -1110,7 +1127,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  			cpu_to_le16(RIO_TYPE_WRITE);
>  		writecmd->bpTotal = 0;
>  		writecmd->bpComplete = 0;
> -		aac_build_sgraw(cmd, &writecmd->sg);
> +		ret = aac_build_sgraw(cmd, &writecmd->sg);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo;
>  		fibsize = sizeof(struct aac_raw_io) +
>  			((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw));
> @@ -1133,6 +1152,7 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
>  {
>  	u16 fibsize;
>  	struct aac_write64 *writecmd;
> +	unsigned long ret;
>  	aac_fib_init(fib);
>  	writecmd = (struct aac_write64 *) fib_data(fib);
>  	writecmd->command = cpu_to_le32(VM_CtHostWrite64);
> @@ -1142,7 +1162,9 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
>  	writecmd->pad	= 0;
>  	writecmd->flags	= 0;
>  
> -	aac_build_sg64(cmd, &writecmd->sg);
> +	ret = aac_build_sg64(cmd, &writecmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_write64) +
>  		((le32_to_cpu(writecmd->sg.count) - 1) *
>  		 sizeof (struct sgentry64));
> @@ -1164,6 +1186,7 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  {
>  	u16 fibsize;
>  	struct aac_write *writecmd;
> +	unsigned long ret;
>  	aac_fib_init(fib);
>  	writecmd = (struct aac_write *) fib_data(fib);
>  	writecmd->command = cpu_to_le32(VM_CtBlockWrite);
> @@ -1173,7 +1196,9 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  	writecmd->sg.count = cpu_to_le32(1);
>  	/* ->stable is not used - it did mean which type of write */
>  
> -	aac_build_sg(cmd, &writecmd->sg);
> +	ret = aac_build_sg(cmd, &writecmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_write) +
>  		((le32_to_cpu(writecmd->sg.count) - 1) *
>  		 sizeof (struct sgentry));
> @@ -1235,8 +1260,11 @@ static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
>  {
>  	u16 fibsize;
>  	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
> +	unsigned long ret;
>  
> -	aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
> +	ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
>  
>  	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
> @@ -1263,8 +1291,11 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
>  {
>  	u16 fibsize;
>  	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
> +	unsigned long ret;
>  
> -	aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
> +	ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
>  
>  	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
> @@ -2883,7 +2914,8 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
>  	psg->sg[0].count = 0;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i;
> @@ -2927,7 +2959,8 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
>  	psg->sg[0].count = 0;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i;
> @@ -2972,7 +3005,8 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
>  	psg->sg[0].flags = 0;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i;
> @@ -3011,7 +3045,8 @@ static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_
>  	int nseg;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i, conformable = 0;
> diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
> index 9e933a8..742f5d7 100644
> --- a/drivers/scsi/aacraid/aacraid.h
> +++ b/drivers/scsi/aacraid/aacraid.h
> @@ -12,7 +12,7 @@
>   *----------------------------------------------------------------------------*/
>  
>  #ifndef AAC_DRIVER_BUILD
> -# define AAC_DRIVER_BUILD 29800
> +# define AAC_DRIVER_BUILD 29801
>  # define AAC_DRIVER_BRANCH "-ms"
>  #endif
>  #define MAXIMUM_NUM_CONTAINERS	32


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

* Re: [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
  2012-10-16 21:34 ` Tomas Henzl
@ 2012-11-14  7:03   ` James Bottomley
  2012-11-14  9:58     ` Mahesh Rajashekhara
  0 siblings, 1 reply; 11+ messages in thread
From: James Bottomley @ 2012-11-14  7:03 UTC (permalink / raw)
  To: Tomas Henzl
  Cc: Mahesh Rajashekhara, linux-scsi, aacraid, Achim_Leubner, Tony_Ruiz

On Tue, 2012-10-16 at 23:34 +0200, Tomas Henzl wrote:
> On 10/16/2012 10:59 PM, Mahesh Rajashekhara wrote:
> > This patch handles SCSI dma mapping failure case. Reporting error code to the upper layer instead of BUG_ON().
> >
> > This patch is created against current upstream kernel.
> >
> > Signed-off-by: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
> > ---
> >  drivers/scsi/aacraid/aachba.c  |   63 +++++++++++++++++++++++++++++++---------
> >  drivers/scsi/aacraid/aacraid.h |    2 +-
> >  2 files changed, 50 insertions(+), 15 deletions(-)
> >
> > diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
> > index d79457a..efa2900 100644
> > --- a/drivers/scsi/aacraid/aachba.c
> > +++ b/drivers/scsi/aacraid/aachba.c
> > @@ -971,6 +971,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
> >  {
> >  	struct aac_dev *dev = fib->dev;
> >  	u16 fibsize, command;
> > +	unsigned long ret;
> >  
> >  	aac_fib_init(fib);
> >  	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
> > @@ -982,7 +983,10 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
> >  		readcmd2->byteCount = cpu_to_le32(count<<9);
> >  		readcmd2->cid = cpu_to_le16(scmd_id(cmd));
> >  		readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
> > -		aac_build_sgraw2(cmd, readcmd2, dev->scsi_host_ptr->sg_tablesize);
> > +		ret = aac_build_sgraw2(cmd, readcmd2,
> > +				dev->scsi_host_ptr->sg_tablesize);
> > +		if (ret < 0)
> > +			return ret;
> 
> Hi Mahesh, 'ret' is 'unsigned', the above test will not work.
> Tomas

Ping on this please Mahesh?  The criticism seems completely valid to me.

James


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

* RE: [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
  2012-11-14  7:03   ` James Bottomley
@ 2012-11-14  9:58     ` Mahesh Rajashekhara
  0 siblings, 0 replies; 11+ messages in thread
From: Mahesh Rajashekhara @ 2012-11-14  9:58 UTC (permalink / raw)
  To: James Bottomley, Tomas Henzl
  Cc: linux-scsi, aacraid, Achim Leubner, Tony Ruiz

Hi James,

We have taken care the review comments and re-submitted the patch a while ago.
http://marc.info/?l=linux-scsi&m=135063478232396&w=2
 

Tomas has provided Acked-by to the patch.
http://marc.info/?l=linux-scsi&m=135065706307974&w=2

  
Thanks,
Mahesh


-----Original Message-----
From: James Bottomley [mailto:jbottomley@parallels.com] 
Sent: Wednesday, November 14, 2012 12:33 PM
To: Tomas Henzl
Cc: Mahesh Rajashekhara; linux-scsi@vger.kernel.org; aacraid@pmc-sierra.com; Achim Leubner; Tony Ruiz
Subject: Re: [PATCH 1/1] aacraid: SCSI dma mapping failure case handling

On Tue, 2012-10-16 at 23:34 +0200, Tomas Henzl wrote:
> On 10/16/2012 10:59 PM, Mahesh Rajashekhara wrote:
> > This patch handles SCSI dma mapping failure case. Reporting error code to the upper layer instead of BUG_ON().
> >
> > This patch is created against current upstream kernel.
> >
> > Signed-off-by: Mahesh Rajashekhara 
> > <Mahesh_Rajashekhara@pmc-sierra.com>
> > ---
> >  drivers/scsi/aacraid/aachba.c  |   63 +++++++++++++++++++++++++++++++---------
> >  drivers/scsi/aacraid/aacraid.h |    2 +-
> >  2 files changed, 50 insertions(+), 15 deletions(-)
> >
> > diff --git a/drivers/scsi/aacraid/aachba.c 
> > b/drivers/scsi/aacraid/aachba.c index d79457a..efa2900 100644
> > --- a/drivers/scsi/aacraid/aachba.c
> > +++ b/drivers/scsi/aacraid/aachba.c
> > @@ -971,6 +971,7 @@ static int aac_read_raw_io(struct fib * fib, 
> > struct scsi_cmnd * cmd, u64 lba, u3  {
> >  	struct aac_dev *dev = fib->dev;
> >  	u16 fibsize, command;
> > +	unsigned long ret;
> >  
> >  	aac_fib_init(fib);
> >  	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && 
> > !dev->sync_mode) { @@ -982,7 +983,10 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
> >  		readcmd2->byteCount = cpu_to_le32(count<<9);
> >  		readcmd2->cid = cpu_to_le16(scmd_id(cmd));
> >  		readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
> > -		aac_build_sgraw2(cmd, readcmd2, dev->scsi_host_ptr->sg_tablesize);
> > +		ret = aac_build_sgraw2(cmd, readcmd2,
> > +				dev->scsi_host_ptr->sg_tablesize);
> > +		if (ret < 0)
> > +			return ret;
> 
> Hi Mahesh, 'ret' is 'unsigned', the above test will not work.
> Tomas

Ping on this please Mahesh?  The criticism seems completely valid to me.

James


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

* RE: [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
  2012-10-19 14:30 ` Tomas Henzl
@ 2012-11-01 14:57   ` Mahesh Rajashekhara
  0 siblings, 0 replies; 11+ messages in thread
From: Mahesh Rajashekhara @ 2012-11-01 14:57 UTC (permalink / raw)
  To: JBottomley, linux-scsi; +Cc: aacraid, Achim Leubner, Tony Ruiz, Tomas Henzl

Hello James,

Can you please let us know the status of this patch. Can we get a
sign-off/approval of this patch.

Thanks,
Mahesh

-----Original Message-----
From: Tomas Henzl [mailto:thenzl@redhat.com] 
Sent: Friday, October 19, 2012 8:00 PM
To: Mahesh Rajashekhara
Cc: JBottomley@Parallels.com; linux-scsi@vger.kernel.org;
aacraid@pmc-sierra.com; Achim Leubner; Tony Ruiz
Subject: Re: [PATCH 1/1] aacraid: SCSI dma mapping failure case handling

On 10/19/2012 03:51 PM, Mahesh Rajashekhara wrote:
> Hi James,
>
> We've incorporated the changes suggested by Tomas in this driver
patch.  I would request you to please consider this patch. Please let us
know your comments if any.
>
> Patch Description:
> This patch handles SCSI dma mapping failure case. Reporting error code
to the upper layer instead of BUG_ON().
>
> Signed-off-by: Mahesh Rajashekhara
<Mahesh_Rajashekhara@pmc-sierra.com>

Acked-by: Tomas Henzl <thenzl@redhat.com>

Thanks.


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

* Re: [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
  2012-10-19 13:51 Mahesh Rajashekhara
@ 2012-10-19 14:30 ` Tomas Henzl
  2012-11-01 14:57   ` Mahesh Rajashekhara
  0 siblings, 1 reply; 11+ messages in thread
From: Tomas Henzl @ 2012-10-19 14:30 UTC (permalink / raw)
  To: Mahesh Rajashekhara
  Cc: JBottomley, linux-scsi, aacraid, Achim_Leubner, Tony_Ruiz

On 10/19/2012 03:51 PM, Mahesh Rajashekhara wrote:
> Hi James,
>
> We've incorporated the changes suggested by Tomas in this driver patch.  I would request you to please consider this patch. Please let us know your comments if any.
>
> Patch Description:
> This patch handles SCSI dma mapping failure case. Reporting error code to the upper layer instead of BUG_ON().
>
> Signed-off-by: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>

Acked-by: Tomas Henzl <thenzl@redhat.com>

Thanks.


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

* [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
@ 2012-10-19 13:51 Mahesh Rajashekhara
  2012-10-19 14:30 ` Tomas Henzl
  0 siblings, 1 reply; 11+ messages in thread
From: Mahesh Rajashekhara @ 2012-10-19 13:51 UTC (permalink / raw)
  To: thenzl, JBottomley, linux-scsi
  Cc: aacraid, Achim_Leubner, Tony_Ruiz, Mahesh_Rajashekhara

Hi James,

We've incorporated the changes suggested by Tomas in this driver patch.  I would request you to please consider this patch. Please let us know your comments if any.

Patch Description:
This patch handles SCSI dma mapping failure case. Reporting error code to the upper layer instead of BUG_ON().

Signed-off-by: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
---
 drivers/scsi/aacraid/aachba.c  |   87 +++++++++++++++++++++++++++++----------
 drivers/scsi/aacraid/aacraid.h |    2 +-
 2 files changed, 65 insertions(+), 24 deletions(-)

diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index d79457a..681434e 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -132,11 +132,13 @@ struct inquiry_data {
  *              M O D U L E   G L O B A L S
  */
 
-static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* sgmap);
-static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg);
-static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg);
-static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max);
-static int aac_convert_sgraw2(struct aac_raw_io2 *rio2, int pages, int nseg, int nseg_new);
+static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *sgmap);
+static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg);
+static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg);
+static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
+				struct aac_raw_io2 *rio2, int sg_max);
+static int aac_convert_sgraw2(struct aac_raw_io2 *rio2,
+				int pages, int nseg, int nseg_new);
 static int aac_send_srb_fib(struct scsi_cmnd* scsicmd);
 #ifdef AAC_DETAILED_STATUS_INFO
 static char *aac_get_status_string(u32 status);
@@ -971,6 +973,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 {
 	struct aac_dev *dev = fib->dev;
 	u16 fibsize, command;
+	long ret;
 
 	aac_fib_init(fib);
 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
@@ -982,7 +985,10 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 		readcmd2->byteCount = cpu_to_le32(count<<9);
 		readcmd2->cid = cpu_to_le16(scmd_id(cmd));
 		readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
-		aac_build_sgraw2(cmd, readcmd2, dev->scsi_host_ptr->sg_tablesize);
+		ret = aac_build_sgraw2(cmd, readcmd2,
+				dev->scsi_host_ptr->sg_tablesize);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo2;
 		fibsize = sizeof(struct aac_raw_io2) +
 			((le32_to_cpu(readcmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
@@ -996,7 +1002,9 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 		readcmd->flags = cpu_to_le16(RIO_TYPE_READ);
 		readcmd->bpTotal = 0;
 		readcmd->bpComplete = 0;
-		aac_build_sgraw(cmd, &readcmd->sg);
+		ret = aac_build_sgraw(cmd, &readcmd->sg);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo;
 		fibsize = sizeof(struct aac_raw_io) +
 			((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw));
@@ -1019,6 +1027,8 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 {
 	u16 fibsize;
 	struct aac_read64 *readcmd;
+	long ret;
+
 	aac_fib_init(fib);
 	readcmd = (struct aac_read64 *) fib_data(fib);
 	readcmd->command = cpu_to_le32(VM_CtHostRead64);
@@ -1028,7 +1038,9 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 	readcmd->pad   = 0;
 	readcmd->flags = 0;
 
-	aac_build_sg64(cmd, &readcmd->sg);
+	ret = aac_build_sg64(cmd, &readcmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_read64) +
 		((le32_to_cpu(readcmd->sg.count) - 1) *
 		 sizeof (struct sgentry64));
@@ -1050,6 +1062,8 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
 {
 	u16 fibsize;
 	struct aac_read *readcmd;
+	long ret;
+
 	aac_fib_init(fib);
 	readcmd = (struct aac_read *) fib_data(fib);
 	readcmd->command = cpu_to_le32(VM_CtBlockRead);
@@ -1057,7 +1071,9 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
 	readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 	readcmd->count = cpu_to_le32(count * 512);
 
-	aac_build_sg(cmd, &readcmd->sg);
+	ret = aac_build_sg(cmd, &readcmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_read) +
 			((le32_to_cpu(readcmd->sg.count) - 1) *
 			 sizeof (struct sgentry));
@@ -1079,6 +1095,7 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 {
 	struct aac_dev *dev = fib->dev;
 	u16 fibsize, command;
+	long ret;
 
 	aac_fib_init(fib);
 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
@@ -1093,7 +1110,10 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 						   (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
 			cpu_to_le16(RIO2_IO_TYPE_WRITE|RIO2_IO_SUREWRITE) :
 			cpu_to_le16(RIO2_IO_TYPE_WRITE);
-		aac_build_sgraw2(cmd, writecmd2, dev->scsi_host_ptr->sg_tablesize);
+		ret = aac_build_sgraw2(cmd, writecmd2,
+				dev->scsi_host_ptr->sg_tablesize);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo2;
 		fibsize = sizeof(struct aac_raw_io2) +
 			((le32_to_cpu(writecmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
@@ -1110,7 +1130,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 			cpu_to_le16(RIO_TYPE_WRITE);
 		writecmd->bpTotal = 0;
 		writecmd->bpComplete = 0;
-		aac_build_sgraw(cmd, &writecmd->sg);
+		ret = aac_build_sgraw(cmd, &writecmd->sg);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo;
 		fibsize = sizeof(struct aac_raw_io) +
 			((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw));
@@ -1133,6 +1155,8 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
 {
 	u16 fibsize;
 	struct aac_write64 *writecmd;
+	long ret;
+
 	aac_fib_init(fib);
 	writecmd = (struct aac_write64 *) fib_data(fib);
 	writecmd->command = cpu_to_le32(VM_CtHostWrite64);
@@ -1142,7 +1166,9 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
 	writecmd->pad	= 0;
 	writecmd->flags	= 0;
 
-	aac_build_sg64(cmd, &writecmd->sg);
+	ret = aac_build_sg64(cmd, &writecmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_write64) +
 		((le32_to_cpu(writecmd->sg.count) - 1) *
 		 sizeof (struct sgentry64));
@@ -1164,6 +1190,8 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 {
 	u16 fibsize;
 	struct aac_write *writecmd;
+	long ret;
+
 	aac_fib_init(fib);
 	writecmd = (struct aac_write *) fib_data(fib);
 	writecmd->command = cpu_to_le32(VM_CtBlockWrite);
@@ -1173,7 +1201,9 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 	writecmd->sg.count = cpu_to_le32(1);
 	/* ->stable is not used - it did mean which type of write */
 
-	aac_build_sg(cmd, &writecmd->sg);
+	ret = aac_build_sg(cmd, &writecmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_write) +
 		((le32_to_cpu(writecmd->sg.count) - 1) *
 		 sizeof (struct sgentry));
@@ -1235,8 +1265,11 @@ static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
 {
 	u16 fibsize;
 	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+	long ret;
 
-	aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
+	ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg);
+	if (ret < 0)
+		return ret;
 	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
 	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
@@ -1263,8 +1296,11 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
 {
 	u16 fibsize;
 	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+	long ret;
 
-	aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
+	ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg);
+	if (ret < 0)
+		return ret;
 	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
 	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
@@ -2870,7 +2906,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
 	return -1;
 }
 
-static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
+static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *psg)
 {
 	struct aac_dev *dev;
 	unsigned long byte_count = 0;
@@ -2883,7 +2919,8 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
 	psg->sg[0].count = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -2912,7 +2949,7 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
 }
 
 
-static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg)
+static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg)
 {
 	struct aac_dev *dev;
 	unsigned long byte_count = 0;
@@ -2927,7 +2964,8 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
 	psg->sg[0].count = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -2957,7 +2995,7 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
 	return byte_count;
 }
 
-static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg)
+static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg)
 {
 	unsigned long byte_count = 0;
 	int nseg;
@@ -2972,7 +3010,8 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
 	psg->sg[0].flags = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -3005,13 +3044,15 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
 	return byte_count;
 }
 
-static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max)
+static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
+				struct aac_raw_io2 *rio2, int sg_max)
 {
 	unsigned long byte_count = 0;
 	int nseg;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i, conformable = 0;
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 9e933a8..742f5d7 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -12,7 +12,7 @@
  *----------------------------------------------------------------------------*/
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 29800
+# define AAC_DRIVER_BUILD 29801
 # define AAC_DRIVER_BRANCH "-ms"
 #endif
 #define MAXIMUM_NUM_CONTAINERS	32
-- 
1.7.7.6


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

* [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
@ 2012-10-17 17:54 Mahesh Rajashekhara
  2012-10-17 15:23 ` Tomas Henzl
  0 siblings, 1 reply; 11+ messages in thread
From: Mahesh Rajashekhara @ 2012-10-17 17:54 UTC (permalink / raw)
  To: thenzl, JBottomley, linux-scsi
  Cc: aacraid, Achim_Leubner, Tony_Ruiz, Mahesh_Rajashekhara

I have changed all aac_build_... function prototypes  as of type 'long' and they return 'byte_count' is of type 'long'.

Signed-off-by: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
---
 drivers/scsi/aacraid/aachba.c  |   95 ++++++++++++++++++++++++++++-----------
 drivers/scsi/aacraid/aacraid.h |    2 +-
 2 files changed, 69 insertions(+), 28 deletions(-)

diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index d79457a..0371f80 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -132,11 +132,13 @@ struct inquiry_data {
  *              M O D U L E   G L O B A L S
  */
 
-static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* sgmap);
-static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg);
-static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg);
-static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max);
-static int aac_convert_sgraw2(struct aac_raw_io2 *rio2, int pages, int nseg, int nseg_new);
+static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *sgmap);
+static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg);
+static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg);
+static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
+				struct aac_raw_io2 *rio2, int sg_max);
+static int aac_convert_sgraw2(struct aac_raw_io2 *rio2,
+				int pages, int nseg, int nseg_new);
 static int aac_send_srb_fib(struct scsi_cmnd* scsicmd);
 #ifdef AAC_DETAILED_STATUS_INFO
 static char *aac_get_status_string(u32 status);
@@ -971,6 +973,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 {
 	struct aac_dev *dev = fib->dev;
 	u16 fibsize, command;
+	long ret;
 
 	aac_fib_init(fib);
 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
@@ -982,7 +985,10 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 		readcmd2->byteCount = cpu_to_le32(count<<9);
 		readcmd2->cid = cpu_to_le16(scmd_id(cmd));
 		readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
-		aac_build_sgraw2(cmd, readcmd2, dev->scsi_host_ptr->sg_tablesize);
+		ret = aac_build_sgraw2(cmd, readcmd2,
+				dev->scsi_host_ptr->sg_tablesize);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo2;
 		fibsize = sizeof(struct aac_raw_io2) +
 			((le32_to_cpu(readcmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
@@ -996,7 +1002,9 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 		readcmd->flags = cpu_to_le16(RIO_TYPE_READ);
 		readcmd->bpTotal = 0;
 		readcmd->bpComplete = 0;
-		aac_build_sgraw(cmd, &readcmd->sg);
+		ret = aac_build_sgraw(cmd, &readcmd->sg);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo;
 		fibsize = sizeof(struct aac_raw_io) +
 			((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw));
@@ -1019,6 +1027,8 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 {
 	u16 fibsize;
 	struct aac_read64 *readcmd;
+	long ret;
+
 	aac_fib_init(fib);
 	readcmd = (struct aac_read64 *) fib_data(fib);
 	readcmd->command = cpu_to_le32(VM_CtHostRead64);
@@ -1028,7 +1038,9 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 	readcmd->pad   = 0;
 	readcmd->flags = 0;
 
-	aac_build_sg64(cmd, &readcmd->sg);
+	ret = aac_build_sg64(cmd, &readcmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_read64) +
 		((le32_to_cpu(readcmd->sg.count) - 1) *
 		 sizeof (struct sgentry64));
@@ -1050,6 +1062,8 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
 {
 	u16 fibsize;
 	struct aac_read *readcmd;
+	long ret;
+
 	aac_fib_init(fib);
 	readcmd = (struct aac_read *) fib_data(fib);
 	readcmd->command = cpu_to_le32(VM_CtBlockRead);
@@ -1057,7 +1071,9 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
 	readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 	readcmd->count = cpu_to_le32(count * 512);
 
-	aac_build_sg(cmd, &readcmd->sg);
+	ret = aac_build_sg(cmd, &readcmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_read) +
 			((le32_to_cpu(readcmd->sg.count) - 1) *
 			 sizeof (struct sgentry));
@@ -1079,6 +1095,7 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 {
 	struct aac_dev *dev = fib->dev;
 	u16 fibsize, command;
+	long ret;
 
 	aac_fib_init(fib);
 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
@@ -1093,7 +1110,10 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 						   (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
 			cpu_to_le16(RIO2_IO_TYPE_WRITE|RIO2_IO_SUREWRITE) :
 			cpu_to_le16(RIO2_IO_TYPE_WRITE);
-		aac_build_sgraw2(cmd, writecmd2, dev->scsi_host_ptr->sg_tablesize);
+		ret = aac_build_sgraw2(cmd, writecmd2,
+				dev->scsi_host_ptr->sg_tablesize);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo2;
 		fibsize = sizeof(struct aac_raw_io2) +
 			((le32_to_cpu(writecmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
@@ -1110,7 +1130,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 			cpu_to_le16(RIO_TYPE_WRITE);
 		writecmd->bpTotal = 0;
 		writecmd->bpComplete = 0;
-		aac_build_sgraw(cmd, &writecmd->sg);
+		ret = aac_build_sgraw(cmd, &writecmd->sg);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo;
 		fibsize = sizeof(struct aac_raw_io) +
 			((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw));
@@ -1133,6 +1155,8 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
 {
 	u16 fibsize;
 	struct aac_write64 *writecmd;
+	long ret;
+
 	aac_fib_init(fib);
 	writecmd = (struct aac_write64 *) fib_data(fib);
 	writecmd->command = cpu_to_le32(VM_CtHostWrite64);
@@ -1142,7 +1166,9 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
 	writecmd->pad	= 0;
 	writecmd->flags	= 0;
 
-	aac_build_sg64(cmd, &writecmd->sg);
+	ret = aac_build_sg64(cmd, &writecmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_write64) +
 		((le32_to_cpu(writecmd->sg.count) - 1) *
 		 sizeof (struct sgentry64));
@@ -1164,6 +1190,8 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 {
 	u16 fibsize;
 	struct aac_write *writecmd;
+	long ret;
+
 	aac_fib_init(fib);
 	writecmd = (struct aac_write *) fib_data(fib);
 	writecmd->command = cpu_to_le32(VM_CtBlockWrite);
@@ -1173,7 +1201,9 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 	writecmd->sg.count = cpu_to_le32(1);
 	/* ->stable is not used - it did mean which type of write */
 
-	aac_build_sg(cmd, &writecmd->sg);
+	ret = aac_build_sg(cmd, &writecmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_write) +
 		((le32_to_cpu(writecmd->sg.count) - 1) *
 		 sizeof (struct sgentry));
@@ -1235,8 +1265,11 @@ static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
 {
 	u16 fibsize;
 	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+	long ret;
 
-	aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
+	ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg);
+	if (ret < 0)
+		return ret;
 	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
 	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
@@ -1263,8 +1296,11 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
 {
 	u16 fibsize;
 	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+	long ret;
 
-	aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
+	ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg);
+	if (ret < 0)
+		return ret;
 	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
 	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
@@ -2870,10 +2906,10 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
 	return -1;
 }
 
-static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
+static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *psg)
 {
 	struct aac_dev *dev;
-	unsigned long byte_count = 0;
+	long byte_count = 0;
 	int nseg;
 
 	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
@@ -2883,7 +2919,8 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
 	psg->sg[0].count = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -2912,10 +2949,10 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
 }
 
 
-static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg)
+static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg)
 {
 	struct aac_dev *dev;
-	unsigned long byte_count = 0;
+	long byte_count = 0;
 	u64 addr;
 	int nseg;
 
@@ -2927,7 +2964,8 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
 	psg->sg[0].count = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -2957,9 +2995,9 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
 	return byte_count;
 }
 
-static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg)
+static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg)
 {
-	unsigned long byte_count = 0;
+	long byte_count = 0;
 	int nseg;
 
 	// Get rid of old data
@@ -2972,7 +3010,8 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
 	psg->sg[0].flags = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -3005,13 +3044,15 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
 	return byte_count;
 }
 
-static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max)
+static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
+				struct aac_raw_io2 *rio2, int sg_max)
 {
-	unsigned long byte_count = 0;
+	long byte_count = 0;
 	int nseg;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i, conformable = 0;
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 9e933a8..742f5d7 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -12,7 +12,7 @@
  *----------------------------------------------------------------------------*/
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 29800
+# define AAC_DRIVER_BUILD 29801
 # define AAC_DRIVER_BRANCH "-ms"
 #endif
 #define MAXIMUM_NUM_CONTAINERS	32
-- 
1.7.7.6


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

* [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
@ 2012-10-17 16:15 Mahesh Rajashekhara
  2012-10-17 11:16 ` Tomas Henzl
  0 siblings, 1 reply; 11+ messages in thread
From: Mahesh Rajashekhara @ 2012-10-17 16:15 UTC (permalink / raw)
  To: thenzl, JBottomley, linux-scsi
  Cc: aacraid, Achim_Leubner, Tony_Ruiz, Mahesh_Rajashekhara

From: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>

Hi Tomas,

Thanks for the correction.

I have changed 'ret' is of type 'long' now.

Signed-off-by: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
---
 drivers/scsi/aacraid/aachba.c  |   87 +++++++++++++++++++++++++++++----------
 drivers/scsi/aacraid/aacraid.h |    2 +-
 2 files changed, 65 insertions(+), 24 deletions(-)

diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
index d79457a..681434e 100644
--- a/drivers/scsi/aacraid/aachba.c
+++ b/drivers/scsi/aacraid/aachba.c
@@ -132,11 +132,13 @@ struct inquiry_data {
  *              M O D U L E   G L O B A L S
  */
 
-static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* sgmap);
-static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg);
-static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg);
-static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max);
-static int aac_convert_sgraw2(struct aac_raw_io2 *rio2, int pages, int nseg, int nseg_new);
+static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *sgmap);
+static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg);
+static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg);
+static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
+				struct aac_raw_io2 *rio2, int sg_max);
+static int aac_convert_sgraw2(struct aac_raw_io2 *rio2,
+				int pages, int nseg, int nseg_new);
 static int aac_send_srb_fib(struct scsi_cmnd* scsicmd);
 #ifdef AAC_DETAILED_STATUS_INFO
 static char *aac_get_status_string(u32 status);
@@ -971,6 +973,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 {
 	struct aac_dev *dev = fib->dev;
 	u16 fibsize, command;
+	long ret;
 
 	aac_fib_init(fib);
 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
@@ -982,7 +985,10 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 		readcmd2->byteCount = cpu_to_le32(count<<9);
 		readcmd2->cid = cpu_to_le16(scmd_id(cmd));
 		readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
-		aac_build_sgraw2(cmd, readcmd2, dev->scsi_host_ptr->sg_tablesize);
+		ret = aac_build_sgraw2(cmd, readcmd2,
+				dev->scsi_host_ptr->sg_tablesize);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo2;
 		fibsize = sizeof(struct aac_raw_io2) +
 			((le32_to_cpu(readcmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
@@ -996,7 +1002,9 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 		readcmd->flags = cpu_to_le16(RIO_TYPE_READ);
 		readcmd->bpTotal = 0;
 		readcmd->bpComplete = 0;
-		aac_build_sgraw(cmd, &readcmd->sg);
+		ret = aac_build_sgraw(cmd, &readcmd->sg);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo;
 		fibsize = sizeof(struct aac_raw_io) +
 			((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw));
@@ -1019,6 +1027,8 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 {
 	u16 fibsize;
 	struct aac_read64 *readcmd;
+	long ret;
+
 	aac_fib_init(fib);
 	readcmd = (struct aac_read64 *) fib_data(fib);
 	readcmd->command = cpu_to_le32(VM_CtHostRead64);
@@ -1028,7 +1038,9 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 	readcmd->pad   = 0;
 	readcmd->flags = 0;
 
-	aac_build_sg64(cmd, &readcmd->sg);
+	ret = aac_build_sg64(cmd, &readcmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_read64) +
 		((le32_to_cpu(readcmd->sg.count) - 1) *
 		 sizeof (struct sgentry64));
@@ -1050,6 +1062,8 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
 {
 	u16 fibsize;
 	struct aac_read *readcmd;
+	long ret;
+
 	aac_fib_init(fib);
 	readcmd = (struct aac_read *) fib_data(fib);
 	readcmd->command = cpu_to_le32(VM_CtBlockRead);
@@ -1057,7 +1071,9 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
 	readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
 	readcmd->count = cpu_to_le32(count * 512);
 
-	aac_build_sg(cmd, &readcmd->sg);
+	ret = aac_build_sg(cmd, &readcmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_read) +
 			((le32_to_cpu(readcmd->sg.count) - 1) *
 			 sizeof (struct sgentry));
@@ -1079,6 +1095,7 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 {
 	struct aac_dev *dev = fib->dev;
 	u16 fibsize, command;
+	long ret;
 
 	aac_fib_init(fib);
 	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
@@ -1093,7 +1110,10 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 						   (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
 			cpu_to_le16(RIO2_IO_TYPE_WRITE|RIO2_IO_SUREWRITE) :
 			cpu_to_le16(RIO2_IO_TYPE_WRITE);
-		aac_build_sgraw2(cmd, writecmd2, dev->scsi_host_ptr->sg_tablesize);
+		ret = aac_build_sgraw2(cmd, writecmd2,
+				dev->scsi_host_ptr->sg_tablesize);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo2;
 		fibsize = sizeof(struct aac_raw_io2) +
 			((le32_to_cpu(writecmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
@@ -1110,7 +1130,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
 			cpu_to_le16(RIO_TYPE_WRITE);
 		writecmd->bpTotal = 0;
 		writecmd->bpComplete = 0;
-		aac_build_sgraw(cmd, &writecmd->sg);
+		ret = aac_build_sgraw(cmd, &writecmd->sg);
+		if (ret < 0)
+			return ret;
 		command = ContainerRawIo;
 		fibsize = sizeof(struct aac_raw_io) +
 			((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw));
@@ -1133,6 +1155,8 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
 {
 	u16 fibsize;
 	struct aac_write64 *writecmd;
+	long ret;
+
 	aac_fib_init(fib);
 	writecmd = (struct aac_write64 *) fib_data(fib);
 	writecmd->command = cpu_to_le32(VM_CtHostWrite64);
@@ -1142,7 +1166,9 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
 	writecmd->pad	= 0;
 	writecmd->flags	= 0;
 
-	aac_build_sg64(cmd, &writecmd->sg);
+	ret = aac_build_sg64(cmd, &writecmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_write64) +
 		((le32_to_cpu(writecmd->sg.count) - 1) *
 		 sizeof (struct sgentry64));
@@ -1164,6 +1190,8 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 {
 	u16 fibsize;
 	struct aac_write *writecmd;
+	long ret;
+
 	aac_fib_init(fib);
 	writecmd = (struct aac_write *) fib_data(fib);
 	writecmd->command = cpu_to_le32(VM_CtBlockWrite);
@@ -1173,7 +1201,9 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
 	writecmd->sg.count = cpu_to_le32(1);
 	/* ->stable is not used - it did mean which type of write */
 
-	aac_build_sg(cmd, &writecmd->sg);
+	ret = aac_build_sg(cmd, &writecmd->sg);
+	if (ret < 0)
+		return ret;
 	fibsize = sizeof(struct aac_write) +
 		((le32_to_cpu(writecmd->sg.count) - 1) *
 		 sizeof (struct sgentry));
@@ -1235,8 +1265,11 @@ static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
 {
 	u16 fibsize;
 	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+	long ret;
 
-	aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
+	ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg);
+	if (ret < 0)
+		return ret;
 	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
 	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
@@ -1263,8 +1296,11 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
 {
 	u16 fibsize;
 	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
+	long ret;
 
-	aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
+	ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg);
+	if (ret < 0)
+		return ret;
 	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
 
 	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
@@ -2870,7 +2906,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
 	return -1;
 }
 
-static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
+static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *psg)
 {
 	struct aac_dev *dev;
 	unsigned long byte_count = 0;
@@ -2883,7 +2919,8 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
 	psg->sg[0].count = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -2912,7 +2949,7 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
 }
 
 
-static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg)
+static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg)
 {
 	struct aac_dev *dev;
 	unsigned long byte_count = 0;
@@ -2927,7 +2964,8 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
 	psg->sg[0].count = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -2957,7 +2995,7 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
 	return byte_count;
 }
 
-static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg)
+static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg)
 {
 	unsigned long byte_count = 0;
 	int nseg;
@@ -2972,7 +3010,8 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
 	psg->sg[0].flags = 0;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i;
@@ -3005,13 +3044,15 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
 	return byte_count;
 }
 
-static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max)
+static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
+				struct aac_raw_io2 *rio2, int sg_max)
 {
 	unsigned long byte_count = 0;
 	int nseg;
 
 	nseg = scsi_dma_map(scsicmd);
-	BUG_ON(nseg < 0);
+	if (nseg < 0)
+		return nseg;
 	if (nseg) {
 		struct scatterlist *sg;
 		int i, conformable = 0;
diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
index 9e933a8..742f5d7 100644
--- a/drivers/scsi/aacraid/aacraid.h
+++ b/drivers/scsi/aacraid/aacraid.h
@@ -12,7 +12,7 @@
  *----------------------------------------------------------------------------*/
 
 #ifndef AAC_DRIVER_BUILD
-# define AAC_DRIVER_BUILD 29800
+# define AAC_DRIVER_BUILD 29801
 # define AAC_DRIVER_BRANCH "-ms"
 #endif
 #define MAXIMUM_NUM_CONTAINERS	32
-- 
1.7.7.6


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

* Re: [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
  2012-10-17 17:54 Mahesh Rajashekhara
@ 2012-10-17 15:23 ` Tomas Henzl
  0 siblings, 0 replies; 11+ messages in thread
From: Tomas Henzl @ 2012-10-17 15:23 UTC (permalink / raw)
  To: Mahesh Rajashekhara
  Cc: JBottomley, linux-scsi, aacraid, Achim_Leubner, Tony_Ruiz

On 10/17/2012 07:54 PM, Mahesh Rajashekhara wrote:
> I have changed all aac_build_... function prototypes  as of type 'long' and they return 'byte_count' is of type 'long'.

The code changed, it returns 'nseg' in case of an error, so the change from unsigned to signed for byte_count
was likely not needed. I'm sorry, I haven't noticed that sooner. The change of the function prototypes
is welcomed.
Maybe you could reconsider reusing the patch description you used in the V1 of your patch.
"This patch handles SCSI dma mapping failure case. Reporting error code to the upper layer instead of BUG_ON()."
instead of what is in the message body now. Maybe James can handle this without reposting a new patch.
Thanks Tomas

>
> Signed-off-by: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
> ---
>  drivers/scsi/aacraid/aachba.c  |   95 ++++++++++++++++++++++++++++-----------
>  drivers/scsi/aacraid/aacraid.h |    2 +-
>  2 files changed, 69 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
> index d79457a..0371f80 100644
> --- a/drivers/scsi/aacraid/aachba.c
> +++ b/drivers/scsi/aacraid/aachba.c
> @@ -132,11 +132,13 @@ struct inquiry_data {
>   *              M O D U L E   G L O B A L S
>   */
>  
> -static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* sgmap);
> -static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg);
> -static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg);
> -static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max);
> -static int aac_convert_sgraw2(struct aac_raw_io2 *rio2, int pages, int nseg, int nseg_new);
> +static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *sgmap);
> +static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg);
> +static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg);
> +static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
> +				struct aac_raw_io2 *rio2, int sg_max);
> +static int aac_convert_sgraw2(struct aac_raw_io2 *rio2,
> +				int pages, int nseg, int nseg_new);
>  static int aac_send_srb_fib(struct scsi_cmnd* scsicmd);
>  #ifdef AAC_DETAILED_STATUS_INFO
>  static char *aac_get_status_string(u32 status);
> @@ -971,6 +973,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  {
>  	struct aac_dev *dev = fib->dev;
>  	u16 fibsize, command;
> +	long ret;
>  
>  	aac_fib_init(fib);
>  	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
> @@ -982,7 +985,10 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  		readcmd2->byteCount = cpu_to_le32(count<<9);
>  		readcmd2->cid = cpu_to_le16(scmd_id(cmd));
>  		readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
> -		aac_build_sgraw2(cmd, readcmd2, dev->scsi_host_ptr->sg_tablesize);
> +		ret = aac_build_sgraw2(cmd, readcmd2,
> +				dev->scsi_host_ptr->sg_tablesize);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo2;
>  		fibsize = sizeof(struct aac_raw_io2) +
>  			((le32_to_cpu(readcmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
> @@ -996,7 +1002,9 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  		readcmd->flags = cpu_to_le16(RIO_TYPE_READ);
>  		readcmd->bpTotal = 0;
>  		readcmd->bpComplete = 0;
> -		aac_build_sgraw(cmd, &readcmd->sg);
> +		ret = aac_build_sgraw(cmd, &readcmd->sg);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo;
>  		fibsize = sizeof(struct aac_raw_io) +
>  			((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw));
> @@ -1019,6 +1027,8 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  {
>  	u16 fibsize;
>  	struct aac_read64 *readcmd;
> +	long ret;
> +
>  	aac_fib_init(fib);
>  	readcmd = (struct aac_read64 *) fib_data(fib);
>  	readcmd->command = cpu_to_le32(VM_CtHostRead64);
> @@ -1028,7 +1038,9 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  	readcmd->pad   = 0;
>  	readcmd->flags = 0;
>  
> -	aac_build_sg64(cmd, &readcmd->sg);
> +	ret = aac_build_sg64(cmd, &readcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_read64) +
>  		((le32_to_cpu(readcmd->sg.count) - 1) *
>  		 sizeof (struct sgentry64));
> @@ -1050,6 +1062,8 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
>  {
>  	u16 fibsize;
>  	struct aac_read *readcmd;
> +	long ret;
> +
>  	aac_fib_init(fib);
>  	readcmd = (struct aac_read *) fib_data(fib);
>  	readcmd->command = cpu_to_le32(VM_CtBlockRead);
> @@ -1057,7 +1071,9 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
>  	readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
>  	readcmd->count = cpu_to_le32(count * 512);
>  
> -	aac_build_sg(cmd, &readcmd->sg);
> +	ret = aac_build_sg(cmd, &readcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_read) +
>  			((le32_to_cpu(readcmd->sg.count) - 1) *
>  			 sizeof (struct sgentry));
> @@ -1079,6 +1095,7 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  {
>  	struct aac_dev *dev = fib->dev;
>  	u16 fibsize, command;
> +	long ret;
>  
>  	aac_fib_init(fib);
>  	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
> @@ -1093,7 +1110,10 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  						   (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
>  			cpu_to_le16(RIO2_IO_TYPE_WRITE|RIO2_IO_SUREWRITE) :
>  			cpu_to_le16(RIO2_IO_TYPE_WRITE);
> -		aac_build_sgraw2(cmd, writecmd2, dev->scsi_host_ptr->sg_tablesize);
> +		ret = aac_build_sgraw2(cmd, writecmd2,
> +				dev->scsi_host_ptr->sg_tablesize);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo2;
>  		fibsize = sizeof(struct aac_raw_io2) +
>  			((le32_to_cpu(writecmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
> @@ -1110,7 +1130,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  			cpu_to_le16(RIO_TYPE_WRITE);
>  		writecmd->bpTotal = 0;
>  		writecmd->bpComplete = 0;
> -		aac_build_sgraw(cmd, &writecmd->sg);
> +		ret = aac_build_sgraw(cmd, &writecmd->sg);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo;
>  		fibsize = sizeof(struct aac_raw_io) +
>  			((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw));
> @@ -1133,6 +1155,8 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
>  {
>  	u16 fibsize;
>  	struct aac_write64 *writecmd;
> +	long ret;
> +
>  	aac_fib_init(fib);
>  	writecmd = (struct aac_write64 *) fib_data(fib);
>  	writecmd->command = cpu_to_le32(VM_CtHostWrite64);
> @@ -1142,7 +1166,9 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
>  	writecmd->pad	= 0;
>  	writecmd->flags	= 0;
>  
> -	aac_build_sg64(cmd, &writecmd->sg);
> +	ret = aac_build_sg64(cmd, &writecmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_write64) +
>  		((le32_to_cpu(writecmd->sg.count) - 1) *
>  		 sizeof (struct sgentry64));
> @@ -1164,6 +1190,8 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  {
>  	u16 fibsize;
>  	struct aac_write *writecmd;
> +	long ret;
> +
>  	aac_fib_init(fib);
>  	writecmd = (struct aac_write *) fib_data(fib);
>  	writecmd->command = cpu_to_le32(VM_CtBlockWrite);
> @@ -1173,7 +1201,9 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  	writecmd->sg.count = cpu_to_le32(1);
>  	/* ->stable is not used - it did mean which type of write */
>  
> -	aac_build_sg(cmd, &writecmd->sg);
> +	ret = aac_build_sg(cmd, &writecmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_write) +
>  		((le32_to_cpu(writecmd->sg.count) - 1) *
>  		 sizeof (struct sgentry));
> @@ -1235,8 +1265,11 @@ static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
>  {
>  	u16 fibsize;
>  	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
> +	long ret;
>  
> -	aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
> +	ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
>  
>  	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
> @@ -1263,8 +1296,11 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
>  {
>  	u16 fibsize;
>  	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
> +	long ret;
>  
> -	aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
> +	ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
>  
>  	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
> @@ -2870,10 +2906,10 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
>  	return -1;
>  }
>  
> -static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
> +static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *psg)
>  {
>  	struct aac_dev *dev;
> -	unsigned long byte_count = 0;
> +	long byte_count = 0;
>  	int nseg;
>  
>  	dev = (struct aac_dev *)scsicmd->device->host->hostdata;
> @@ -2883,7 +2919,8 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
>  	psg->sg[0].count = 0;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i;
> @@ -2912,10 +2949,10 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
>  }
>  
>  
> -static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg)
> +static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg)
>  {
>  	struct aac_dev *dev;
> -	unsigned long byte_count = 0;
> +	long byte_count = 0;
>  	u64 addr;
>  	int nseg;
>  
> @@ -2927,7 +2964,8 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
>  	psg->sg[0].count = 0;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i;
> @@ -2957,9 +2995,9 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
>  	return byte_count;
>  }
>  
> -static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg)
> +static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg)
>  {
> -	unsigned long byte_count = 0;
> +	long byte_count = 0;
>  	int nseg;
>  
>  	// Get rid of old data
> @@ -2972,7 +3010,8 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
>  	psg->sg[0].flags = 0;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i;
> @@ -3005,13 +3044,15 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
>  	return byte_count;
>  }
>  
> -static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max)
> +static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
> +				struct aac_raw_io2 *rio2, int sg_max)
>  {
> -	unsigned long byte_count = 0;
> +	long byte_count = 0;
>  	int nseg;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i, conformable = 0;
> diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
> index 9e933a8..742f5d7 100644
> --- a/drivers/scsi/aacraid/aacraid.h
> +++ b/drivers/scsi/aacraid/aacraid.h
> @@ -12,7 +12,7 @@
>   *----------------------------------------------------------------------------*/
>  
>  #ifndef AAC_DRIVER_BUILD
> -# define AAC_DRIVER_BUILD 29800
> +# define AAC_DRIVER_BUILD 29801
>  # define AAC_DRIVER_BRANCH "-ms"
>  #endif
>  #define MAXIMUM_NUM_CONTAINERS	32


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

* Re: [PATCH 1/1] aacraid: SCSI dma mapping failure case handling
  2012-10-17 16:15 Mahesh Rajashekhara
@ 2012-10-17 11:16 ` Tomas Henzl
  0 siblings, 0 replies; 11+ messages in thread
From: Tomas Henzl @ 2012-10-17 11:16 UTC (permalink / raw)
  To: Mahesh Rajashekhara
  Cc: JBottomley, linux-scsi, aacraid, Achim_Leubner, Tony_Ruiz

On 10/17/2012 06:15 PM, Mahesh Rajashekhara wrote:
> From: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
>
> Hi Tomas,
>
> Thanks for the correction.
>
> I have changed 'ret' is of type 'long' now.

I think that more than that is needed, all the aac_build_...
functions prototypes are declared as of type 'unsigned long'
and they return 'byte_count' which again is 'unsigned'.

>
> Signed-off-by: Mahesh Rajashekhara <Mahesh_Rajashekhara@pmc-sierra.com>
> ---
>  drivers/scsi/aacraid/aachba.c  |   87 +++++++++++++++++++++++++++++----------
>  drivers/scsi/aacraid/aacraid.h |    2 +-
>  2 files changed, 65 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
> index d79457a..681434e 100644
> --- a/drivers/scsi/aacraid/aachba.c
> +++ b/drivers/scsi/aacraid/aachba.c
> @@ -132,11 +132,13 @@ struct inquiry_data {
>   *              M O D U L E   G L O B A L S
>   */
>  
> -static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* sgmap);
> -static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg);
> -static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg);
> -static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max);
> -static int aac_convert_sgraw2(struct aac_raw_io2 *rio2, int pages, int nseg, int nseg_new);
> +static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *sgmap);
> +static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg);
> +static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg);
> +static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
> +				struct aac_raw_io2 *rio2, int sg_max);
> +static int aac_convert_sgraw2(struct aac_raw_io2 *rio2,
> +				int pages, int nseg, int nseg_new);
>  static int aac_send_srb_fib(struct scsi_cmnd* scsicmd);
>  #ifdef AAC_DETAILED_STATUS_INFO
>  static char *aac_get_status_string(u32 status);
> @@ -971,6 +973,7 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  {
>  	struct aac_dev *dev = fib->dev;
>  	u16 fibsize, command;
> +	long ret;
>  
>  	aac_fib_init(fib);
>  	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
> @@ -982,7 +985,10 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  		readcmd2->byteCount = cpu_to_le32(count<<9);
>  		readcmd2->cid = cpu_to_le16(scmd_id(cmd));
>  		readcmd2->flags = cpu_to_le16(RIO2_IO_TYPE_READ);
> -		aac_build_sgraw2(cmd, readcmd2, dev->scsi_host_ptr->sg_tablesize);
> +		ret = aac_build_sgraw2(cmd, readcmd2,
> +				dev->scsi_host_ptr->sg_tablesize);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo2;
>  		fibsize = sizeof(struct aac_raw_io2) +
>  			((le32_to_cpu(readcmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
> @@ -996,7 +1002,9 @@ static int aac_read_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  		readcmd->flags = cpu_to_le16(RIO_TYPE_READ);
>  		readcmd->bpTotal = 0;
>  		readcmd->bpComplete = 0;
> -		aac_build_sgraw(cmd, &readcmd->sg);
> +		ret = aac_build_sgraw(cmd, &readcmd->sg);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo;
>  		fibsize = sizeof(struct aac_raw_io) +
>  			((le32_to_cpu(readcmd->sg.count)-1) * sizeof(struct sgentryraw));
> @@ -1019,6 +1027,8 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  {
>  	u16 fibsize;
>  	struct aac_read64 *readcmd;
> +	long ret;
> +
>  	aac_fib_init(fib);
>  	readcmd = (struct aac_read64 *) fib_data(fib);
>  	readcmd->command = cpu_to_le32(VM_CtHostRead64);
> @@ -1028,7 +1038,9 @@ static int aac_read_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  	readcmd->pad   = 0;
>  	readcmd->flags = 0;
>  
> -	aac_build_sg64(cmd, &readcmd->sg);
> +	ret = aac_build_sg64(cmd, &readcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_read64) +
>  		((le32_to_cpu(readcmd->sg.count) - 1) *
>  		 sizeof (struct sgentry64));
> @@ -1050,6 +1062,8 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
>  {
>  	u16 fibsize;
>  	struct aac_read *readcmd;
> +	long ret;
> +
>  	aac_fib_init(fib);
>  	readcmd = (struct aac_read *) fib_data(fib);
>  	readcmd->command = cpu_to_le32(VM_CtBlockRead);
> @@ -1057,7 +1071,9 @@ static int aac_read_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u32
>  	readcmd->block = cpu_to_le32((u32)(lba&0xffffffff));
>  	readcmd->count = cpu_to_le32(count * 512);
>  
> -	aac_build_sg(cmd, &readcmd->sg);
> +	ret = aac_build_sg(cmd, &readcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_read) +
>  			((le32_to_cpu(readcmd->sg.count) - 1) *
>  			 sizeof (struct sgentry));
> @@ -1079,6 +1095,7 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  {
>  	struct aac_dev *dev = fib->dev;
>  	u16 fibsize, command;
> +	long ret;
>  
>  	aac_fib_init(fib);
>  	if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2 && !dev->sync_mode) {
> @@ -1093,7 +1110,10 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  						   (((aac_cache & 5) != 5) || !fib->dev->cache_protected)) ?
>  			cpu_to_le16(RIO2_IO_TYPE_WRITE|RIO2_IO_SUREWRITE) :
>  			cpu_to_le16(RIO2_IO_TYPE_WRITE);
> -		aac_build_sgraw2(cmd, writecmd2, dev->scsi_host_ptr->sg_tablesize);
> +		ret = aac_build_sgraw2(cmd, writecmd2,
> +				dev->scsi_host_ptr->sg_tablesize);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo2;
>  		fibsize = sizeof(struct aac_raw_io2) +
>  			((le32_to_cpu(writecmd2->sgeCnt)-1) * sizeof(struct sge_ieee1212));
> @@ -1110,7 +1130,9 @@ static int aac_write_raw_io(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u
>  			cpu_to_le16(RIO_TYPE_WRITE);
>  		writecmd->bpTotal = 0;
>  		writecmd->bpComplete = 0;
> -		aac_build_sgraw(cmd, &writecmd->sg);
> +		ret = aac_build_sgraw(cmd, &writecmd->sg);
> +		if (ret < 0)
> +			return ret;
>  		command = ContainerRawIo;
>  		fibsize = sizeof(struct aac_raw_io) +
>  			((le32_to_cpu(writecmd->sg.count)-1) * sizeof (struct sgentryraw));
> @@ -1133,6 +1155,8 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
>  {
>  	u16 fibsize;
>  	struct aac_write64 *writecmd;
> +	long ret;
> +
>  	aac_fib_init(fib);
>  	writecmd = (struct aac_write64 *) fib_data(fib);
>  	writecmd->command = cpu_to_le32(VM_CtHostWrite64);
> @@ -1142,7 +1166,9 @@ static int aac_write_block64(struct fib * fib, struct scsi_cmnd * cmd, u64 lba,
>  	writecmd->pad	= 0;
>  	writecmd->flags	= 0;
>  
> -	aac_build_sg64(cmd, &writecmd->sg);
> +	ret = aac_build_sg64(cmd, &writecmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_write64) +
>  		((le32_to_cpu(writecmd->sg.count) - 1) *
>  		 sizeof (struct sgentry64));
> @@ -1164,6 +1190,8 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  {
>  	u16 fibsize;
>  	struct aac_write *writecmd;
> +	long ret;
> +
>  	aac_fib_init(fib);
>  	writecmd = (struct aac_write *) fib_data(fib);
>  	writecmd->command = cpu_to_le32(VM_CtBlockWrite);
> @@ -1173,7 +1201,9 @@ static int aac_write_block(struct fib * fib, struct scsi_cmnd * cmd, u64 lba, u3
>  	writecmd->sg.count = cpu_to_le32(1);
>  	/* ->stable is not used - it did mean which type of write */
>  
> -	aac_build_sg(cmd, &writecmd->sg);
> +	ret = aac_build_sg(cmd, &writecmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	fibsize = sizeof(struct aac_write) +
>  		((le32_to_cpu(writecmd->sg.count) - 1) *
>  		 sizeof (struct sgentry));
> @@ -1235,8 +1265,11 @@ static int aac_scsi_64(struct fib * fib, struct scsi_cmnd * cmd)
>  {
>  	u16 fibsize;
>  	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
> +	long ret;
>  
> -	aac_build_sg64(cmd, (struct sgmap64*) &srbcmd->sg);
> +	ret = aac_build_sg64(cmd, (struct sgmap64 *) &srbcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
>  
>  	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
> @@ -1263,8 +1296,11 @@ static int aac_scsi_32(struct fib * fib, struct scsi_cmnd * cmd)
>  {
>  	u16 fibsize;
>  	struct aac_srb * srbcmd = aac_scsi_common(fib, cmd);
> +	long ret;
>  
> -	aac_build_sg(cmd, (struct sgmap*)&srbcmd->sg);
> +	ret = aac_build_sg(cmd, (struct sgmap *)&srbcmd->sg);
> +	if (ret < 0)
> +		return ret;
>  	srbcmd->count = cpu_to_le32(scsi_bufflen(cmd));
>  
>  	memset(srbcmd->cdb, 0, sizeof(srbcmd->cdb));
> @@ -2870,7 +2906,7 @@ static int aac_send_srb_fib(struct scsi_cmnd* scsicmd)
>  	return -1;
>  }
>  
> -static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
> +static long aac_build_sg(struct scsi_cmnd *scsicmd, struct sgmap *psg)
>  {
>  	struct aac_dev *dev;
>  	unsigned long byte_count = 0;
> @@ -2883,7 +2919,8 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
>  	psg->sg[0].count = 0;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i;
> @@ -2912,7 +2949,7 @@ static unsigned long aac_build_sg(struct scsi_cmnd* scsicmd, struct sgmap* psg)
>  }
>  
>  
> -static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* psg)
> +static long aac_build_sg64(struct scsi_cmnd *scsicmd, struct sgmap64 *psg)
>  {
>  	struct aac_dev *dev;
>  	unsigned long byte_count = 0;
> @@ -2927,7 +2964,8 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
>  	psg->sg[0].count = 0;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i;
> @@ -2957,7 +2995,7 @@ static unsigned long aac_build_sg64(struct scsi_cmnd* scsicmd, struct sgmap64* p
>  	return byte_count;
>  }
>  
> -static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw* psg)
> +static long aac_build_sgraw(struct scsi_cmnd *scsicmd, struct sgmapraw *psg)
>  {
>  	unsigned long byte_count = 0;
>  	int nseg;
> @@ -2972,7 +3010,8 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
>  	psg->sg[0].flags = 0;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i;
> @@ -3005,13 +3044,15 @@ static unsigned long aac_build_sgraw(struct scsi_cmnd* scsicmd, struct sgmapraw*
>  	return byte_count;
>  }
>  
> -static unsigned long aac_build_sgraw2(struct scsi_cmnd *scsicmd, struct aac_raw_io2 *rio2, int sg_max)
> +static long aac_build_sgraw2(struct scsi_cmnd *scsicmd,
> +				struct aac_raw_io2 *rio2, int sg_max)
>  {
>  	unsigned long byte_count = 0;
>  	int nseg;
>  
>  	nseg = scsi_dma_map(scsicmd);
> -	BUG_ON(nseg < 0);
> +	if (nseg < 0)
> +		return nseg;
>  	if (nseg) {
>  		struct scatterlist *sg;
>  		int i, conformable = 0;
> diff --git a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
> index 9e933a8..742f5d7 100644
> --- a/drivers/scsi/aacraid/aacraid.h
> +++ b/drivers/scsi/aacraid/aacraid.h
> @@ -12,7 +12,7 @@
>   *----------------------------------------------------------------------------*/
>  
>  #ifndef AAC_DRIVER_BUILD
> -# define AAC_DRIVER_BUILD 29800
> +# define AAC_DRIVER_BUILD 29801
>  # define AAC_DRIVER_BRANCH "-ms"
>  #endif
>  #define MAXIMUM_NUM_CONTAINERS	32


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

end of thread, other threads:[~2012-11-14  9:58 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-16 20:59 [PATCH 1/1] aacraid: SCSI dma mapping failure case handling Mahesh Rajashekhara
2012-10-16 21:34 ` Tomas Henzl
2012-11-14  7:03   ` James Bottomley
2012-11-14  9:58     ` Mahesh Rajashekhara
2012-10-17 16:15 Mahesh Rajashekhara
2012-10-17 11:16 ` Tomas Henzl
2012-10-17 17:54 Mahesh Rajashekhara
2012-10-17 15:23 ` Tomas Henzl
2012-10-19 13:51 Mahesh Rajashekhara
2012-10-19 14:30 ` Tomas Henzl
2012-11-01 14:57   ` Mahesh Rajashekhara

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.