Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd3932ed authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

block: remove BLKDEV_IFL_WAIT



All the blkdev_issue_* helpers can only sanely be used for synchronous
caller.  To issue cache flushes or barriers asynchronously the caller needs
to set up a bio by itself with a completion callback to move the asynchronous
state machine ahead.  So drop the BLKDEV_IFL_WAIT flag that is always
specified when calling blkdev_issue_* and also remove the now unused flags
argument to blkdev_issue_flush and blkdev_issue_zeroout.  For
blkdev_issue_discard we need to keep it for the secure discard flag, which
gains a more descriptive name and loses the bitops vs flag confusion.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 8786fb70
Loading
Loading
Loading
Loading
+11 −14
Original line number Original line Diff line number Diff line
@@ -205,7 +205,6 @@ static void bio_end_flush(struct bio *bio, int err)
 * @bdev:	blockdev to issue flush for
 * @bdev:	blockdev to issue flush for
 * @gfp_mask:	memory allocation flags (for bio_alloc)
 * @gfp_mask:	memory allocation flags (for bio_alloc)
 * @error_sector:	error sector
 * @error_sector:	error sector
 * @flags:	BLKDEV_IFL_* flags to control behaviour
 *
 *
 * Description:
 * Description:
 *    Issue a flush for the block device in question. Caller can supply
 *    Issue a flush for the block device in question. Caller can supply
@@ -214,7 +213,7 @@ static void bio_end_flush(struct bio *bio, int err)
 *    request was pushed in some internal queue for later handling.
 *    request was pushed in some internal queue for later handling.
 */
 */
int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,
int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,
		sector_t *error_sector, unsigned long flags)
		sector_t *error_sector)
{
{
	DECLARE_COMPLETION_ONSTACK(wait);
	DECLARE_COMPLETION_ONSTACK(wait);
	struct request_queue *q;
	struct request_queue *q;
@@ -240,13 +239,12 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,
	bio = bio_alloc(gfp_mask, 0);
	bio = bio_alloc(gfp_mask, 0);
	bio->bi_end_io = bio_end_flush;
	bio->bi_end_io = bio_end_flush;
	bio->bi_bdev = bdev;
	bio->bi_bdev = bdev;
	if (test_bit(BLKDEV_WAIT, &flags))
	bio->bi_private = &wait;
	bio->bi_private = &wait;


	bio_get(bio);
	bio_get(bio);
	submit_bio(WRITE_FLUSH, bio);
	submit_bio(WRITE_FLUSH, bio);
	if (test_bit(BLKDEV_WAIT, &flags)) {
	wait_for_completion(&wait);
	wait_for_completion(&wait);

	/*
	/*
	 * The driver must store the error location in ->bi_sector, if
	 * The driver must store the error location in ->bi_sector, if
	 * it supports it. For non-stacked drivers, this should be
	 * it supports it. For non-stacked drivers, this should be
@@ -254,7 +252,6 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,
	 */
	 */
	if (error_sector)
	if (error_sector)
               *error_sector = bio->bi_sector;
               *error_sector = bio->bi_sector;
	}


	if (!bio_flagged(bio, BIO_UPTODATE))
	if (!bio_flagged(bio, BIO_UPTODATE))
		ret = -EIO;
		ret = -EIO;
+8 −13
Original line number Original line Diff line number Diff line
@@ -61,7 +61,7 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
		max_discard_sectors &= ~(disc_sects - 1);
		max_discard_sectors &= ~(disc_sects - 1);
	}
	}


	if (flags & BLKDEV_IFL_SECURE) {
	if (flags & BLKDEV_DISCARD_SECURE) {
		if (!blk_queue_secdiscard(q))
		if (!blk_queue_secdiscard(q))
			return -EOPNOTSUPP;
			return -EOPNOTSUPP;
		type |= REQ_SECURE;
		type |= REQ_SECURE;
@@ -77,7 +77,6 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
		bio->bi_sector = sector;
		bio->bi_sector = sector;
		bio->bi_end_io = blkdev_discard_end_io;
		bio->bi_end_io = blkdev_discard_end_io;
		bio->bi_bdev = bdev;
		bio->bi_bdev = bdev;
		if (flags & BLKDEV_IFL_WAIT)
		bio->bi_private = &wait;
		bio->bi_private = &wait;


		if (nr_sects > max_discard_sectors) {
		if (nr_sects > max_discard_sectors) {
@@ -92,7 +91,6 @@ int blkdev_issue_discard(struct block_device *bdev, sector_t sector,
		bio_get(bio);
		bio_get(bio);
		submit_bio(type, bio);
		submit_bio(type, bio);


		if (flags & BLKDEV_IFL_WAIT)
		wait_for_completion(&wait);
		wait_for_completion(&wait);


		if (bio_flagged(bio, BIO_EOPNOTSUPP))
		if (bio_flagged(bio, BIO_EOPNOTSUPP))
@@ -139,7 +137,6 @@ static void bio_batch_end_io(struct bio *bio, int err)
 * @sector:	start sector
 * @sector:	start sector
 * @nr_sects:	number of sectors to write
 * @nr_sects:	number of sectors to write
 * @gfp_mask:	memory allocation flags (for bio_alloc)
 * @gfp_mask:	memory allocation flags (for bio_alloc)
 * @flags:	BLKDEV_IFL_* flags to control behaviour
 *
 *
 * Description:
 * Description:
 *  Generate and issue number of bios with zerofiled pages.
 *  Generate and issue number of bios with zerofiled pages.
@@ -148,7 +145,7 @@ static void bio_batch_end_io(struct bio *bio, int err)
 */
 */


int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
			sector_t nr_sects, gfp_t gfp_mask, unsigned long flags)
			sector_t nr_sects, gfp_t gfp_mask)
{
{
	int ret;
	int ret;
	struct bio *bio;
	struct bio *bio;
@@ -174,7 +171,6 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
		bio->bi_sector = sector;
		bio->bi_sector = sector;
		bio->bi_bdev   = bdev;
		bio->bi_bdev   = bdev;
		bio->bi_end_io = bio_batch_end_io;
		bio->bi_end_io = bio_batch_end_io;
		if (flags & BLKDEV_IFL_WAIT)
		bio->bi_private = &bb;
		bio->bi_private = &bb;


		while (nr_sects != 0) {
		while (nr_sects != 0) {
@@ -193,7 +189,6 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
		submit_bio(WRITE, bio);
		submit_bio(WRITE, bio);
	}
	}


	if (flags & BLKDEV_IFL_WAIT)
	/* Wait for bios in-flight */
	/* Wait for bios in-flight */
	while (issued != atomic_read(&bb.done))
	while (issued != atomic_read(&bb.done))
		wait_for_completion(&wait);
		wait_for_completion(&wait);
+2 −2
Original line number Original line Diff line number Diff line
@@ -116,7 +116,7 @@ static int blkdev_reread_part(struct block_device *bdev)
static int blk_ioctl_discard(struct block_device *bdev, uint64_t start,
static int blk_ioctl_discard(struct block_device *bdev, uint64_t start,
			     uint64_t len, int secure)
			     uint64_t len, int secure)
{
{
	unsigned long flags = BLKDEV_IFL_WAIT;
	unsigned long flags = 0;


	if (start & 511)
	if (start & 511)
		return -EINVAL;
		return -EINVAL;
@@ -128,7 +128,7 @@ static int blk_ioctl_discard(struct block_device *bdev, uint64_t start,
	if (start + len > (bdev->bd_inode->i_size >> 9))
	if (start + len > (bdev->bd_inode->i_size >> 9))
		return -EINVAL;
		return -EINVAL;
	if (secure)
	if (secure)
		flags |= BLKDEV_IFL_SECURE;
		flags |= BLKDEV_DISCARD_SECURE;
	return blkdev_issue_discard(bdev, start, len, GFP_KERNEL, flags);
	return blkdev_issue_discard(bdev, start, len, GFP_KERNEL, flags);
}
}


+1 −2
Original line number Original line Diff line number Diff line
@@ -2321,8 +2321,7 @@ static inline void drbd_md_flush(struct drbd_conf *mdev)
	if (test_bit(MD_NO_BARRIER, &mdev->flags))
	if (test_bit(MD_NO_BARRIER, &mdev->flags))
		return;
		return;


	r = blkdev_issue_flush(mdev->ldev->md_bdev, GFP_KERNEL, NULL,
	r = blkdev_issue_flush(mdev->ldev->md_bdev, GFP_KERNEL, NULL);
			BLKDEV_IFL_WAIT);
	if (r) {
	if (r) {
		set_bit(MD_NO_BARRIER, &mdev->flags);
		set_bit(MD_NO_BARRIER, &mdev->flags);
		dev_err(DEV, "meta data flush failed with status %d, disabling md-flushes\n", r);
		dev_err(DEV, "meta data flush failed with status %d, disabling md-flushes\n", r);
+1 −1
Original line number Original line Diff line number Diff line
@@ -975,7 +975,7 @@ static enum finish_epoch drbd_flush_after_epoch(struct drbd_conf *mdev, struct d


	if (mdev->write_ordering >= WO_bdev_flush && get_ldev(mdev)) {
	if (mdev->write_ordering >= WO_bdev_flush && get_ldev(mdev)) {
		rv = blkdev_issue_flush(mdev->ldev->backing_bdev, GFP_KERNEL,
		rv = blkdev_issue_flush(mdev->ldev->backing_bdev, GFP_KERNEL,
					NULL, BLKDEV_IFL_WAIT);
					NULL);
		if (rv) {
		if (rv) {
			dev_err(DEV, "local disk flush failed with status %d\n", rv);
			dev_err(DEV, "local disk flush failed with status %d\n", rv);
			/* would rather check on EOPNOTSUPP, but that is not reliable.
			/* would rather check on EOPNOTSUPP, but that is not reliable.
Loading