|
@@ -95,7 +95,7 @@ struct blkfront_info
|
|
|
struct gnttab_free_callback callback;
|
|
|
struct blk_shadow shadow[BLK_RING_SIZE];
|
|
|
unsigned long shadow_free;
|
|
|
- int feature_barrier;
|
|
|
+ unsigned int feature_flush;
|
|
|
int is_ready;
|
|
|
};
|
|
|
|
|
@@ -418,25 +418,12 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
|
|
|
}
|
|
|
|
|
|
|
|
|
-static int xlvbd_barrier(struct blkfront_info *info)
|
|
|
+static void xlvbd_flush(struct blkfront_info *info)
|
|
|
{
|
|
|
- int err;
|
|
|
- const char *barrier;
|
|
|
-
|
|
|
- switch (info->feature_barrier) {
|
|
|
- case QUEUE_ORDERED_DRAIN: barrier = "enabled"; break;
|
|
|
- case QUEUE_ORDERED_NONE: barrier = "disabled"; break;
|
|
|
- default: return -EINVAL;
|
|
|
- }
|
|
|
-
|
|
|
- err = blk_queue_ordered(info->rq, info->feature_barrier);
|
|
|
-
|
|
|
- if (err)
|
|
|
- return err;
|
|
|
-
|
|
|
+ blk_queue_flush(info->rq, info->feature_flush);
|
|
|
printk(KERN_INFO "blkfront: %s: barriers %s\n",
|
|
|
- info->gd->disk_name, barrier);
|
|
|
- return 0;
|
|
|
+ info->gd->disk_name,
|
|
|
+ info->feature_flush ? "enabled" : "disabled");
|
|
|
}
|
|
|
|
|
|
|
|
@@ -515,7 +502,7 @@ static int xlvbd_alloc_gendisk(blkif_sector_t capacity,
|
|
|
info->rq = gd->queue;
|
|
|
info->gd = gd;
|
|
|
|
|
|
- xlvbd_barrier(info);
|
|
|
+ xlvbd_flush(info);
|
|
|
|
|
|
if (vdisk_info & VDISK_READONLY)
|
|
|
set_disk_ro(gd, 1);
|
|
@@ -661,8 +648,8 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
|
|
|
printk(KERN_WARNING "blkfront: %s: write barrier op failed\n",
|
|
|
info->gd->disk_name);
|
|
|
error = -EOPNOTSUPP;
|
|
|
- info->feature_barrier = QUEUE_ORDERED_NONE;
|
|
|
- xlvbd_barrier(info);
|
|
|
+ info->feature_flush = 0;
|
|
|
+ xlvbd_flush(info);
|
|
|
}
|
|
|
/* fall through */
|
|
|
case BLKIF_OP_READ:
|
|
@@ -1075,19 +1062,13 @@ static void blkfront_connect(struct blkfront_info *info)
|
|
|
/*
|
|
|
* If there's no "feature-barrier" defined, then it means
|
|
|
* we're dealing with a very old backend which writes
|
|
|
- * synchronously; draining will do what needs to get done.
|
|
|
+ * synchronously; nothing to do.
|
|
|
*
|
|
|
* If there are barriers, then we use flush.
|
|
|
- *
|
|
|
- * If barriers are not supported, then there's no much we can
|
|
|
- * do, so just set ordering to NONE.
|
|
|
*/
|
|
|
- if (err)
|
|
|
- info->feature_barrier = QUEUE_ORDERED_DRAIN;
|
|
|
- else if (barrier)
|
|
|
- info->feature_barrier = QUEUE_ORDERED_DRAIN_FLUSH;
|
|
|
- else
|
|
|
- info->feature_barrier = QUEUE_ORDERED_NONE;
|
|
|
+ info->feature_flush = 0;
|
|
|
+ if (!err && barrier)
|
|
|
+ info->feature_flush = REQ_FLUSH;
|
|
|
|
|
|
err = xlvbd_alloc_gendisk(sectors, info, binfo, sector_size);
|
|
|
if (err) {
|