lkml.org 
[lkml]   [2006]   [Jun]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[Suspend2][ 14/32] [Suspend2] Submit io on a page.
    Date
    Given a struct io_info, allocate and populate a struct bio for the page,
    link it to the struct io_info and submit the i/o.

    Signed-off-by: Nigel Cunningham <nigel@suspend2.net>

    kernel/power/suspend_block_io.c | 51 +++++++++++++++++++++++++++++++++++++++
    1 files changed, 51 insertions(+), 0 deletions(-)

    diff --git a/kernel/power/suspend_block_io.c b/kernel/power/suspend_block_io.c
    index 288718c..4d489f4 100644
    --- a/kernel/power/suspend_block_io.c
    +++ b/kernel/power/suspend_block_io.c
    @@ -463,3 +463,54 @@ static int suspend_end_bio(struct bio *b
    return 0;
    }

    +/**
    + * submit - submit BIO request.
    + * @rw: READ or WRITE.
    + * @io_info: IO info structure.
    + *
    + * Based on Patrick's pmdisk code from long ago:
    + * "Straight from the textbook - allocate and initialize the bio.
    + * If we're writing, make sure the page is marked as dirty.
    + * Then submit it and carry on."
    + *
    + * With a twist, though - we handle block_size != PAGE_SIZE.
    + * Caller has already checked that our page is not fragmented.
    + */
    +
    +static int submit(int rw, struct io_info *io_info)
    +{
    + int error = 0;
    + struct bio *bio = NULL;
    + unsigned long flags;
    +
    + while (!bio) {
    + bio = bio_alloc(GFP_ATOMIC,1);
    + if (!bio)
    + do_bio_wait(4);
    + }
    +
    + bio->bi_bdev = io_info->dev;
    + bio->bi_sector = io_info->block[0];
    + bio->bi_private = io_info;
    + bio->bi_end_io = suspend_end_bio;
    + io_info->sys_struct = bio;
    +
    + if (bio_add_page(bio, io_info->buffer_page, PAGE_SIZE, 0) < PAGE_SIZE) {
    + printk("ERROR: adding page to bio at %lld\n",
    + (unsigned long long) io_info->block[0]);
    + bio_put(bio);
    + return -EFAULT;
    + }
    +
    + if (rw == WRITE)
    + bio_set_pages_dirty(bio);
    +
    + spin_lock_irqsave(&ioinfo_busy_lock, flags);
    + list_add_tail(&io_info->list, &ioinfo_busy);
    + spin_unlock_irqrestore(&ioinfo_busy_lock, flags);
    +
    + submit_bio(rw,bio);
    +
    + return error;
    +}
    +
    --
    Nigel Cunningham nigel at suspend2 dot net
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2006-06-27 00:41    [W:0.022 / U:11.304 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site