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

Commit ae18be11 authored by Li Dongyang's avatar Li Dongyang Committed by Konrad Rzeszutek Wilk
Browse files

xen-blkback: convert hole punching to discard request on loop devices



As of dfaa2ef6, loop devices support
discard request now. We could just issue a discard request, and
the loop driver will punch the hole for us, so we don't need to touch
the internals of loop device and punch the hole ourselves, Thanks.

V0->V1: rebased on devel/for-jens-3.3

Signed-off-by: default avatarLi Dongyang <lidongyang@novell.com>
Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
parent 42146352
Loading
Loading
Loading
Loading
+2 −17
Original line number Diff line number Diff line
@@ -39,9 +39,6 @@
#include <linux/list.h>
#include <linux/delay.h>
#include <linux/freezer.h>
#include <linux/loop.h>
#include <linux/falloc.h>
#include <linux/fs.h>

#include <xen/events.h>
#include <xen/page.h>
@@ -426,27 +423,15 @@ static int dispatch_discard_io(struct xen_blkif *blkif,
	blkif->st_ds_req++;

	xen_blkif_get(blkif);
	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY) {
	if (blkif->blk_backend_type == BLKIF_BACKEND_PHY ||
	    blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
		unsigned long secure = (blkif->vbd.discard_secure &&
			(req->u.discard.flag & BLKIF_DISCARD_SECURE)) ?
			BLKDEV_DISCARD_SECURE : 0;
		/* just forward the discard request */
		err = blkdev_issue_discard(bdev,
				req->u.discard.sector_number,
				req->u.discard.nr_sectors,
				GFP_KERNEL, secure);
	} else if (blkif->blk_backend_type == BLKIF_BACKEND_FILE) {
		/* punch a hole in the backing file */
		struct loop_device *lo = bdev->bd_disk->private_data;
		struct file *file = lo->lo_backing_file;

		if (file->f_op->fallocate)
			err = file->f_op->fallocate(file,
				FALLOC_FL_KEEP_SIZE | FALLOC_FL_PUNCH_HOLE,
				req->u.discard.sector_number << 9,
				req->u.discard.nr_sectors << 9);
		else
			err = -EOPNOTSUPP;
	} else
		err = -EOPNOTSUPP;