*/
 static void btrfs_end_empty_barrier(struct bio *bio)
 {
-       if (bio->bi_private)
-               complete(bio->bi_private);
-       bio_put(bio);
+       complete(bio->bi_private);
 }
 
 /*
 static void write_dev_flush(struct btrfs_device *device)
 {
        struct request_queue *q = bdev_get_queue(device->bdev);
-       struct bio *bio;
+       struct bio *bio = device->flush_bio;
 
        if (!test_bit(QUEUE_FLAG_WC, &q->queue_flags))
                return;
 
-       /*
-        * one reference for us, and we leave it for the
-        * caller
-        */
-       device->flush_bio = NULL;
-       bio = btrfs_io_bio_alloc(0);
+       bio_reset(bio);
        bio->bi_end_io = btrfs_end_empty_barrier;
        bio->bi_bdev = device->bdev;
        bio->bi_opf = REQ_OP_WRITE | REQ_SYNC | REQ_PREFLUSH;
        init_completion(&device->flush_wait);
        bio->bi_private = &device->flush_wait;
-       device->flush_bio = bio;
 
-       bio_get(bio);
-       btrfsic_submit_bio(bio);
+       submit_bio(bio);
+       device->flush_bio_sent = 1;
 }
 
 /*
        int ret = 0;
        struct bio *bio = device->flush_bio;
 
-       if (!bio)
+       if (!device->flush_bio_sent)
                return 0;
 
+       device->flush_bio_sent = 0;
        wait_for_completion(&device->flush_wait);
 
        if (bio->bi_error) {
                                BTRFS_DEV_STAT_FLUSH_ERRS);
        }
 
-       /* drop the reference from the wait == 0 run */
-       bio_put(bio);
-       device->flush_bio = NULL;
-
        return ret;
 }
 
 
        if (!dev)
                return ERR_PTR(-ENOMEM);
 
+       /*
+        * Preallocate a bio that's always going to be used for flushing device
+        * barriers and matches the device lifespan
+        */
+       dev->flush_bio = bio_alloc_bioset(GFP_KERNEL, 0, NULL);
+       if (!dev->flush_bio) {
+               kfree(dev);
+               return ERR_PTR(-ENOMEM);
+       }
+       bio_get(dev->flush_bio);
+
        INIT_LIST_HEAD(&dev->dev_list);
        INIT_LIST_HEAD(&dev->dev_alloc_list);
        INIT_LIST_HEAD(&dev->resized_list);
 
        device = container_of(work, struct btrfs_device, rcu_work);
        rcu_string_free(device->name);
+       bio_put(device->flush_bio);
        kfree(device);
 }