summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-03-09 03:10:19 -0900
committerKent Overstreet <kent.overstreet@gmail.com>2016-10-07 12:35:46 -0800
commit1f1fa8feb068ee2f4856dc61f9fbb240edc719f9 (patch)
treed113ea72280cb1afb249df16605056dde5b1635d
parente0bd8982b0636fb237ce1e109a7267e9b5a550fe (diff)
bcachefs: another dio performance tweak
-rw-r--r--drivers/md/bcache/fs-io.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/md/bcache/fs-io.c b/drivers/md/bcache/fs-io.c
index 8da0a551b1a0..f1e5179231e7 100644
--- a/drivers/md/bcache/fs-io.c
+++ b/drivers/md/bcache/fs-io.c
@@ -1225,7 +1225,7 @@ static void bch_dio_read_complete(struct closure *cl)
struct dio_read *dio = container_of(cl, struct dio_read, cl);
dio->req->ki_complete(dio->req, dio->ret, 0);
- bio_put(&dio->rbio.bio);
+ bio_check_pages_dirty(&dio->rbio.bio); /* transfers ownership */
}
static void bch_direct_IO_read_endio(struct bio *bio)
@@ -1236,6 +1236,11 @@ static void bch_direct_IO_read_endio(struct bio *bio)
dio->ret = bio->bi_error;
closure_put(&dio->cl);
+}
+
+static void bch_direct_IO_read_split_endio(struct bio *bio)
+{
+ bch_direct_IO_read_endio(bio);
bio_check_pages_dirty(bio); /* transfers ownership */
}
@@ -1252,7 +1257,8 @@ static int bch_direct_IO_read(struct cache_set *c, struct kiocb *req,
loff_t i_size;
bio = bio_alloc_bioset(GFP_KERNEL, pages, bch_dio_read_bioset);
- bio_get(bio);
+
+ bio->bi_end_io = bch_direct_IO_read_endio;
dio = container_of(bio, struct dio_read, rbio.bio);
closure_init(&dio->cl, NULL);
@@ -1290,10 +1296,10 @@ static int bch_direct_IO_read(struct cache_set *c, struct kiocb *req,
while (iter->count) {
pages = iov_iter_npages(iter, BIO_MAX_PAGES);
bio = bio_alloc_bioset(GFP_KERNEL, pages, &c->bio_read);
+ bio->bi_end_io = bch_direct_IO_read_split_endio;
start:
bio_set_op_attrs(bio, REQ_OP_READ, REQ_SYNC);
bio->bi_iter.bi_sector = offset >> 9;
- bio->bi_end_io = bch_direct_IO_read_endio;
bio->bi_private = dio;
ret = bio_get_user_pages(bio, iter, 1);