diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-22 20:07:18 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-22 20:07:18 -0400 |
commit | a2887097f25cd38cadfc11d10769e2b349fb5eca (patch) | |
tree | cd4adcb305365d6ba9acd2c02d4eb9d0125c6f8d /drivers/block/loop.c | |
parent | 8abfc6e7a45eb74e51904bbae676fae008b11366 (diff) | |
parent | 005a1d15f5a6b2bb4ada80349513effbf22b4588 (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.c | 20 |
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); |