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

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

block: add a flags argument to (__)blkdev_issue_zeroout



Turn the existing discard flag into a new BLKDEV_ZERO_UNMAP flag with
similar semantics, but without referring to diѕcard.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent c20cfc27
Loading
Loading
Loading
Loading
+14 −17
Original line number Diff line number Diff line
@@ -282,14 +282,18 @@ static int __blkdev_issue_write_zeroes(struct block_device *bdev,
 * @nr_sects:	number of sectors to write
 * @gfp_mask:	memory allocation flags (for bio_alloc)
 * @biop:	pointer to anchor bio
 * @discard:	discard flag
 * @flags:	controls detailed behavior
 *
 * Description:
 *  Generate and issue number of bios with zerofiled pages.
 *  Zero-fill a block range, either using hardware offload or by explicitly
 *  writing zeroes to the device.
 *
 *  If a device is using logical block provisioning, the underlying space will
 *  not be released if %flags contains BLKDEV_ZERO_NOUNMAP.
 */
int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
		sector_t nr_sects, gfp_t gfp_mask, struct bio **biop,
		bool discard)
		unsigned flags)
{
	int ret;
	int bi_size = 0;
@@ -337,28 +341,21 @@ EXPORT_SYMBOL(__blkdev_issue_zeroout);
 * @sector:	start sector
 * @nr_sects:	number of sectors to write
 * @gfp_mask:	memory allocation flags (for bio_alloc)
 * @discard:	whether to discard the block range
 * @flags:	controls detailed behavior
 *
 * Description:
 *  Zero-fill a block range.  If the discard flag is set and the block
 *  device guarantees that subsequent READ operations to the block range
 *  in question will return zeroes, the blocks will be discarded. Should
 *  the discard request fail, if the discard flag is not set, or if
 *  discard_zeroes_data is not supported, this function will resort to
 *  zeroing the blocks manually, thus provisioning (allocating,
 *  anchoring) them. If the block device supports WRITE ZEROES or WRITE SAME
 *  command(s), blkdev_issue_zeroout() will use it to optimize the process of
 *  clearing the block range. Otherwise the zeroing will be performed
 *  using regular WRITE calls.
 *  Zero-fill a block range, either using hardware offload or by explicitly
 *  writing zeroes to the device.  See __blkdev_issue_zeroout() for the
 *  valid values for %flags.
 */
int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
			 sector_t nr_sects, gfp_t gfp_mask, bool discard)
		sector_t nr_sects, gfp_t gfp_mask, unsigned flags)
{
	int ret;
	struct bio *bio = NULL;
	struct blk_plug plug;

	if (discard) {
	if (!(flags & BLKDEV_ZERO_NOUNMAP)) {
		if (!blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask,
				BLKDEV_DISCARD_ZERO))
			return 0;
@@ -366,7 +363,7 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,

	blk_start_plug(&plug);
	ret = __blkdev_issue_zeroout(bdev, sector, nr_sects, gfp_mask,
			&bio, discard);
			&bio, flags);
	if (ret == 0 && bio) {
		ret = submit_bio_wait(bio);
		bio_put(bio);
+1 −1
Original line number Diff line number Diff line
@@ -255,7 +255,7 @@ static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode,
	truncate_inode_pages_range(mapping, start, end);

	return blkdev_issue_zeroout(bdev, start >> 9, len >> 9, GFP_KERNEL,
				    false);
			BLKDEV_ZERO_NOUNMAP);
}

static int put_ushort(unsigned long arg, unsigned short val)
+6 −3
Original line number Diff line number Diff line
@@ -1499,19 +1499,22 @@ int drbd_issue_discard_or_zero_out(struct drbd_device *device, sector_t start, u
		tmp = start + granularity - sector_div(tmp, granularity);

		nr = tmp - start;
		err |= blkdev_issue_zeroout(bdev, start, nr, GFP_NOIO, 0);
		err |= blkdev_issue_zeroout(bdev, start, nr, GFP_NOIO,
				BLKDEV_ZERO_NOUNMAP);
		nr_sectors -= nr;
		start = tmp;
	}
	while (nr_sectors >= granularity) {
		nr = min_t(sector_t, nr_sectors, max_discard_sectors);
		err |= blkdev_issue_discard(bdev, start, nr, GFP_NOIO, 0);
		err |= blkdev_issue_discard(bdev, start, nr, GFP_NOIO,
				BLKDEV_ZERO_NOUNMAP);
		nr_sectors -= nr;
		start += nr;
	}
 zero_out:
	if (nr_sectors) {
		err |= blkdev_issue_zeroout(bdev, start, nr_sectors, GFP_NOIO, 0);
		err |= blkdev_issue_zeroout(bdev, start, nr_sectors, GFP_NOIO,
				BLKDEV_ZERO_NOUNMAP);
	}
	return err != 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -184,7 +184,7 @@ static void nvmet_execute_write_zeroes(struct nvmet_req *req)
		(req->ns->blksize_shift - 9)) + 1;

	if (__blkdev_issue_zeroout(req->ns->bdev, sector, nr_sector,
				GFP_KERNEL, &bio, true))
				GFP_KERNEL, &bio, 0))
		status = NVME_SC_INTERNAL | NVME_SC_DNR;

	if (bio) {
+1 −1
Original line number Diff line number Diff line
@@ -2105,7 +2105,7 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start,
	case FALLOC_FL_ZERO_RANGE:
	case FALLOC_FL_ZERO_RANGE | FALLOC_FL_KEEP_SIZE:
		error = blkdev_issue_zeroout(bdev, start >> 9, len >> 9,
					    GFP_KERNEL, false);
					    GFP_KERNEL, BLKDEV_ZERO_NOUNMAP);
		break;
	case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE:
		/* Only punch if the device can do zeroing discard. */
Loading