Today's linux-next merge of the block tree got conflicts in

        drivers/md/bcache/bcache.h
        drivers/md/bcache/bset.c
        drivers/md/bcache/journal.c
        drivers/md/bcache/request.c
        drivers/md/bcache/writeback.c

I've fixed them up (see below). Please verify that the resolution looks
good.

Thanks,
Thierry
---
diff --cc drivers/md/bcache/btree.c
index f42fc7e,117a12a..1ccb702
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@@ -633,10 -712,10 +707,10 @@@ static unsigned long bch_mca_scan(struc
                        break;
  
                if (++i > 3 &&
-                   !mca_reap(b, NULL, 0)) {
+                   !mca_reap(b, 0, false)) {
                        mca_data_free(b);
                        rw_unlock(true, b);
 -                      --nr;
 +                      freed++;
                }
        }
  
diff --cc drivers/md/bcache/request.c
index b6a74bc,231b108..9e1ff8e
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@@ -979,67 -1059,52 +1059,54 @@@ static void cached_dev_write(struct cac
  
        if (should_writeback(dc, s->orig_bio,
                             cache_mode(dc, bio),
-                            s->op.skip)) {
-               s->op.skip = false;
-               s->writeback = true;
+                            s->iop.bypass)) {
+               s->iop.bypass = false;
+               s->iop.writeback = true;
        }
  
-       if (s->op.skip)
-               goto skip;
- 
-       trace_bcache_write(s->orig_bio, s->writeback, s->op.skip);
+       if (s->iop.bypass) {
+               s->iop.bio = s->orig_bio;
+               bio_get(s->iop.bio);
  
-       if (!s->writeback) {
-               s->op.cache_bio = bio_clone_bioset(bio, GFP_NOIO,
-                                                  dc->disk.bio_split);
- 
-               closure_bio_submit(bio, cl, s->d);
-       } else {
+               if (!(bio->bi_rw & REQ_DISCARD) ||
+                   blk_queue_discard(bdev_get_queue(dc->bdev)))
+                       closure_bio_submit(bio, cl, s->d);
+       } else if (s->iop.writeback) {
                bch_writeback_add(dc);
 +              s->op.cache_bio = bio;
  
 -              if (s->iop.flush_journal) {
 +              if (bio->bi_rw & REQ_FLUSH) {
                        /* Also need to send a flush to the backing device */
 -                      s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
 -                                                    dc->disk.bio_split);
 +                      struct bio *flush = bio_alloc_bioset(0, GFP_NOIO,
 +                                                           
dc->disk.bio_split);
  
 -                      bio->bi_size = 0;
 -                      bio->bi_vcnt = 0;
 -                      closure_bio_submit(bio, cl, s->d);
 -              } else {
 -                      s->iop.bio = bio;
 +                      flush->bi_rw    = WRITE_FLUSH;
 +                      flush->bi_bdev  = bio->bi_bdev;
 +                      flush->bi_end_io = request_endio;
 +                      flush->bi_private = cl;
 +
 +                      closure_bio_submit(flush, cl, s->d);
                }
-       }
- out:
-       closure_call(&s->op.cl, bch_insert_data, NULL, cl);
-       continue_at(cl, cached_dev_write_complete, NULL);
- skip:
-       s->op.skip = true;
-       s->op.cache_bio = s->orig_bio;
-       bio_get(s->op.cache_bio);
+       } else {
+               s->iop.bio = bio_clone_bioset(bio, GFP_NOIO,
+                                             dc->disk.bio_split);
  
-       if ((bio->bi_rw & REQ_DISCARD) &&
-           !blk_queue_discard(bdev_get_queue(dc->bdev)))
-               goto out;
+               closure_bio_submit(bio, cl, s->d);
+       }
  
-       closure_bio_submit(bio, cl, s->d);
-       goto out;
+       closure_call(&s->iop.cl, bch_data_insert, NULL, cl);
+       continue_at(cl, cached_dev_write_complete, NULL);
  }
  
- static void request_nodata(struct cached_dev *dc, struct search *s)
+ static void cached_dev_nodata(struct closure *cl)
  {
-       struct closure *cl = &s->cl;
+       struct search *s = container_of(cl, struct search, cl);
        struct bio *bio = &s->bio.bio;
  
-       if (bio->bi_rw & REQ_DISCARD) {
-               request_write(dc, s);
-               return;
-       }
- 
-       if (s->op.flush_journal)
-               bch_journal_meta(s->op.c, cl);
+       if (s->iop.flush_journal)
+               bch_journal_meta(s->iop.c, cl);
  
+       /* If it's a flush, we send the flush to the backing device too */
        closure_bio_submit(bio, cl, s->d);
  
        continue_at(cl, cached_dev_bio_complete, NULL);
--
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/

Reply via email to