* [PATCH]: Fix scsi_send_eh_cmnd scatterlist handling
@ 2007-04-02 19:24 David Miller
2007-04-02 19:29 ` Christoph Hellwig
0 siblings, 1 reply; 2+ messages in thread
From: David Miller @ 2007-04-02 19:24 UTC (permalink / raw)
To: linux-kernel; +Cc: linux-scsi, hch, tcallawa
This fixes a regression caused by commit:
2dc611de5a3fd955cd0298c50691d4c05046db97
The sense buffer code in scsi_send_eh_cmnd was changed to use
alloc_page() and a scatter list, but the sense data copy was not
updated to match so what we actually get in the sense buffer is total
grabage starting with the kernel address of the struct page we got.
Basically the stack frame of scsi_send_eh_cmd() is what ends up
in the sense buffer.
Depending upon how pointers look on a given platform, you can
end up getting sr_ioctl.c errors when you mount a cdrom. If
the CDROM gives a check condition for GPCMD_GET_CONFIGURATION issued
by drivers/cdrom/cdrom.c:cdrom_mmc_profile(), sr_ioctl will
spit out this error message in sr_do_ioctl() with the way pointers
are on sparc64:
default:
printk(KERN_ERR "%s: CDROM (ioctl) error, command: ", cd->cdi.name);
__scsi_print_command(cgc->cmd);
scsi_print_sense_hdr("sr", &sshdr);
err = -EIO;
This is the error Tom Callaway reported in:
http://marc.info/?l=linux-sparc&m=117407453208101&w=2
Anyways, fix this by using page_address(sgl.page) which is OK
because we know this is low-mem due to GFP_ATOMIC.
Signed-off-by: David S. Miller <davem@davemloft.net>
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index b8edcf5..918bb60 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -716,7 +716,7 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
*/
if (copy_sense) {
if (!SCSI_SENSE_VALID(scmd)) {
- memcpy(scmd->sense_buffer, scmd->request_buffer,
+ memcpy(scmd->sense_buffer, page_address(sgl.page),
sizeof(scmd->sense_buffer));
}
__free_page(sgl.page);
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH]: Fix scsi_send_eh_cmnd scatterlist handling
2007-04-02 19:24 [PATCH]: Fix scsi_send_eh_cmnd scatterlist handling David Miller
@ 2007-04-02 19:29 ` Christoph Hellwig
0 siblings, 0 replies; 2+ messages in thread
From: Christoph Hellwig @ 2007-04-02 19:29 UTC (permalink / raw)
To: David Miller; +Cc: linux-kernel, linux-scsi, hch, tcallawa
On Mon, Apr 02, 2007 at 12:24:39PM -0700, David Miller wrote:
>
> This fixes a regression caused by commit:
>
> 2dc611de5a3fd955cd0298c50691d4c05046db97
>
> The sense buffer code in scsi_send_eh_cmnd was changed to use
> alloc_page() and a scatter list, but the sense data copy was not
> updated to match so what we actually get in the sense buffer is total
> grabage starting with the kernel address of the struct page we got.
> Basically the stack frame of scsi_send_eh_cmd() is what ends up
> in the sense buffer.
>
> Depending upon how pointers look on a given platform, you can
> end up getting sr_ioctl.c errors when you mount a cdrom. If
> the CDROM gives a check condition for GPCMD_GET_CONFIGURATION issued
> by drivers/cdrom/cdrom.c:cdrom_mmc_profile(), sr_ioctl will
> spit out this error message in sr_do_ioctl() with the way pointers
> are on sparc64:
>
> default:
> printk(KERN_ERR "%s: CDROM (ioctl) error, command: ", cd->cdi.name);
> __scsi_print_command(cgc->cmd);
> scsi_print_sense_hdr("sr", &sshdr);
> err = -EIO;
>
> This is the error Tom Callaway reported in:
>
> http://marc.info/?l=linux-sparc&m=117407453208101&w=2
>
> Anyways, fix this by using page_address(sgl.page) which is OK
> because we know this is low-mem due to GFP_ATOMIC.
The patch looks correct to me and thanks for spotting this stupid
bug!
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2007-04-02 19:29 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-04-02 19:24 [PATCH]: Fix scsi_send_eh_cmnd scatterlist handling David Miller
2007-04-02 19:29 ` Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox