aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/loop.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2010-10-22 20:07:18 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-10-22 20:07:18 -0400
commita2887097f25cd38cadfc11d10769e2b349fb5eca (patch)
treecd4adcb305365d6ba9acd2c02d4eb9d0125c6f8d /drivers/block/loop.c
parent8abfc6e7a45eb74e51904bbae676fae008b11366 (diff)
parent005a1d15f5a6b2bb4ada80349513effbf22b4588 (diff)
Merge branch 'for-2.6.37/barrier' of git://git.kernel.dk/linux-2.6-block
* 'for-2.6.37/barrier' of git://git.kernel.dk/linux-2.6-block: (46 commits) xen-blkfront: disable barrier/flush write support Added blk-lib.c and blk-barrier.c was renamed to blk-flush.c block: remove BLKDEV_IFL_WAIT aic7xxx_old: removed unused 'req' variable block: remove the BH_Eopnotsupp flag block: remove the BLKDEV_IFL_BARRIER flag block: remove the WRITE_BARRIER flag swap: do not send discards as barriers fat: do not send discards as barriers ext4: do not send discards as barriers jbd2: replace barriers with explicit flush / FUA usage jbd2: Modify ASYNC_COMMIT code to not rely on queue draining on barrier jbd: replace barriers with explicit flush / FUA usage nilfs2: replace barriers with explicit flush / FUA usage reiserfs: replace barriers with explicit flush / FUA usage gfs2: replace barriers with explicit flush / FUA usage btrfs: replace barriers with explicit flush / FUA usage xfs: replace barriers with explicit flush / FUA usage block: pass gfp_mask and flags to sb_issue_discard dm: convey that all flushes are processed as empty ...
Diffstat (limited to 'drivers/block/loop.c')
-rw-r--r--drivers/block/loop.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index de3083b0a4f5..6c48b3545f84 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -479,17 +479,17 @@ static int do_bio_filebacked(struct loop_device *lo, struct bio *bio)
479 pos = ((loff_t) bio->bi_sector << 9) + lo->lo_offset; 479 pos = ((loff_t) bio->bi_sector << 9) + lo->lo_offset;
480 480
481 if (bio_rw(bio) == WRITE) { 481 if (bio_rw(bio) == WRITE) {
482 bool barrier = !!(bio->bi_rw & REQ_HARDBARRIER);
483 struct file *file = lo->lo_backing_file; 482 struct file *file = lo->lo_backing_file;
484 483
485 if (barrier) { 484 /* REQ_HARDBARRIER is deprecated */
486 if (unlikely(!file->f_op->fsync)) { 485 if (bio->bi_rw & REQ_HARDBARRIER) {
487 ret = -EOPNOTSUPP; 486 ret = -EOPNOTSUPP;
488 goto out; 487 goto out;
489 } 488 }
490 489
490 if (bio->bi_rw & REQ_FLUSH) {
491 ret = vfs_fsync(file, 0); 491 ret = vfs_fsync(file, 0);
492 if (unlikely(ret)) { 492 if (unlikely(ret && ret != -EINVAL)) {
493 ret = -EIO; 493 ret = -EIO;
494 goto out; 494 goto out;
495 } 495 }
@@ -497,9 +497,9 @@ static int do_bio_filebacked(struct loop_device *lo, struct bio *bio)
497 497
498 ret = lo_send(lo, bio, pos); 498 ret = lo_send(lo, bio, pos);
499 499
500 if (barrier && !ret) { 500 if ((bio->bi_rw & REQ_FUA) && !ret) {
501 ret = vfs_fsync(file, 0); 501 ret = vfs_fsync(file, 0);
502 if (unlikely(ret)) 502 if (unlikely(ret && ret != -EINVAL))
503 ret = -EIO; 503 ret = -EIO;
504 } 504 }
505 } else 505 } else
@@ -931,7 +931,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
931 lo->lo_queue->unplug_fn = loop_unplug; 931 lo->lo_queue->unplug_fn = loop_unplug;
932 932
933 if (!(lo_flags & LO_FLAGS_READ_ONLY) && file->f_op->fsync) 933 if (!(lo_flags & LO_FLAGS_READ_ONLY) && file->f_op->fsync)
934 blk_queue_ordered(lo->lo_queue, QUEUE_ORDERED_DRAIN); 934 blk_queue_flush(lo->lo_queue, REQ_FLUSH);
935 935
936 set_capacity(lo->lo_disk, size); 936 set_capacity(lo->lo_disk, size);
937 bd_set_size(bdev, size << 9); 937 bd_set_size(bdev, size << 9);