Messages in this thread | | | From | "Rafael J. Wysocki" <> | Subject | Re: [PATCH v2 7/7] PM: submit bio in a sane way in cases without bio_chain | Date | Fri, 30 Jan 2015 01:49:12 +0100 |
| |
On Monday, January 12, 2015 12:44:04 PM Dongsu Park wrote: > From: Kent Overstreet <kmo@daterainc.com> > > Make bio submission in kernel/power/block_io.c to properly submit > bios also when bio_chain is not available. In that case, it's not > necessary to handle refcount with bio_get(), but it's saner to simply > call a predefined helper submit_bio_wait(). So call bio_get() only > when bio_chain is given. > > Cc: Christoph Hellwig <hch@infradead.org> > Cc: linux-pm@vger.kernel.org > Signed-off-by: Kent Overstreet <kmo@daterainc.com> > [dpark: add more description in commit message] > Signed-off-by: Dongsu Park <dongsu.park@profitbricks.com>
This is fine by me, but I'd like to have an ACK from a block layer expert here if I'm to apply it.
If you want to push this through the block layer subsystem tree, please feel free to add my ACK to it.
> --- > kernel/power/block_io.c | 23 ++++++++++++++++++----- > 1 file changed, 18 insertions(+), 5 deletions(-) > > diff --git a/kernel/power/block_io.c b/kernel/power/block_io.c > index 9a58bc2..7206408 100644 > --- a/kernel/power/block_io.c > +++ b/kernel/power/block_io.c > @@ -34,7 +34,6 @@ static int submit(int rw, struct block_device *bdev, sector_t sector, > bio = bio_alloc(__GFP_WAIT | __GFP_HIGH, 1); > bio->bi_iter.bi_sector = sector; > bio->bi_bdev = bdev; > - bio->bi_end_io = end_swap_bio_read; > > if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) { > printk(KERN_ERR "PM: Adding page to bio failed at %llu\n", > @@ -44,15 +43,29 @@ static int submit(int rw, struct block_device *bdev, sector_t sector, > } > > lock_page(page); > - bio_get(bio); > > if (bio_chain == NULL) { > - submit_bio(bio_rw, bio); > - wait_on_page_locked(page); > + int err = submit_bio_wait(bio_rw, bio); > + > + if (err) { > + SetPageError(page); > + ClearPageUptodate(page); > + pr_alert("Read-error on swap-device (%u:%u:%llu)\n", > + imajor(bio->bi_bdev->bd_inode), > + iminor(bio->bi_bdev->bd_inode), > + (unsigned long long)bio->bi_iter.bi_sector); > + } else { > + SetPageUptodate(page); > + } > + > if (rw == READ) > - bio_set_pages_dirty(bio); > + set_page_dirty_lock(page); > + unlock_page(page); > bio_put(bio); > } else { > + bio->bi_end_io = end_swap_bio_read; > + bio_get(bio); > + > if (rw == READ) > get_page(page); /* These pages are freed later */ > bio->bi_private = *bio_chain; >
-- I speak only for myself. Rafael J. Wysocki, Intel Open Source Technology Center.
| |