From: Jaegeuk Kim <jaegeuk.kim@samsung.com>
To: Stephen Rothwell <sfr@canb.auug.org.au>
Cc: Linus Torvalds <torvalds@linux-foundation.org>,
Jens Axboe <axboe@kernel.dk>,
linux-kernel@vger.kernel.org
Subject: Re: [GIT PULL] Core block IO changes for 3.14
Date: Wed, 29 Jan 2014 09:45:13 +0900 [thread overview]
Message-ID: <1390956313.25542.64.camel@kjgkr> (raw)
In-Reply-To: <20140129110536.00ce3c9e580f747fd0f1d0e6@canb.auug.org.au>
Hi Jens and Stephen,
In the case of f2fs, could you please check the following code changes?
It is based on the following commit from Linus tree.
commit d891ea23d5203e5c47439b2a174f86a00b356a6c
Merge: 08d21b5 125d725
Author: Linus Torvalds <torvalds@linux-foundation.org>
Date: Tue Jan 28 11:02:23 2014 -0800
Merge branch 'for-linus' of
git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
---
fs/f2fs/data.c | 31 ++++++++++++++-----------------
include/trace/events/f2fs.h | 4 ++--
2 files changed, 16 insertions(+), 19 deletions(-)
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c
index 0ae5587..55ae30a 100644
--- a/fs/f2fs/data.c
+++ b/fs/f2fs/data.c
@@ -26,40 +26,37 @@
static void f2fs_read_end_io(struct bio *bio, int err)
{
- const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
- struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
+ struct bio_vec *bvec;
+ int i;
- do {
+ bio_for_each_segment_all(bvec, bio, i) {
struct page *page = bvec->bv_page;
- if (--bvec >= bio->bi_io_vec)
- prefetchw(&bvec->bv_page->flags);
-
- if (unlikely(!uptodate)) {
+ if (unlikely(err)) {
ClearPageUptodate(page);
SetPageError(page);
} else {
SetPageUptodate(page);
}
unlock_page(page);
- } while (bvec >= bio->bi_io_vec);
+ }
bio_put(bio);
}
static void f2fs_write_end_io(struct bio *bio, int err)
{
- const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
- struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
- struct f2fs_sb_info *sbi =
F2FS_SB(bvec->bv_page->mapping->host->i_sb);
+ struct f2fs_sb_info *sbi = NULL;
+ struct bio_vec *bvec;
+ int i;
- do {
+ bio_for_each_segment_all(bvec, bio, i) {
struct page *page = bvec->bv_page;
- if (--bvec >= bio->bi_io_vec)
- prefetchw(&bvec->bv_page->flags);
+ if (!sbi)
+ sbi = F2FS_SB(bvec->bv_page->mapping->host->i_sb);
- if (unlikely(!uptodate)) {
+ if (unlikely(err)) {
SetPageError(page);
set_bit(AS_EIO, &page->mapping->flags);
set_ckpt_flags(sbi->ckpt, CP_ERROR_FLAG);
@@ -67,7 +64,7 @@ static void f2fs_write_end_io(struct bio *bio, int
err)
}
end_page_writeback(page);
dec_page_count(sbi, F2FS_WRITEBACK);
- } while (bvec >= bio->bi_io_vec);
+ }
if (bio->bi_private)
complete(bio->bi_private);
@@ -91,7 +88,7 @@ static struct bio *__bio_alloc(struct f2fs_sb_info
*sbi, block_t blk_addr,
bio = bio_alloc(GFP_NOIO, npages);
bio->bi_bdev = sbi->sb->s_bdev;
- bio->bi_sector = SECTOR_FROM_BLOCK(sbi, blk_addr);
+ bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(sbi, blk_addr);
bio->bi_end_io = is_read ? f2fs_read_end_io : f2fs_write_end_io;
return bio;
diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
index 3b9f28d..67f38fa 100644
--- a/include/trace/events/f2fs.h
+++ b/include/trace/events/f2fs.h
@@ -629,8 +629,8 @@ DECLARE_EVENT_CLASS(f2fs__submit_bio,
__entry->dev = sb->s_dev;
__entry->rw = rw;
__entry->type = type;
- __entry->sector = bio->bi_sector;
- __entry->size = bio->bi_size;
+ __entry->sector = bio->bi_iter.bi_sector;
+ __entry->size = bio->bi_iter.bi_size;
),
TP_printk("dev = (%d,%d), %s%s, %s, sector = %lld, size = %u",
--
1.8.4.474.g128a96c
Thanks,
2014-01-29 (수), 11:05 +1100, Stephen Rothwell:
> Hi all,
>
> On Tue, 28 Jan 2014 15:52:29 -0700 Jens Axboe <axboe@kernel.dk> wrote:
> >
> > On Tue, Jan 28 2014, Jens Axboe wrote:
> > >
> > > This is the pull request for the core block IO changes for 3.14. The
> > > major piece in here is the immutable bio_ve series from Kent, the rest
> > > is fairly minor. It was supposed to go in last round, but various issues
> > > pushed it to this release instead. The pull request contains:
> > >
> > >
> > > - Various smaller blk-mq fixes from different folks. Nothing major here,
> > > just minor fixes and cleanups.
> > >
> > > - Fix for a memory leak in the error path in the block ioctl code from
> > > Christian Engelmayer.
> > >
> > > - Header export fix from CaiZhiyong.
> > >
> > > - Finally the immutable biovec changes from Kent Overstreet. This
> > > enables some nice future work on making arbitrarily sized bios
> > > possible, and splitting more efficient. Related fixes to immutable
> > > bio_vecs:
> > >
> > > - dm-cache immutable fixup from Mike Snitzer.
> > > - btrfs immutable fixup from Muthu Kumar.
> > >
> > > - bio-integrity fix from Nic Bellinger, which is also going to stable.
> > >
> > >
> > > Please pull! There will be a bit of merge work for you, but it should be
> > > fairly straight forward. It's mostly related to changin:
> > >
> > > bio->bi_sector -> bio->bi_iter.bi_sector
> > > bio->bi_size -> bio->bi_iter.bi_size
> > >
> > >
> > > git://git.kernel.dk/linux-block.git for-3.14/core
> >
> > BTW, let me know if you want me to merge this. The above has been in
> > for-next since forever, and Stephen has carried a fix or two for new
> > merges.
>
> The worst bit is the conflicts with the f2fs changes that have already
> been merged. My current merge commit looks like this (though I don't
> remember getting any comments on my fixes):
>
> da3f6c793c656a022453df8bf458d13e5a353beb
> diff --cc drivers/md/dm-thin.c
> index 726228b33a01,357eb272dbd9..faaf944597ab
> --- a/drivers/md/dm-thin.c
> +++ b/drivers/md/dm-thin.c
> @@@ -1258,8 -1262,8 +1264,8 @@@ static void process_bio_read_only(struc
> r = dm_thin_find_block(tc->td, block, 1, &lookup_result);
> switch (r) {
> case 0:
> - if (lookup_result.shared && (rw == WRITE) && bio->bi_size)
> + if (lookup_result.shared && (rw == WRITE) && bio->bi_iter.bi_size)
> - bio_io_error(bio);
> + handle_unserviceable_bio(tc->pool, bio);
> else {
> inc_all_io_entry(tc->pool, bio);
> remap_and_issue(tc, bio, lookup_result.block);
> diff --cc drivers/md/raid10.c
> index 8d39d63281b9,6d43d88657aa..33fc408e5eac
> --- a/drivers/md/raid10.c
> +++ b/drivers/md/raid10.c
> @@@ -1319,8 -1256,8 +1256,8 @@@ read_again
> /* Could not read all from this device, so we will
> * need another r10_bio.
> */
> - sectors_handled = (r10_bio->sectors + max_sectors
> + sectors_handled = (r10_bio->sector + max_sectors
> - - bio->bi_sector);
> + - bio->bi_iter.bi_sector);
> r10_bio->sectors = max_sectors;
> spin_lock_irq(&conf->device_lock);
> if (bio->bi_phys_segments == 0)
> diff --cc fs/btrfs/extent_io.c
> index fbe501d3bd01,bcb6f1b780d6..85bbd01f1271
> --- a/fs/btrfs/extent_io.c
> +++ b/fs/btrfs/extent_io.c
> @@@ -2375,12 -2332,15 +2375,13 @@@ int end_extent_writepage(struct page *p
> */
> static void end_bio_extent_writepage(struct bio *bio, int err)
> {
> - struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
> + struct bio_vec *bvec;
> - struct extent_io_tree *tree;
> u64 start;
> u64 end;
> + int i;
>
> - do {
> + bio_for_each_segment_all(bvec, bio, i) {
> struct page *page = bvec->bv_page;
> - tree = &BTRFS_I(page->mapping->host)->io_tree;
>
> /* We always issue full-page reads, but if some block
> * in a page fails to read, blk_update_request() will
> diff --cc fs/btrfs/inode.c
> index 1ef056837755,7ab0e94ad492..f0422a5efa78
> --- a/fs/btrfs/inode.c
> +++ b/fs/btrfs/inode.c
> @@@ -7016,10 -6891,11 +7013,11 @@@ static void btrfs_end_dio_bio(struct bi
> struct btrfs_dio_private *dip = bio->bi_private;
>
> if (err) {
> - printk(KERN_ERR "btrfs direct IO failed ino %llu rw %lu "
> - "sector %#Lx len %u err no %d\n",
> + btrfs_err(BTRFS_I(dip->inode)->root->fs_info,
> + "direct IO failed ino %llu rw %lu sector %#Lx len %u err no %d",
> btrfs_ino(dip->inode), bio->bi_rw,
> - (unsigned long long)bio->bi_sector, bio->bi_size, err);
> + (unsigned long long)bio->bi_iter.bi_sector,
> + bio->bi_iter.bi_size, err);
> dip->errors = 1;
>
> /*
> diff --cc fs/f2fs/data.c
> index 0ae558723506,a2c8de8ba6ce..25d675e6a138
> --- a/fs/f2fs/data.c
> +++ b/fs/f2fs/data.c
> @@@ -24,195 -24,6 +24,192 @@@
> #include "segment.h"
> #include <trace/events/f2fs.h>
>
> +static void f2fs_read_end_io(struct bio *bio, int err)
> +{
> - const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
> - struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
> ++ struct bio_vec *bvec;
> ++ int i;
> +
> - do {
> ++ bio_for_each_segment_all(bvec, bio, i) {
> + struct page *page = bvec->bv_page;
> +
> - if (--bvec >= bio->bi_io_vec)
> - prefetchw(&bvec->bv_page->flags);
> -
> - if (unlikely(!uptodate)) {
> ++ if (unlikely(err)) {
> + ClearPageUptodate(page);
> + SetPageError(page);
> + } else {
> + SetPageUptodate(page);
> + }
> + unlock_page(page);
> - } while (bvec >= bio->bi_io_vec);
> ++ }
> +
> + bio_put(bio);
> +}
> +
> +static void f2fs_write_end_io(struct bio *bio, int err)
> +{
> - const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
> - struct bio_vec *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
> - struct f2fs_sb_info *sbi = F2FS_SB(bvec->bv_page->mapping->host->i_sb);
> ++ struct bio_vec *bvec;
> ++ struct f2fs_sb_info *sbi = NULL;
> ++ int i;
> +
> - do {
> ++ bio_for_each_segment_all(bvec, bio, i) {
> + struct page *page = bvec->bv_page;
> +
> - if (--bvec >= bio->bi_io_vec)
> - prefetchw(&bvec->bv_page->flags);
> ++ if (!sbi)
> ++ sbi = F2FS_SB(bvec->bv_page->mapping->host->i_sb);
> +
> - if (unlikely(!uptodate)) {
> ++ if (unlikely(err)) {
> + SetPageError(page);
> + set_bit(AS_EIO, &page->mapping->flags);
> + set_ckpt_flags(sbi->ckpt, CP_ERROR_FLAG);
> + sbi->sb->s_flags |= MS_RDONLY;
> + }
> + end_page_writeback(page);
> + dec_page_count(sbi, F2FS_WRITEBACK);
> - } while (bvec >= bio->bi_io_vec);
> ++ }
> +
> + if (bio->bi_private)
> + complete(bio->bi_private);
> +
> + if (!get_pages(sbi, F2FS_WRITEBACK) &&
> + !list_empty(&sbi->cp_wait.task_list))
> + wake_up(&sbi->cp_wait);
> +
> + bio_put(bio);
> +}
> +
> +/*
> + * Low-level block read/write IO operations.
> + */
> +static struct bio *__bio_alloc(struct f2fs_sb_info *sbi, block_t blk_addr,
> + int npages, bool is_read)
> +{
> + struct bio *bio;
> +
> + /* No failure on bio allocation */
> + bio = bio_alloc(GFP_NOIO, npages);
> +
> + bio->bi_bdev = sbi->sb->s_bdev;
> - bio->bi_sector = SECTOR_FROM_BLOCK(sbi, blk_addr);
> ++ bio->bi_iter.bi_sector = SECTOR_FROM_BLOCK(sbi, blk_addr);
> + bio->bi_end_io = is_read ? f2fs_read_end_io : f2fs_write_end_io;
> +
> + return bio;
> +}
> +
> +static void __submit_merged_bio(struct f2fs_bio_info *io)
> +{
> + struct f2fs_io_info *fio = &io->fio;
> + int rw;
> +
> + if (!io->bio)
> + return;
> +
> + rw = fio->rw;
> +
> + if (is_read_io(rw)) {
> + trace_f2fs_submit_read_bio(io->sbi->sb, rw,
> + fio->type, io->bio);
> + submit_bio(rw, io->bio);
> + } else {
> + trace_f2fs_submit_write_bio(io->sbi->sb, rw,
> + fio->type, io->bio);
> + /*
> + * META_FLUSH is only from the checkpoint procedure, and we
> + * should wait this metadata bio for FS consistency.
> + */
> + if (fio->type == META_FLUSH) {
> + DECLARE_COMPLETION_ONSTACK(wait);
> + io->bio->bi_private = &wait;
> + submit_bio(rw, io->bio);
> + wait_for_completion(&wait);
> + } else {
> + submit_bio(rw, io->bio);
> + }
> + }
> +
> + io->bio = NULL;
> +}
> +
> +void f2fs_submit_merged_bio(struct f2fs_sb_info *sbi,
> + enum page_type type, int rw)
> +{
> + enum page_type btype = PAGE_TYPE_OF_BIO(type);
> + struct f2fs_bio_info *io;
> +
> + io = is_read_io(rw) ? &sbi->read_io : &sbi->write_io[btype];
> +
> + mutex_lock(&io->io_mutex);
> +
> + /* change META to META_FLUSH in the checkpoint procedure */
> + if (type >= META_FLUSH) {
> + io->fio.type = META_FLUSH;
> + io->fio.rw = WRITE_FLUSH_FUA | REQ_META | REQ_PRIO;
> + }
> + __submit_merged_bio(io);
> + mutex_unlock(&io->io_mutex);
> +}
> +
> +/*
> + * Fill the locked page with data located in the block address.
> + * Return unlocked page.
> + */
> +int f2fs_submit_page_bio(struct f2fs_sb_info *sbi, struct page *page,
> + block_t blk_addr, int rw)
> +{
> + struct bio *bio;
> +
> + trace_f2fs_submit_page_bio(page, blk_addr, rw);
> +
> + /* Allocate a new bio */
> + bio = __bio_alloc(sbi, blk_addr, 1, is_read_io(rw));
> +
> + if (bio_add_page(bio, page, PAGE_CACHE_SIZE, 0) < PAGE_CACHE_SIZE) {
> + bio_put(bio);
> + f2fs_put_page(page, 1);
> + return -EFAULT;
> + }
> +
> + submit_bio(rw, bio);
> + return 0;
> +}
> +
> +void f2fs_submit_page_mbio(struct f2fs_sb_info *sbi, struct page *page,
> + block_t blk_addr, struct f2fs_io_info *fio)
> +{
> + enum page_type btype = PAGE_TYPE_OF_BIO(fio->type);
> + struct f2fs_bio_info *io;
> + bool is_read = is_read_io(fio->rw);
> +
> + io = is_read ? &sbi->read_io : &sbi->write_io[btype];
> +
> + verify_block_addr(sbi, blk_addr);
> +
> + mutex_lock(&io->io_mutex);
> +
> + if (!is_read)
> + inc_page_count(sbi, F2FS_WRITEBACK);
> +
> + if (io->bio && (io->last_block_in_bio != blk_addr - 1 ||
> + io->fio.rw != fio->rw))
> + __submit_merged_bio(io);
> +alloc_new:
> + if (io->bio == NULL) {
> + int bio_blocks = MAX_BIO_BLOCKS(max_hw_blocks(sbi));
> +
> + io->bio = __bio_alloc(sbi, blk_addr, bio_blocks, is_read);
> + io->fio = *fio;
> + }
> +
> + if (bio_add_page(io->bio, page, PAGE_CACHE_SIZE, 0) <
> + PAGE_CACHE_SIZE) {
> + __submit_merged_bio(io);
> + goto alloc_new;
> + }
> +
> + io->last_block_in_bio = blk_addr;
> +
> + mutex_unlock(&io->io_mutex);
> + trace_f2fs_submit_page_mbio(page, fio->rw, fio->type, blk_addr);
> +}
> +
> /*
> * Lock ordering for the change of data block address:
> * ->data_page
> diff --cc include/trace/events/f2fs.h
> index 3b9f28dfc849,bd3ee4fbe7a7..67f38faac589
> --- a/include/trace/events/f2fs.h
> +++ b/include/trace/events/f2fs.h
> @@@ -627,16 -614,16 +627,16 @@@ DECLARE_EVENT_CLASS(f2fs__submit_bio
>
> TP_fast_assign(
> __entry->dev = sb->s_dev;
> - __entry->btype = btype;
> - __entry->sync = sync;
> + __entry->rw = rw;
> + __entry->type = type;
> - __entry->sector = bio->bi_sector;
> - __entry->size = bio->bi_size;
> + __entry->sector = bio->bi_iter.bi_sector;
> + __entry->size = bio->bi_iter.bi_size;
> ),
>
> - TP_printk("dev = (%d,%d), type = %s, io = %s, sector = %lld, size = %u",
> + TP_printk("dev = (%d,%d), %s%s, %s, sector = %lld, size = %u",
> show_dev(__entry),
> - show_block_type(__entry->btype),
> - __entry->sync ? "sync" : "no sync",
> + show_bio_type(__entry->rw),
> + show_block_type(__entry->type),
> (unsigned long long)__entry->sector,
> __entry->size)
> );
>
--
Jaegeuk Kim
Samsung
next prev parent reply other threads:[~2014-01-29 0:46 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-01-28 22:43 Jens Axboe
2014-01-28 22:52 ` Jens Axboe
2014-01-29 0:05 ` Stephen Rothwell
2014-01-29 0:45 ` Jaegeuk Kim [this message]
2014-01-30 19:26 ` Linus Torvalds
2014-01-29 9:26 ` Geert Uytterhoeven
2014-01-29 15:17 ` Jens Axboe
2014-01-29 15:31 ` Geert Uytterhoeven
2014-01-29 15:40 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1390956313.25542.64.camel@kjgkr \
--to=jaegeuk.kim@samsung.com \
--cc=axboe@kernel.dk \
--cc=linux-kernel@vger.kernel.org \
--cc=sfr@canb.auug.org.au \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®