Re: [PATCH v2] scsi: sg: don't return bogus Sg_requests

2017-05-11 Thread Martin K. Petersen

Johannes,

> If the list search in sg_get_rq_mark() fails to find a valid request,
> we return a bogus element. This then can later lead to a GPF in
> sg_remove_scat().
>
> So don't return bogus Sg_requests in sg_get_rq_mark() but NULL in case
> the list search doesn't find a valid request.

Applied to 4.12/scsi-fixes, thanks!

-- 
Martin K. Petersen  Oracle Linux Engineering


Re: [PATCH v2] scsi: sg: don't return bogus Sg_requests

2017-05-11 Thread Martin K. Petersen

Johannes,

> If the list search in sg_get_rq_mark() fails to find a valid request,
> we return a bogus element. This then can later lead to a GPF in
> sg_remove_scat().
>
> So don't return bogus Sg_requests in sg_get_rq_mark() but NULL in case
> the list search doesn't find a valid request.

Applied to 4.12/scsi-fixes, thanks!

-- 
Martin K. Petersen  Oracle Linux Engineering


Re: [PATCH v2] scsi: sg: don't return bogus Sg_requests

2017-05-10 Thread Douglas Gilbert

On 2017-05-10 03:53 AM, Johannes Thumshirn wrote:

If the list search in sg_get_rq_mark() fails to find a valid request, we
return a bogus element. This then can later lead to a GPF in sg_remove_scat().

So don't return bogus Sg_requests in sg_get_rq_mark() but NULL in case the
list search doesn't find a valid request.

Signed-off-by: Johannes Thumshirn 
Reported-by: Andrey Konovalov 
Cc: Hannes Reinecke 
Cc: Christoph Hellwig 
Cc: Doug Gilbert 
---
Changes to v1:
* Directly return found element within the loop (Hannes)

 drivers/scsi/sg.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 0a38ba01b7b4..82c33a6edbea 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -2074,11 +2074,12 @@ sg_get_rq_mark(Sg_fd * sfp, int pack_id)
if ((1 == resp->done) && (!resp->sg_io_owned) &&
((-1 == pack_id) || (resp->header.pack_id == pack_id))) {
resp->done = 2;  /* guard against other readers */
-   break;
+   write_unlock_irqrestore(>rq_list_lock, iflags);
+   return resp;
}
}
write_unlock_irqrestore(>rq_list_lock, iflags);
-   return resp;
+   return NULL;
 }

 /* always adds to end of list */



Acked-by: Douglas Gilbert 


Re: [PATCH v2] scsi: sg: don't return bogus Sg_requests

2017-05-10 Thread Douglas Gilbert

On 2017-05-10 03:53 AM, Johannes Thumshirn wrote:

If the list search in sg_get_rq_mark() fails to find a valid request, we
return a bogus element. This then can later lead to a GPF in sg_remove_scat().

So don't return bogus Sg_requests in sg_get_rq_mark() but NULL in case the
list search doesn't find a valid request.

Signed-off-by: Johannes Thumshirn 
Reported-by: Andrey Konovalov 
Cc: Hannes Reinecke 
Cc: Christoph Hellwig 
Cc: Doug Gilbert 
---
Changes to v1:
* Directly return found element within the loop (Hannes)

 drivers/scsi/sg.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 0a38ba01b7b4..82c33a6edbea 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -2074,11 +2074,12 @@ sg_get_rq_mark(Sg_fd * sfp, int pack_id)
if ((1 == resp->done) && (!resp->sg_io_owned) &&
((-1 == pack_id) || (resp->header.pack_id == pack_id))) {
resp->done = 2;  /* guard against other readers */
-   break;
+   write_unlock_irqrestore(>rq_list_lock, iflags);
+   return resp;
}
}
write_unlock_irqrestore(>rq_list_lock, iflags);
-   return resp;
+   return NULL;
 }

 /* always adds to end of list */



Acked-by: Douglas Gilbert 


Re: [PATCH v2] scsi: sg: don't return bogus Sg_requests

2017-05-10 Thread Hannes Reinecke
On 05/10/2017 09:53 AM, Johannes Thumshirn wrote:
> If the list search in sg_get_rq_mark() fails to find a valid request, we
> return a bogus element. This then can later lead to a GPF in sg_remove_scat().
> 
> So don't return bogus Sg_requests in sg_get_rq_mark() but NULL in case the
> list search doesn't find a valid request.
> 
> Signed-off-by: Johannes Thumshirn 
> Reported-by: Andrey Konovalov 
> Cc: Hannes Reinecke 
> Cc: Christoph Hellwig 
> Cc: Doug Gilbert 
> ---
> Changes to v1:
> * Directly return found element within the loop (Hannes)
> 
>  drivers/scsi/sg.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
> index 0a38ba01b7b4..82c33a6edbea 100644
> --- a/drivers/scsi/sg.c
> +++ b/drivers/scsi/sg.c
> @@ -2074,11 +2074,12 @@ sg_get_rq_mark(Sg_fd * sfp, int pack_id)
>   if ((1 == resp->done) && (!resp->sg_io_owned) &&
>   ((-1 == pack_id) || (resp->header.pack_id == pack_id))) {
>   resp->done = 2; /* guard against other readers */
> - break;
> + write_unlock_irqrestore(>rq_list_lock, iflags);
> + return resp;
>   }
>   }
>   write_unlock_irqrestore(>rq_list_lock, iflags);
> - return resp;
> + return NULL;
>  }
>  
>  /* always adds to end of list */
> 
Better.

Reviewed-by: Hannes Reinecke 

Cheers,

Hannes
-- 
Dr. Hannes ReineckeTeamlead Storage & Networking
h...@suse.de   +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)


Re: [PATCH v2] scsi: sg: don't return bogus Sg_requests

2017-05-10 Thread Hannes Reinecke
On 05/10/2017 09:53 AM, Johannes Thumshirn wrote:
> If the list search in sg_get_rq_mark() fails to find a valid request, we
> return a bogus element. This then can later lead to a GPF in sg_remove_scat().
> 
> So don't return bogus Sg_requests in sg_get_rq_mark() but NULL in case the
> list search doesn't find a valid request.
> 
> Signed-off-by: Johannes Thumshirn 
> Reported-by: Andrey Konovalov 
> Cc: Hannes Reinecke 
> Cc: Christoph Hellwig 
> Cc: Doug Gilbert 
> ---
> Changes to v1:
> * Directly return found element within the loop (Hannes)
> 
>  drivers/scsi/sg.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
> index 0a38ba01b7b4..82c33a6edbea 100644
> --- a/drivers/scsi/sg.c
> +++ b/drivers/scsi/sg.c
> @@ -2074,11 +2074,12 @@ sg_get_rq_mark(Sg_fd * sfp, int pack_id)
>   if ((1 == resp->done) && (!resp->sg_io_owned) &&
>   ((-1 == pack_id) || (resp->header.pack_id == pack_id))) {
>   resp->done = 2; /* guard against other readers */
> - break;
> + write_unlock_irqrestore(>rq_list_lock, iflags);
> + return resp;
>   }
>   }
>   write_unlock_irqrestore(>rq_list_lock, iflags);
> - return resp;
> + return NULL;
>  }
>  
>  /* always adds to end of list */
> 
Better.

Reviewed-by: Hannes Reinecke 

Cheers,

Hannes
-- 
Dr. Hannes ReineckeTeamlead Storage & Networking
h...@suse.de   +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG Nürnberg)


[PATCH v2] scsi: sg: don't return bogus Sg_requests

2017-05-10 Thread Johannes Thumshirn
If the list search in sg_get_rq_mark() fails to find a valid request, we
return a bogus element. This then can later lead to a GPF in sg_remove_scat().

So don't return bogus Sg_requests in sg_get_rq_mark() but NULL in case the
list search doesn't find a valid request.

Signed-off-by: Johannes Thumshirn 
Reported-by: Andrey Konovalov 
Cc: Hannes Reinecke 
Cc: Christoph Hellwig 
Cc: Doug Gilbert 
---
Changes to v1:
* Directly return found element within the loop (Hannes)

 drivers/scsi/sg.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 0a38ba01b7b4..82c33a6edbea 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -2074,11 +2074,12 @@ sg_get_rq_mark(Sg_fd * sfp, int pack_id)
if ((1 == resp->done) && (!resp->sg_io_owned) &&
((-1 == pack_id) || (resp->header.pack_id == pack_id))) {
resp->done = 2; /* guard against other readers */
-   break;
+   write_unlock_irqrestore(>rq_list_lock, iflags);
+   return resp;
}
}
write_unlock_irqrestore(>rq_list_lock, iflags);
-   return resp;
+   return NULL;
 }
 
 /* always adds to end of list */
-- 
2.12.0



[PATCH v2] scsi: sg: don't return bogus Sg_requests

2017-05-10 Thread Johannes Thumshirn
If the list search in sg_get_rq_mark() fails to find a valid request, we
return a bogus element. This then can later lead to a GPF in sg_remove_scat().

So don't return bogus Sg_requests in sg_get_rq_mark() but NULL in case the
list search doesn't find a valid request.

Signed-off-by: Johannes Thumshirn 
Reported-by: Andrey Konovalov 
Cc: Hannes Reinecke 
Cc: Christoph Hellwig 
Cc: Doug Gilbert 
---
Changes to v1:
* Directly return found element within the loop (Hannes)

 drivers/scsi/sg.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 0a38ba01b7b4..82c33a6edbea 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -2074,11 +2074,12 @@ sg_get_rq_mark(Sg_fd * sfp, int pack_id)
if ((1 == resp->done) && (!resp->sg_io_owned) &&
((-1 == pack_id) || (resp->header.pack_id == pack_id))) {
resp->done = 2; /* guard against other readers */
-   break;
+   write_unlock_irqrestore(>rq_list_lock, iflags);
+   return resp;
}
}
write_unlock_irqrestore(>rq_list_lock, iflags);
-   return resp;
+   return NULL;
 }
 
 /* always adds to end of list */
-- 
2.12.0