Re: [PATCH linux-2.6-block:post-2.6.15 08/10] blk: update IDE to use new blk_ordered

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 11/17/05, Tejun Heo <[email protected]> wrote:
> 08_blk_ide-update-ordered.patch
>
>         Update IDE to use new blk_ordered.
>
> Signed-off-by: Tejun Heo <[email protected]>
>
>  ide-disk.c |   57 +++++++++------------------------------------------------
>  ide-io.c   |    5 +----
>  2 files changed, 10 insertions(+), 52 deletions(-)
>
> Index: work/drivers/ide/ide-disk.c
> ===================================================================
> --- work.orig/drivers/ide/ide-disk.c    2005-11-18 00:14:21.000000000 +0900
> +++ work/drivers/ide/ide-disk.c 2005-11-18 00:35:06.000000000 +0900
> @@ -681,50 +681,9 @@ static ide_proc_entry_t idedisk_proc[] =
>
>  #endif /* CONFIG_PROC_FS */
>
> -static void idedisk_end_flush(request_queue_t *q, struct request *flush_rq)
> +static void idedisk_prepare_flush(request_queue_t *q, struct request *rq)
>  {
>         ide_drive_t *drive = q->queuedata;
> -       struct request *rq = flush_rq->end_io_data;
> -       int good_sectors = rq->hard_nr_sectors;
> -       int bad_sectors;
> -       sector_t sector;
> -
> -       if (flush_rq->errors & ABRT_ERR) {
> -               printk(KERN_ERR "%s: barrier support doesn't work\n", drive->name);
> -               blk_queue_ordered(drive->queue, QUEUE_ORDERED_NONE);
> -               blk_queue_issue_flush_fn(drive->queue, NULL);
> -               good_sectors = 0;
> -       } else if (flush_rq->errors) {
> -               good_sectors = 0;
> -               if (blk_barrier_preflush(rq)) {
> -                       sector = ide_get_error_location(drive,flush_rq->buffer);
> -                       if ((sector >= rq->hard_sector) &&
> -                           (sector < rq->hard_sector + rq->hard_nr_sectors))
> -                               good_sectors = sector - rq->hard_sector;
> -               }
> -       }
> -
> -       if (flush_rq->errors)
> -               printk(KERN_ERR "%s: failed barrier write: "
> -                               "sector=%Lx(good=%d/bad=%d)\n",
> -                               drive->name, (unsigned long long)rq->sector,
> -                               good_sectors,
> -                               (int) (rq->hard_nr_sectors-good_sectors));
> -
> -       bad_sectors = rq->hard_nr_sectors - good_sectors;
> -
> -       if (good_sectors)
> -               __ide_end_request(drive, rq, 1, good_sectors);
> -       if (bad_sectors)
> -               __ide_end_request(drive, rq, 0, bad_sectors);
> -}

I fail to see how the partial completions (good + bad sectors)
are done in your new scheme, please explain.

> -
> -static int idedisk_prepare_flush(request_queue_t *q, struct request *rq)
> -{
> -       ide_drive_t *drive = q->queuedata;
> -
> -       if (!drive->wcache)
> -               return 0;

What does happen if somebody disables drive->wcache later?

>         memset(rq->cmd, 0, sizeof(rq->cmd));
>
> @@ -735,9 +694,8 @@ static int idedisk_prepare_flush(request
>                 rq->cmd[0] = WIN_FLUSH_CACHE;
>
>
> -       rq->flags |= REQ_DRIVE_TASK | REQ_SOFTBARRIER;
> +       rq->flags |= REQ_DRIVE_TASK;
>         rq->buffer = rq->cmd;
> -       return 1;
>  }
>
>  static int idedisk_issue_flush(request_queue_t *q, struct gendisk *disk,
> @@ -1012,11 +970,12 @@ static void idedisk_setup (ide_drive_t *
>         printk(KERN_INFO "%s: cache flushes %ssupported\n",
>                 drive->name, barrier ? "" : "not ");
>         if (barrier) {
> -               blk_queue_ordered(drive->queue, QUEUE_ORDERED_FLUSH);
> -               drive->queue->prepare_flush_fn = idedisk_prepare_flush;
> -               drive->queue->end_flush_fn = idedisk_end_flush;
> +               blk_queue_ordered(drive->queue, QUEUE_ORDERED_DRAIN_FLUSH,
> +                                 idedisk_prepare_flush, GFP_KERNEL);
>                 blk_queue_issue_flush_fn(drive->queue, idedisk_issue_flush);
> -       }
> +       } else if (!drive->wcache)
> +               blk_queue_ordered(drive->queue, QUEUE_ORDERED_DRAIN,
> +                                 NULL, GFP_KERNEL);

What does happen if somebody enables drive->wcache later?

>  }
>
>  static void ide_cacheflush_p(ide_drive_t *drive)
> @@ -1034,6 +993,8 @@ static int ide_disk_remove(struct device
>         struct ide_disk_obj *idkp = drive->driver_data;
>         struct gendisk *g = idkp->disk;
>
> +       blk_queue_ordered(drive->queue, QUEUE_ORDERED_NONE, NULL, 0);
> +

Shouldn't this be done in ide_disk_release()?

>         ide_cacheflush_p(drive);
>
>         ide_unregister_subdriver(drive, idkp->driver);
> Index: work/drivers/ide/ide-io.c
> ===================================================================
> --- work.orig/drivers/ide/ide-io.c      2005-11-18 00:35:04.000000000 +0900
> +++ work/drivers/ide/ide-io.c   2005-11-18 00:35:06.000000000 +0900
> @@ -119,10 +119,7 @@ int ide_end_request (ide_drive_t *drive,
>         if (!nr_sectors)
>                 nr_sectors = rq->hard_cur_sectors;
>
> -       if (blk_complete_barrier_rq_locked(drive->queue, rq, nr_sectors))
> -               ret = rq->nr_sectors != 0;
> -       else
> -               ret = __ide_end_request(drive, rq, uptodate, nr_sectors);
> +       ret = __ide_end_request(drive, rq, uptodate, nr_sectors);
>
>         spin_unlock_irqrestore(&ide_lock, flags);
>         return ret;
>
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux