Skip to content

Commit eae9acd

Browse files
David WoodhouseJens Axboe
authored andcommitted
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>
1 parent 8c540a9 commit eae9acd

3 files changed

Lines changed: 19 additions & 0 deletions

File tree

drivers/mtd/mtd_blkdevs.c

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ struct mtd_blkcore_priv {
3232
spinlock_t queue_lock;
3333
};
3434

35+
static int blktrans_discard_request(struct request_queue *q,
36+
struct request *req)
37+
{
38+
req->cmd_type = REQ_TYPE_LINUX_BLOCK;
39+
req->cmd[0] = REQ_LB_OP_DISCARD;
40+
return 0;
41+
}
42+
3543
static int do_blktrans_request(struct mtd_blktrans_ops *tr,
3644
struct mtd_blktrans_dev *dev,
3745
struct request *req)
@@ -44,6 +52,10 @@ static int do_blktrans_request(struct mtd_blktrans_ops *tr,
4452

4553
buf = req->buffer;
4654

55+
if (req->cmd_type == REQ_TYPE_LINUX_BLOCK &&
56+
req->cmd[0] == REQ_LB_OP_DISCARD)
57+
return !tr->discard(dev, block, nsect);
58+
4759
if (!blk_fs_request(req))
4860
return 0;
4961

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

368380
tr->blkcore_priv->rq->queuedata = tr;
369381
blk_queue_hardsect_size(tr->blkcore_priv->rq, tr->blksize);
382+
if (tr->discard)
383+
blk_queue_set_discard(tr->blkcore_priv->rq,
384+
blktrans_discard_request);
385+
370386
tr->blkshift = ffs(tr->blksize) - 1;
371387

372388
tr->blkcore_priv->thread = kthread_run(mtd_blktrans_thread, tr,

include/linux/blkdev.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ enum {
8181
*/
8282
REQ_LB_OP_EJECT = 0x40, /* eject request */
8383
REQ_LB_OP_FLUSH = 0x41, /* flush device */
84+
REQ_LB_OP_DISCARD = 0x42, /* discard sectors */
8485
};
8586

8687
/*

include/linux/mtd/blktrans.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ struct mtd_blktrans_ops {
4141
unsigned long block, char *buffer);
4242
int (*writesect)(struct mtd_blktrans_dev *dev,
4343
unsigned long block, char *buffer);
44+
int (*discard)(struct mtd_blktrans_dev *dev,
45+
unsigned long block, unsigned nr_blocks);
4446

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

0 commit comments

Comments
 (0)