mchristi at redhat.com
2016-Apr-15 10:40 UTC
[Ocfs2-devel] [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support
From: Mike Christie <mchristi at redhat.com>
The last patch added a REQ_OP_FLUSH for request_fn drivers
and the next patch renames REQ_FLUSH to REQ_PREFLUSH which
will be used by file systems and make_request_fn drivers so
they can send a write/flush combo.
This patch drops xen's use of REQ_FLUSH to track if it supports
REQ_OP_FLUSH requests, so REQ_FLUSH can be deleted.
v6:
- Dropped parts of patch handled by Jens's QUEUE_FLAG_WC/FUA
patches and modified patch to check feature_flush/fua bits.
Signed-off-by: Mike Christie <mchristi at redhat.com>
Reviewed-by: Hannes Reinecke <hare at suse.com>
---
drivers/block/xen-blkfront.c | 47 ++++++++++++++++++++++----------------------
1 file changed, 24 insertions(+), 23 deletions(-)
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
index f01691a..d6429e7 100644
--- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c
@@ -196,6 +196,7 @@ struct blkfront_info
unsigned int nr_ring_pages;
struct request_queue *rq;
unsigned int feature_flush;
+ unsigned int feature_fua;
unsigned int feature_discard:1;
unsigned int feature_secdiscard:1;
unsigned int discard_granularity;
@@ -763,19 +764,14 @@ static int blkif_queue_rw_req(struct request *req, struct
blkfront_ring_info *ri
* implement it the same way. (It's also a FLUSH+FUA,
* since it is guaranteed ordered WRT previous writes.)
*/
- switch (info->feature_flush &
- ((REQ_FLUSH|REQ_FUA))) {
- case REQ_FLUSH|REQ_FUA:
+ if (info->feature_flush && info->feature_fua)
ring_req->operation BLKIF_OP_WRITE_BARRIER;
- break;
- case REQ_FLUSH:
+ else if (info->feature_flush)
ring_req->operation BLKIF_OP_FLUSH_DISKCACHE;
- break;
- default:
+ else
ring_req->operation = 0;
- }
}
ring_req->u.rw.nr_segments = num_grant;
if (unlikely(require_extra_req)) {
@@ -866,9 +862,9 @@ static inline bool blkif_request_flush_invalid(struct
request *req,
{
return ((req->cmd_type != REQ_TYPE_FS) ||
((req->op == REQ_OP_FLUSH) &&
- !(info->feature_flush & REQ_FLUSH)) ||
+ !info->feature_flush) ||
((req->cmd_flags & REQ_FUA) &&
- !(info->feature_flush & REQ_FUA)));
+ !info->feature_fua));
}
static int blkif_queue_rq(struct blk_mq_hw_ctx *hctx,
@@ -985,24 +981,22 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16
sector_size,
return 0;
}
-static const char *flush_info(unsigned int feature_flush)
+static const char *flush_info(struct blkfront_info *info)
{
- switch (feature_flush & ((REQ_FLUSH | REQ_FUA))) {
- case REQ_FLUSH|REQ_FUA:
+ if (info->feature_flush && info->feature_fua)
return "barrier: enabled;";
- case REQ_FLUSH:
+ else if (info->feature_fua)
return "flush diskcache: enabled;";
- default:
+ else
return "barrier or flush: disabled;";
- }
}
static void xlvbd_flush(struct blkfront_info *info)
{
- blk_queue_write_cache(info->rq, info->feature_flush & REQ_FLUSH,
- info->feature_flush & REQ_FUA);
+ blk_queue_write_cache(info->rq, info->feature_flush ? true : false,
+ info->feature_flush ? true : false);
pr_info("blkfront: %s: %s %s %s %s %s\n",
- info->gd->disk_name, flush_info(info->feature_flush),
+ info->gd->disk_name, flush_info(info),
"persistent grants:", info->feature_persistent ?
"enabled;" : "disabled;", "indirect
descriptors:",
info->max_indirect_segments ? "enabled;" :
"disabled;");
@@ -1621,6 +1615,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id)
if (unlikely(error)) {
if (error == -EOPNOTSUPP)
error = 0;
+ info->feature_fua = 0;
info->feature_flush = 0;
xlvbd_flush(info);
}
@@ -2315,6 +2310,7 @@ static void blkfront_gather_backend_features(struct
blkfront_info *info)
unsigned int indirect_segments;
info->feature_flush = 0;
+ info->feature_fua = 0;
err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
"feature-barrier", "%d", &barrier,
@@ -2327,8 +2323,11 @@ static void blkfront_gather_backend_features(struct
blkfront_info *info)
*
* If there are barriers, then we use flush.
*/
- if (!err && barrier)
- info->feature_flush = REQ_FLUSH | REQ_FUA;
+ if (!err && barrier) {
+ info->feature_flush = 1;
+ info->feature_fua = 1;
+ }
+
/*
* And if there is "feature-flush-cache" use that above
* barriers.
@@ -2337,8 +2336,10 @@ static void blkfront_gather_backend_features(struct
blkfront_info *info)
"feature-flush-cache", "%d", &flush,
NULL);
- if (!err && flush)
- info->feature_flush = REQ_FLUSH;
+ if (!err && flush) {
+ info->feature_flush = 1;
+ info->feature_fua = 0;
+ }
err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
"feature-discard", "%d", &discard,
--
2.7.2
Juergen Gross
2016-Apr-15 10:50 UTC
[Ocfs2-devel] [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support
On 15/04/16 12:40, mchristi at redhat.com wrote:> From: Mike Christie <mchristi at redhat.com> > > The last patch added a REQ_OP_FLUSH for request_fn drivers > and the next patch renames REQ_FLUSH to REQ_PREFLUSH which > will be used by file systems and make_request_fn drivers so > they can send a write/flush combo. > > This patch drops xen's use of REQ_FLUSH to track if it supports > REQ_OP_FLUSH requests, so REQ_FLUSH can be deleted. > > v6: > - Dropped parts of patch handled by Jens's QUEUE_FLAG_WC/FUA > patches and modified patch to check feature_flush/fua bits. > > Signed-off-by: Mike Christie <mchristi at redhat.com> > Reviewed-by: Hannes Reinecke <hare at suse.com> > --- > drivers/block/xen-blkfront.c | 47 ++++++++++++++++++++++---------------------- > 1 file changed, 24 insertions(+), 23 deletions(-) > > diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c > index f01691a..d6429e7 100644 > --- a/drivers/block/xen-blkfront.c > +++ b/drivers/block/xen-blkfront.c...> @@ -985,24 +981,22 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size, > return 0; > } > > -static const char *flush_info(unsigned int feature_flush) > +static const char *flush_info(struct blkfront_info *info) > { > - switch (feature_flush & ((REQ_FLUSH | REQ_FUA))) { > - case REQ_FLUSH|REQ_FUA: > + if (info->feature_flush && info->feature_fua) > return "barrier: enabled;"; > - case REQ_FLUSH: > + else if (info->feature_fua)Shouldn't this test feature_flush?> return "flush diskcache: enabled;"; > - default: > + else > return "barrier or flush: disabled;"; > - } > } > > static void xlvbd_flush(struct blkfront_info *info) > { > - blk_queue_write_cache(info->rq, info->feature_flush & REQ_FLUSH, > - info->feature_flush & REQ_FUA); > + blk_queue_write_cache(info->rq, info->feature_flush ? true : false, > + info->feature_flush ? true : false);And here the second test should be feature_fua?> pr_info("blkfront: %s: %s %s %s %s %s\n", > - info->gd->disk_name, flush_info(info->feature_flush), > + info->gd->disk_name, flush_info(info), > "persistent grants:", info->feature_persistent ? > "enabled;" : "disabled;", "indirect descriptors:", > info->max_indirect_segments ? "enabled;" : "disabled;");Juergen
Mike Christie
2016-Apr-15 18:58 UTC
[Ocfs2-devel] [PATCH 41/42] block: do not use REQ_FLUSH for tracking flush support
On 04/15/2016 05:50 AM, Juergen Gross wrote:> On 15/04/16 12:40, mchristi at redhat.com wrote: >> From: Mike Christie <mchristi at redhat.com> >> >> The last patch added a REQ_OP_FLUSH for request_fn drivers >> and the next patch renames REQ_FLUSH to REQ_PREFLUSH which >> will be used by file systems and make_request_fn drivers so >> they can send a write/flush combo. >> >> This patch drops xen's use of REQ_FLUSH to track if it supports >> REQ_OP_FLUSH requests, so REQ_FLUSH can be deleted. >> >> v6: >> - Dropped parts of patch handled by Jens's QUEUE_FLAG_WC/FUA >> patches and modified patch to check feature_flush/fua bits. >> >> Signed-off-by: Mike Christie <mchristi at redhat.com> >> Reviewed-by: Hannes Reinecke <hare at suse.com> >> --- >> drivers/block/xen-blkfront.c | 47 ++++++++++++++++++++++---------------------- >> 1 file changed, 24 insertions(+), 23 deletions(-) >> >> diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c >> index f01691a..d6429e7 100644 >> --- a/drivers/block/xen-blkfront.c >> +++ b/drivers/block/xen-blkfront.c > > ... > >> @@ -985,24 +981,22 @@ static int xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size, >> return 0; >> } >> >> -static const char *flush_info(unsigned int feature_flush) >> +static const char *flush_info(struct blkfront_info *info) >> { >> - switch (feature_flush & ((REQ_FLUSH | REQ_FUA))) { >> - case REQ_FLUSH|REQ_FUA: >> + if (info->feature_flush && info->feature_fua) >> return "barrier: enabled;"; >> - case REQ_FLUSH: >> + else if (info->feature_fua) > > Shouldn't this test feature_flush? > >> return "flush diskcache: enabled;"; >> - default: >> + else >> return "barrier or flush: disabled;"; >> - } >> } >> >> static void xlvbd_flush(struct blkfront_info *info) >> { >> - blk_queue_write_cache(info->rq, info->feature_flush & REQ_FLUSH, >> - info->feature_flush & REQ_FUA); >> + blk_queue_write_cache(info->rq, info->feature_flush ? true : false, >> + info->feature_flush ? true : false); > > And here the second test should be feature_fua? >You are right. Will fix up and resend.