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

Support 'discard sectors' operation in translation layer support core

Signed-off-by: default avatarDavid Woodhouse <David.Woodhouse@intel.com>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 8c540a96
...@@ -32,6 +32,14 @@ struct mtd_blkcore_priv { ...@@ -32,6 +32,14 @@ struct mtd_blkcore_priv {
spinlock_t queue_lock; 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, static int do_blktrans_request(struct mtd_blktrans_ops *tr,
struct mtd_blktrans_dev *dev, struct mtd_blktrans_dev *dev,
struct request *req) struct request *req)
...@@ -44,6 +52,10 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr, ...@@ -44,6 +52,10 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
buf = req->buffer; 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)) if (!blk_fs_request(req))
return 0; return 0;
...@@ -367,6 +379,10 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr) ...@@ -367,6 +379,10 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr)
tr->blkcore_priv->rq->queuedata = tr; tr->blkcore_priv->rq->queuedata = tr;
blk_queue_hardsect_size(tr->blkcore_priv->rq, tr->blksize); 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->blkshift = ffs(tr->blksize) - 1;
tr->blkcore_priv->thread = kthread_run(mtd_blktrans_thread, tr, tr->blkcore_priv->thread = kthread_run(mtd_blktrans_thread, tr,
......
...@@ -81,6 +81,7 @@ enum { ...@@ -81,6 +81,7 @@ enum {
*/ */
REQ_LB_OP_EJECT = 0x40, /* eject request */ REQ_LB_OP_EJECT = 0x40, /* eject request */
REQ_LB_OP_FLUSH = 0x41, /* flush device */ REQ_LB_OP_FLUSH = 0x41, /* flush device */
REQ_LB_OP_DISCARD = 0x42, /* discard sectors */
}; };
/* /*
......
...@@ -41,6 +41,8 @@ struct mtd_blktrans_ops { ...@@ -41,6 +41,8 @@ struct mtd_blktrans_ops {
unsigned long block, char *buffer); unsigned long block, char *buffer);
int (*writesect)(struct mtd_blktrans_dev *dev, int (*writesect)(struct mtd_blktrans_dev *dev,
unsigned long block, char *buffer); unsigned long block, char *buffer);
int (*discard)(struct mtd_blktrans_dev *dev,
unsigned long block, unsigned nr_blocks);
/* Block layer ioctls */ /* Block layer ioctls */
int (*getgeo)(struct mtd_blktrans_dev *dev, struct hd_geometry *geo); int (*getgeo)(struct mtd_blktrans_dev *dev, struct hd_geometry *geo);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment