Re: [PATCH v3 3/4] fs: make _submit_bh consistent with generic bio chaining

2015-04-24 Thread Christoph Hellwig
On Thu, Apr 23, 2015 at 04:04:34PM -0700, Ming Lin wrote:
> From: Kent Overstreet 
> 
> Make _submit_bh() handle refcounting by increasing bio->bi_remaining,
> followed by bio_endio(). Since bio chaining was introduced with
> 196d38bccfcf ("block: Generic bio chaining"), refcounting should be
> done on bi_remaining instead of ancient bio_cnt. Doing that, calling
> convention can be consistent with the immutable biovecs API.

I think this and the copy & paste version in nilfs2 can just go away.
Since the big barrier to flush rewrite we will never fail FUA
and FLUSH requests with BIO_EOPNOTSUPP.  That error is just left
for DISCARD adn WRITE_SAME.  So something like the untested patch
below should take care of this:

diff --git a/block/bounce.c b/block/bounce.c
index ab21ba2..4bac725 100644
--- a/block/bounce.c
+++ b/block/bounce.c
@@ -128,9 +128,6 @@ static void bounce_end_io(struct bio *bio, mempool_t *pool, 
int err)
struct bio_vec *bvec, *org_vec;
int i;
 
-   if (test_bit(BIO_EOPNOTSUPP, &bio->bi_flags))
-   set_bit(BIO_EOPNOTSUPP, &bio_orig->bi_flags);
-
/*
 * free up bounce indirect pages used
 */
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 639f266..e8d7670 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -3225,11 +3225,8 @@ static int write_dev_supers(struct btrfs_device *device,
  */
 static void btrfs_end_empty_barrier(struct bio *bio, int err)
 {
-   if (err) {
-   if (err == -EOPNOTSUPP)
-   set_bit(BIO_EOPNOTSUPP, &bio->bi_flags);
+   if (err)
clear_bit(BIO_UPTODATE, &bio->bi_flags);
-   }
if (bio->bi_private)
complete(bio->bi_private);
bio_put(bio);
@@ -3257,11 +3254,7 @@ static int write_dev_flush(struct btrfs_device *device, 
int wait)
 
wait_for_completion(&device->flush_wait);
 
-   if (bio_flagged(bio, BIO_EOPNOTSUPP)) {
-   printk_in_rcu("BTRFS: disabling barriers on dev %s\n",
- rcu_str_deref(device->name));
-   device->nobarriers = 1;
-   } else if (!bio_flagged(bio, BIO_UPTODATE)) {
+   if (!bio_flagged(bio, BIO_UPTODATE)) {
ret = -EIO;
btrfs_dev_stat_inc_and_print(device,
BTRFS_DEV_STAT_FLUSH_ERRS);
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index d688cfe..6a44bea 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2767,8 +2767,6 @@ static int __must_check submit_one_bio(int rw, struct bio 
*bio,
else
btrfsic_submit_bio(rw, bio);
 
-   if (bio_flagged(bio, BIO_EOPNOTSUPP))
-   ret = -EOPNOTSUPP;
bio_put(bio);
return ret;
 }
diff --git a/fs/buffer.c b/fs/buffer.c
index c7a5602..efd85e0 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -2938,10 +2938,6 @@ static void end_bio_bh_io_sync(struct bio *bio, int err)
 {
struct buffer_head *bh = bio->bi_private;
 
-   if (err == -EOPNOTSUPP) {
-   set_bit(BIO_EOPNOTSUPP, &bio->bi_flags);
-   }
-
if (unlikely (test_bit(BIO_QUIET,&bio->bi_flags)))
set_bit(BH_Quiet, &bh->b_state);
 
@@ -3041,13 +3037,7 @@ int _submit_bh(int rw, struct buffer_head *bh, unsigned 
long bio_flags)
if (buffer_prio(bh))
rw |= REQ_PRIO;
 
-   bio_get(bio);
submit_bio(rw, bio);
-
-   if (bio_flagged(bio, BIO_EOPNOTSUPP))
-   ret = -EOPNOTSUPP;
-
-   bio_put(bio);
return ret;
 }
 EXPORT_SYMBOL_GPL(_submit_bh);
diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c
index 5765f88..c5d81e8 100644
--- a/fs/ext4/page-io.c
+++ b/fs/ext4/page-io.c
@@ -359,7 +359,6 @@ void ext4_io_submit(struct ext4_io_submit *io)
if (bio) {
bio_get(io->io_bio);
submit_bio(io->io_op, io->io_bio);
-   BUG_ON(bio_flagged(io->io_bio, BIO_EOPNOTSUPP));
bio_put(io->io_bio);
}
io->io_bio = NULL;
diff --git a/fs/nilfs2/segbuf.c b/fs/nilfs2/segbuf.c
index dc3a9efd..42468e5 100644
--- a/fs/nilfs2/segbuf.c
+++ b/fs/nilfs2/segbuf.c
@@ -343,11 +343,6 @@ static void nilfs_end_bio_write(struct bio *bio, int err)
const int uptodate = test_bit(BIO_UPTODATE, &bio->bi_flags);
struct nilfs_segment_buffer *segbuf = bio->bi_private;
 
-   if (err == -EOPNOTSUPP) {
-   set_bit(BIO_EOPNOTSUPP, &bio->bi_flags);
-   /* to be detected by nilfs_segbuf_submit_bio() */
-   }
-
if (!uptodate)
atomic_inc(&segbuf->sb_err);
 
@@ -374,15 +369,8 @@ static int nilfs_segbuf_submit_bio(struct 
nilfs_segment_buffer *segbuf,
 
bio->bi_end_io = nilfs_end_bio_write;
bio->bi_private = segbuf;
-   bio_get(bio);
submit_bio(mode, bio);
segbuf->sb_nbio++;
-   if (bio_flagged(bio, BIO_EOPN

[PATCH v3 3/4] fs: make _submit_bh consistent with generic bio chaining

2015-04-23 Thread Ming Lin
From: Kent Overstreet 

Make _submit_bh() handle refcounting by increasing bio->bi_remaining,
followed by bio_endio(). Since bio chaining was introduced with
196d38bccfcf ("block: Generic bio chaining"), refcounting should be
done on bi_remaining instead of ancient bio_cnt. Doing that, calling
convention can be consistent with the immutable biovecs API.

Cc: Christoph Hellwig 
Cc: Al Viro 
Cc: linux-fsde...@vger.kernel.org
Signed-off-by: Kent Overstreet 
[dpark: add more description in commit message]
[mlin: rebase as Jens is changing the bi_remaining rules]
Signed-off-by: Dongsu Park 
Signed-off-by: Ming Lin 
---
 fs/buffer.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/fs/buffer.c b/fs/buffer.c
index c7a5602..c1c0e0d 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -3041,13 +3041,13 @@ int _submit_bh(int rw, struct buffer_head *bh, unsigned 
long bio_flags)
if (buffer_prio(bh))
rw |= REQ_PRIO;
 
-   bio_get(bio);
+   bio_inc_remaining(bio);
submit_bio(rw, bio);
 
if (bio_flagged(bio, BIO_EOPNOTSUPP))
ret = -EOPNOTSUPP;
 
-   bio_put(bio);
+   bio_endio(bio, 0);
return ret;
 }
 EXPORT_SYMBOL_GPL(_submit_bh);
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/