summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2010-06-17 09:54:32 +0200
committerJens Axboe <jaxboe@fusionio.com>2010-06-17 10:10:53 +0200
commitfbbf055692aeb25c54c49d9ca84532de836fbba0 (patch)
treedf058ee803db2b5c8362fd2f2e8f60eacbd9138a
parent79600aadcf35dd31ec284928cf45296fea98db61 (diff)
downloadlinux-fbbf055692aeb25c54c49d9ca84532de836fbba0.tar.gz
linux-fbbf055692aeb25c54c49d9ca84532de836fbba0.tar.bz2
linux-fbbf055692aeb25c54c49d9ca84532de836fbba0.zip
block: fix DISCARD_BARRIER requests
Filesystems assume that DISCARD_BARRIER are full barriers, so that they don't have to track in-progress discard operation when submitting new I/O. But currently we only treat them as elevator barriers, which don't actually do the nessecary queue drains. Also remove the unlikely around both the DISCARD and BARRIER requests - the happen far too often for a static mispredict. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
-rw-r--r--block/blk-core.c7
1 files changed, 2 insertions, 5 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index f84cce42fc58..3deca77e0254 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1149,13 +1149,10 @@ void init_request_from_bio(struct request *req, struct bio *bio)
else
req->cmd_flags |= bio->bi_rw & REQ_FAILFAST_MASK;
- if (unlikely(bio_rw_flagged(bio, BIO_RW_DISCARD))) {
+ if (bio_rw_flagged(bio, BIO_RW_DISCARD))
req->cmd_flags |= REQ_DISCARD;
- if (bio_rw_flagged(bio, BIO_RW_BARRIER))
- req->cmd_flags |= REQ_SOFTBARRIER;
- } else if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER)))
+ if (bio_rw_flagged(bio, BIO_RW_BARRIER))
req->cmd_flags |= REQ_HARDBARRIER;
-
if (bio_rw_flagged(bio, BIO_RW_SYNCIO))
req->cmd_flags |= REQ_RW_SYNC;
if (bio_rw_flagged(bio, BIO_RW_META))