Support 'discard sectors' operation in translation layer support core
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
8c540a96c1
commit
eae9acd13a
3 changed files with 19 additions and 0 deletions
|
@ -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,
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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 {
|
||||||
*/
|
*/
|
||||||
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 {
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue