2005-03-03 03:09:05

by Tejun Heo

[permalink] [raw]
Subject: [PATCH ide-dev-2.6] ide: ide_dma_intr oops fix

Hello, Bartlomiej.

This patch fixes ide_dma_intr() oops which occurs for TASKFILE ioctl
using DMA dataphses. This is against the latest ide-dev-2.6 tree +
all your recent 9 patches.

Signed-off-by: Tejun Heo <[email protected]>

Index: linux-taskfile-ng/drivers/ide/ide-dma.c
===================================================================
--- linux-taskfile-ng.orig/drivers/ide/ide-dma.c 2005-03-03 11:59:16.485582413 +0900
+++ linux-taskfile-ng/drivers/ide/ide-dma.c 2005-03-03 12:00:07.753376048 +0900
@@ -175,10 +175,14 @@ ide_startstop_t ide_dma_intr (ide_drive_
if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
if (!dma_stat) {
struct request *rq = HWGROUP(drive)->rq;
- ide_driver_t *drv;

- drv = *(ide_driver_t **)rq->rq_disk->private_data;;
- drv->end_request(drive, 1, rq->nr_sectors);
+ if (rq->rq_disk) {
+ ide_driver_t *drv;
+
+ drv = *(ide_driver_t **)rq->rq_disk->private_data;;
+ drv->end_request(drive, 1, rq->nr_sectors);
+ } else
+ ide_end_request(drive, 1, rq->nr_sectors);
return ide_stopped;
}
printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n",


2005-03-03 06:55:37

by Jens Axboe

[permalink] [raw]
Subject: Re: [PATCH ide-dev-2.6] ide: ide_dma_intr oops fix

On Thu, Mar 03 2005, Tejun Heo wrote:
> Hello, Bartlomiej.
>
> This patch fixes ide_dma_intr() oops which occurs for TASKFILE ioctl
> using DMA dataphses. This is against the latest ide-dev-2.6 tree +
> all your recent 9 patches.
>
> Signed-off-by: Tejun Heo <[email protected]>
>
> Index: linux-taskfile-ng/drivers/ide/ide-dma.c
> ===================================================================
> --- linux-taskfile-ng.orig/drivers/ide/ide-dma.c 2005-03-03 11:59:16.485582413 +0900
> +++ linux-taskfile-ng/drivers/ide/ide-dma.c 2005-03-03 12:00:07.753376048 +0900
> @@ -175,10 +175,14 @@ ide_startstop_t ide_dma_intr (ide_drive_
> if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
> if (!dma_stat) {
> struct request *rq = HWGROUP(drive)->rq;
> - ide_driver_t *drv;
>
> - drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> - drv->end_request(drive, 1, rq->nr_sectors);
> + if (rq->rq_disk) {
> + ide_driver_t *drv;
> +
> + drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> + drv->end_request(drive, 1, rq->nr_sectors);
> + } else
> + ide_end_request(drive, 1, rq->nr_sectors);
> return ide_stopped;
> }
> printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n",

Why not just set rq_disk for taskfile requests as well, seems a lot
cleaner than special casing the end_request handling.

--
Jens Axboe

2005-03-03 07:04:00

by Tejun Heo

[permalink] [raw]
Subject: Re: [PATCH ide-dev-2.6] ide: ide_dma_intr oops fix

Hello, Jens.

Jens Axboe wrote:
> On Thu, Mar 03 2005, Tejun Heo wrote:
>
>> Hello, Bartlomiej.
>>
>> This patch fixes ide_dma_intr() oops which occurs for TASKFILE ioctl
>>using DMA dataphses. This is against the latest ide-dev-2.6 tree +
>>all your recent 9 patches.
>>
>> Signed-off-by: Tejun Heo <[email protected]>
>>
>>Index: linux-taskfile-ng/drivers/ide/ide-dma.c
>>===================================================================
>>--- linux-taskfile-ng.orig/drivers/ide/ide-dma.c 2005-03-03 11:59:16.485582413 +0900
>>+++ linux-taskfile-ng/drivers/ide/ide-dma.c 2005-03-03 12:00:07.753376048 +0900
>>@@ -175,10 +175,14 @@ ide_startstop_t ide_dma_intr (ide_drive_
>> if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
>> if (!dma_stat) {
>> struct request *rq = HWGROUP(drive)->rq;
>>- ide_driver_t *drv;
>>
>>- drv = *(ide_driver_t **)rq->rq_disk->private_data;;
>>- drv->end_request(drive, 1, rq->nr_sectors);
>>+ if (rq->rq_disk) {
>>+ ide_driver_t *drv;
>>+
>>+ drv = *(ide_driver_t **)rq->rq_disk->private_data;;
>>+ drv->end_request(drive, 1, rq->nr_sectors);
>>+ } else
>>+ ide_end_request(drive, 1, rq->nr_sectors);
>> return ide_stopped;
>> }
>> printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n",
>
> Why not just set rq_disk for taskfile requests as well, seems a lot
> cleaner than special casing the end_request handling.

Just because other places were fixed this way and the whole drive
command issue/completion codes are just about to be restructured. Above
code will go away soon. Please consider it a quick fix.

Thanks.

--
tejun

Subject: Re: [PATCH ide-dev-2.6] ide: ide_dma_intr oops fix

On Thu, 03 Mar 2005 15:57:18 +0900, Tejun Heo <[email protected]> wrote:
> Hello, Jens.
>
> Jens Axboe wrote:
> > On Thu, Mar 03 2005, Tejun Heo wrote:
> >
> >> Hello, Bartlomiej.
> >>
> >> This patch fixes ide_dma_intr() oops which occurs for TASKFILE ioctl
> >>using DMA dataphses. This is against the latest ide-dev-2.6 tree +
> >>all your recent 9 patches.
> >>
> >> Signed-off-by: Tejun Heo <[email protected]>
> >>
> >>Index: linux-taskfile-ng/drivers/ide/ide-dma.c
> >>===================================================================
> >>--- linux-taskfile-ng.orig/drivers/ide/ide-dma.c 2005-03-03 11:59:16.485582413 +0900
> >>+++ linux-taskfile-ng/drivers/ide/ide-dma.c 2005-03-03 12:00:07.753376048 +0900
> >>@@ -175,10 +175,14 @@ ide_startstop_t ide_dma_intr (ide_drive_
> >> if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
> >> if (!dma_stat) {
> >> struct request *rq = HWGROUP(drive)->rq;
> >>- ide_driver_t *drv;
> >>
> >>- drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> >>- drv->end_request(drive, 1, rq->nr_sectors);
> >>+ if (rq->rq_disk) {
> >>+ ide_driver_t *drv;
> >>+
> >>+ drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> >>+ drv->end_request(drive, 1, rq->nr_sectors);
> >>+ } else
> >>+ ide_end_request(drive, 1, rq->nr_sectors);
> >> return ide_stopped;
> >> }
> >> printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n",
> >
> > Why not just set rq_disk for taskfile requests as well, seems a lot
> > cleaner than special casing the end_request handling.
>
> Just because other places were fixed this way and the whole drive
> command issue/completion codes are just about to be restructured. Above
> code will go away soon. Please consider it a quick fix.
>
> Thanks.

Because struct gendisk is now allocated by device drivers (like in SCSI
subsystem) rq_disk can't be set for REQ_DRIVE_TASKFILE requests
(for some requests it can be set but better to keep it consistent).

2005-03-03 08:05:48

by Jens Axboe

[permalink] [raw]
Subject: Re: [PATCH ide-dev-2.6] ide: ide_dma_intr oops fix

On Thu, Mar 03 2005, Bartlomiej Zolnierkiewicz wrote:
> On Thu, 03 Mar 2005 15:57:18 +0900, Tejun Heo <[email protected]> wrote:
> > Hello, Jens.
> >
> > Jens Axboe wrote:
> > > On Thu, Mar 03 2005, Tejun Heo wrote:
> > >
> > >> Hello, Bartlomiej.
> > >>
> > >> This patch fixes ide_dma_intr() oops which occurs for TASKFILE ioctl
> > >>using DMA dataphses. This is against the latest ide-dev-2.6 tree +
> > >>all your recent 9 patches.
> > >>
> > >> Signed-off-by: Tejun Heo <[email protected]>
> > >>
> > >>Index: linux-taskfile-ng/drivers/ide/ide-dma.c
> > >>===================================================================
> > >>--- linux-taskfile-ng.orig/drivers/ide/ide-dma.c 2005-03-03 11:59:16.485582413 +0900
> > >>+++ linux-taskfile-ng/drivers/ide/ide-dma.c 2005-03-03 12:00:07.753376048 +0900
> > >>@@ -175,10 +175,14 @@ ide_startstop_t ide_dma_intr (ide_drive_
> > >> if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
> > >> if (!dma_stat) {
> > >> struct request *rq = HWGROUP(drive)->rq;
> > >>- ide_driver_t *drv;
> > >>
> > >>- drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> > >>- drv->end_request(drive, 1, rq->nr_sectors);
> > >>+ if (rq->rq_disk) {
> > >>+ ide_driver_t *drv;
> > >>+
> > >>+ drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> > >>+ drv->end_request(drive, 1, rq->nr_sectors);
> > >>+ } else
> > >>+ ide_end_request(drive, 1, rq->nr_sectors);
> > >> return ide_stopped;
> > >> }
> > >> printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n",
> > >
> > > Why not just set rq_disk for taskfile requests as well, seems a lot
> > > cleaner than special casing the end_request handling.
> >
> > Just because other places were fixed this way and the whole drive
> > command issue/completion codes are just about to be restructured. Above
> > code will go away soon. Please consider it a quick fix.
> >
> > Thanks.
>
> Because struct gendisk is now allocated by device drivers (like in SCSI
> subsystem) rq_disk can't be set for REQ_DRIVE_TASKFILE requests
> (for some requests it can be set but better to keep it consistent).

Seems cleaner to store the driver in the drive structure then, no
special casing needed.

--
Jens Axboe

Subject: Re: [PATCH ide-dev-2.6] ide: ide_dma_intr oops fix

On Thu, 3 Mar 2005 09:05:19 +0100, Jens Axboe <[email protected]> wrote:
> On Thu, Mar 03 2005, Bartlomiej Zolnierkiewicz wrote:
> > On Thu, 03 Mar 2005 15:57:18 +0900, Tejun Heo <[email protected]> wrote:
> > > Hello, Jens.
> > >
> > > Jens Axboe wrote:
> > > > On Thu, Mar 03 2005, Tejun Heo wrote:
> > > >
> > > >> Hello, Bartlomiej.
> > > >>
> > > >> This patch fixes ide_dma_intr() oops which occurs for TASKFILE ioctl
> > > >>using DMA dataphses. This is against the latest ide-dev-2.6 tree +
> > > >>all your recent 9 patches.
> > > >>
> > > >> Signed-off-by: Tejun Heo <[email protected]>
> > > >>
> > > >>Index: linux-taskfile-ng/drivers/ide/ide-dma.c
> > > >>===================================================================
> > > >>--- linux-taskfile-ng.orig/drivers/ide/ide-dma.c 2005-03-03 11:59:16.485582413 +0900
> > > >>+++ linux-taskfile-ng/drivers/ide/ide-dma.c 2005-03-03 12:00:07.753376048 +0900
> > > >>@@ -175,10 +175,14 @@ ide_startstop_t ide_dma_intr (ide_drive_
> > > >> if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
> > > >> if (!dma_stat) {
> > > >> struct request *rq = HWGROUP(drive)->rq;
> > > >>- ide_driver_t *drv;
> > > >>
> > > >>- drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> > > >>- drv->end_request(drive, 1, rq->nr_sectors);
> > > >>+ if (rq->rq_disk) {
> > > >>+ ide_driver_t *drv;
> > > >>+
> > > >>+ drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> > > >>+ drv->end_request(drive, 1, rq->nr_sectors);
> > > >>+ } else
> > > >>+ ide_end_request(drive, 1, rq->nr_sectors);
> > > >> return ide_stopped;
> > > >> }
> > > >> printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n",
> > > >
> > > > Why not just set rq_disk for taskfile requests as well, seems a lot
> > > > cleaner than special casing the end_request handling.
> > >
> > > Just because other places were fixed this way and the whole drive
> > > command issue/completion codes are just about to be restructured. Above
> > > code will go away soon. Please consider it a quick fix.
> > >
> > > Thanks.
> >
> > Because struct gendisk is now allocated by device drivers (like in SCSI
> > subsystem) rq_disk can't be set for REQ_DRIVE_TASKFILE requests
> > (for some requests it can be set but better to keep it consistent).
>
> Seems cleaner to store the driver in the drive structure then, no
> special casing needed.

This can't be done *correctly* with driver model support, that is why SCSI
does the same trick. There were three incremental patch series, all sent
to linux-{ide,kernel} (all patches except the final one are now in ide-dev-2.6),
to convert IDE device drivers to driver model.

2005-03-03 08:20:35

by Jens Axboe

[permalink] [raw]
Subject: Re: [PATCH ide-dev-2.6] ide: ide_dma_intr oops fix

On Thu, Mar 03 2005, Bartlomiej Zolnierkiewicz wrote:
> On Thu, 3 Mar 2005 09:05:19 +0100, Jens Axboe <[email protected]> wrote:
> > On Thu, Mar 03 2005, Bartlomiej Zolnierkiewicz wrote:
> > > On Thu, 03 Mar 2005 15:57:18 +0900, Tejun Heo <[email protected]> wrote:
> > > > Hello, Jens.
> > > >
> > > > Jens Axboe wrote:
> > > > > On Thu, Mar 03 2005, Tejun Heo wrote:
> > > > >
> > > > >> Hello, Bartlomiej.
> > > > >>
> > > > >> This patch fixes ide_dma_intr() oops which occurs for TASKFILE ioctl
> > > > >>using DMA dataphses. This is against the latest ide-dev-2.6 tree +
> > > > >>all your recent 9 patches.
> > > > >>
> > > > >> Signed-off-by: Tejun Heo <[email protected]>
> > > > >>
> > > > >>Index: linux-taskfile-ng/drivers/ide/ide-dma.c
> > > > >>===================================================================
> > > > >>--- linux-taskfile-ng.orig/drivers/ide/ide-dma.c 2005-03-03 11:59:16.485582413 +0900
> > > > >>+++ linux-taskfile-ng/drivers/ide/ide-dma.c 2005-03-03 12:00:07.753376048 +0900
> > > > >>@@ -175,10 +175,14 @@ ide_startstop_t ide_dma_intr (ide_drive_
> > > > >> if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) {
> > > > >> if (!dma_stat) {
> > > > >> struct request *rq = HWGROUP(drive)->rq;
> > > > >>- ide_driver_t *drv;
> > > > >>
> > > > >>- drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> > > > >>- drv->end_request(drive, 1, rq->nr_sectors);
> > > > >>+ if (rq->rq_disk) {
> > > > >>+ ide_driver_t *drv;
> > > > >>+
> > > > >>+ drv = *(ide_driver_t **)rq->rq_disk->private_data;;
> > > > >>+ drv->end_request(drive, 1, rq->nr_sectors);
> > > > >>+ } else
> > > > >>+ ide_end_request(drive, 1, rq->nr_sectors);
> > > > >> return ide_stopped;
> > > > >> }
> > > > >> printk(KERN_ERR "%s: dma_intr: bad DMA status (dma_stat=%x)\n",
> > > > >
> > > > > Why not just set rq_disk for taskfile requests as well, seems a lot
> > > > > cleaner than special casing the end_request handling.
> > > >
> > > > Just because other places were fixed this way and the whole drive
> > > > command issue/completion codes are just about to be restructured. Above
> > > > code will go away soon. Please consider it a quick fix.
> > > >
> > > > Thanks.
> > >
> > > Because struct gendisk is now allocated by device drivers (like in SCSI
> > > subsystem) rq_disk can't be set for REQ_DRIVE_TASKFILE requests
> > > (for some requests it can be set but better to keep it consistent).
> >
> > Seems cleaner to store the driver in the drive structure then, no
> > special casing needed.
>
> This can't be done *correctly* with driver model support, that is why
> SCSI does the same trick. There were three incremental patch series,
> all sent to linux-{ide,kernel} (all patches except the final one are
> now in ide-dev-2.6), to convert IDE device drivers to driver model.

Ok, I guess we'll have to live with it then.

--
Jens Axboe