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    [from the cache]
©2003-2011 Jasper Spaans