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

Commit eae9acd1 authored by David Woodhouse's avatar David Woodhouse Committed by Jens Axboe
Browse files

Support 'discard sectors' operation in translation layer support core

parent 8c540a96
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -32,6 +32,14 @@ struct mtd_blkcore_priv {
	spinlock_t queue_lock;
};

static int blktrans_discard_request(struct request_queue *q,
				    struct request *req)
{
	req->cmd_type = REQ_TYPE_LINUX_BLOCK;
	req->cmd[0] = REQ_LB_OP_DISCARD;
	return 0;
}

static int do_blktrans_request(struct mtd_blktrans_ops *tr,
			       struct mtd_blktrans_dev *dev,
			       struct request *req)
@@ -44,6 +52,10 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,

	buf = req->buffer;

	if (req->cmd_type == REQ_TYPE_LINUX_BLOCK &&
	    req->cmd[0] == REQ_LB_OP_DISCARD)
		return !tr->discard(dev, block, nsect);

	if (!blk_fs_request(req))
		return 0;

@@ -367,6 +379,10 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr)

	tr->blkcore_priv->rq->queuedata = tr;
	blk_queue_hardsect_size(tr->blkcore_priv->rq, tr->blksize);
	if (tr->discard)
		blk_queue_set_discard(tr->blkcore_priv->rq,
				      blktrans_discard_request);

	tr->blkshift = ffs(tr->blksize) - 1;

	tr->blkcore_priv->thread = kthread_run(mtd_blktrans_thread, tr,
+1 −0
Original line number Diff line number Diff line
@@ -81,6 +81,7 @@ enum {
	 */
	REQ_LB_OP_EJECT	= 0x40,		/* eject request */
	REQ_LB_OP_FLUSH = 0x41,		/* flush device */
	REQ_LB_OP_DISCARD = 0x42,	/* discard sectors */
};

/*
+2 −0
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@ struct mtd_blktrans_ops {
		    unsigned long block, char *buffer);
	int (*writesect)(struct mtd_blktrans_dev *dev,
		     unsigned long block, char *buffer);
	int (*discard)(struct mtd_blktrans_dev *dev,
		       unsigned long block, unsigned nr_blocks);

	/* Block layer ioctls */
	int (*getgeo)(struct mtd_blktrans_dev *dev, struct hd_geometry *geo);