lkml.org 
[lkml]   [2008]   [Apr]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[RFC][PATCH 6/10] I/O context inheritance
    From

    The raid10 module also makes use of temporary bios to sync physical disks
    under the same md device. Make these bios point the iocontext of a kernel
    thread in the module.

    Signed-off-by: Hirokazu Takahashi <taka@valinux.co.jp>


    --- linux-2.6.25.bio0/include/linux/raid/raid10.h 2008-04-22 15:48:32.000000000 +0900
    +++ linux-2.6.25/include/linux/raid/raid10.h 2008-04-22 15:52:58.000000000 +0900
    @@ -94,6 +94,7 @@ struct r10bio_s {
    int read_slot;

    struct list_head retry_list;
    + struct io_context *io_context;
    /*
    * if the IO is in WRITE direction, then multiple bios are used,
    * one for each copy.
    --- linux-2.6.25.bio0/drivers/md/raid10.c 2008-04-22 15:48:33.000000000 +0900
    +++ linux-2.6.25/drivers/md/raid10.c 2008-04-22 17:19:50.000000000 +0900
    @@ -199,6 +199,9 @@ static void put_buf(r10bio_t *r10_bio)
    {
    conf_t *conf = mddev_to_conf(r10_bio->mddev);

    + put_io_context(r10_bio->io_context);
    + r10_bio->io_context = NULL;
    +
    mempool_free(r10_bio, conf->r10buf_pool);

    lower_barrier(conf);
    @@ -1761,6 +1764,7 @@ static sector_t sync_request(mddev_t *md
    r10_bio->mddev = mddev;
    set_bit(R10BIO_IsRecover, &r10_bio->state);
    r10_bio->sector = sect;
    + r10_bio->io_context = ioc_object_link(current->io_context);

    raid10_find_phys(conf, r10_bio);
    /* Need to check if this section will still be
    @@ -1793,6 +1797,7 @@ static sector_t sync_request(mddev_t *md
    bio->bi_bdev = conf->mirrors[d].rdev->bdev;
    atomic_inc(&conf->mirrors[d].rdev->nr_pending);
    atomic_inc(&r10_bio->remaining);
    + bio->bi_io_context = r10_bio->io_context;
    /* and we write to 'i' */

    for (k=0; k<conf->copies; k++)
    @@ -1808,6 +1813,7 @@ static sector_t sync_request(mddev_t *md
    bio->bi_sector = r10_bio->devs[k].addr +
    conf->mirrors[i].rdev->data_offset;
    bio->bi_bdev = conf->mirrors[i].rdev->bdev;
    + bio->bi_io_context = r10_bio->io_context;

    r10_bio->devs[0].devnum = d;
    r10_bio->devs[1].devnum = i;
    @@ -1861,6 +1867,7 @@ static sector_t sync_request(mddev_t *md
    set_bit(R10BIO_IsSync, &r10_bio->state);
    raid10_find_phys(conf, r10_bio);
    r10_bio->sectors = (sector_nr | conf->chunk_mask) - sector_nr +1;
    + r10_bio->io_context = ioc_object_link(current->io_context);

    for (i=0; i<conf->copies; i++) {
    int d = r10_bio->devs[i].devnum;
    @@ -1880,6 +1887,7 @@ static sector_t sync_request(mddev_t *md
    bio->bi_sector = r10_bio->devs[i].addr +
    conf->mirrors[d].rdev->data_offset;
    bio->bi_bdev = conf->mirrors[d].rdev->bdev;
    + bio->bi_io_context = r10_bio->io_context;
    count++;
    }


    \
     
     \ /
      Last update: 2008-04-22 16:01    [W:0.023 / U:1.220 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site