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

Commit 289d088b authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe
Browse files

pd: replace ->special use with private data in the request



Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 61e7712e
Loading
Loading
Loading
Loading
+25 −5
Original line number Diff line number Diff line
@@ -242,6 +242,11 @@ struct pd_unit {

static struct pd_unit pd[PD_UNITS];

struct pd_req {
	/* for REQ_OP_DRV_IN: */
	enum action (*func)(struct pd_unit *disk);
};

static char pd_scratch[512];	/* scratch block buffer */

static char *pd_errs[17] = { "ERR", "INDEX", "ECC", "DRQ", "SEEK", "WRERR",
@@ -502,8 +507,9 @@ static enum action do_pd_io_start(void)

static enum action pd_special(void)
{
	enum action (*func)(struct pd_unit *) = pd_req->special;
	return func(pd_current);
	struct pd_req *req = blk_mq_rq_to_pdu(pd_req);

	return req->func(pd_current);
}

static int pd_next_buf(void)
@@ -767,12 +773,14 @@ static int pd_special_command(struct pd_unit *disk,
		      enum action (*func)(struct pd_unit *disk))
{
	struct request *rq;
	struct pd_req *req;

	rq = blk_get_request(disk->gd->queue, REQ_OP_DRV_IN, 0);
	if (IS_ERR(rq))
		return PTR_ERR(rq);
	req = blk_mq_rq_to_pdu(rq);

	rq->special = func;
	req->func = func;
	blk_execute_rq(disk->gd->queue, disk->gd, rq, 0);
	blk_put_request(rq);
	return 0;
@@ -892,9 +900,21 @@ static void pd_probe_drive(struct pd_unit *disk)
	disk->gd = p;
	p->private_data = disk;

	p->queue = blk_mq_init_sq_queue(&disk->tag_set, &pd_mq_ops, 2,
				BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING);
	memset(&disk->tag_set, 0, sizeof(disk->tag_set));
	disk->tag_set.ops = &pd_mq_ops;
	disk->tag_set.cmd_size = sizeof(struct pd_req);
	disk->tag_set.nr_hw_queues = 1;
	disk->tag_set.nr_maps = 1;
	disk->tag_set.queue_depth = 2;
	disk->tag_set.numa_node = NUMA_NO_NODE;
	disk->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_BLOCKING;

	if (blk_mq_alloc_tag_set(&disk->tag_set))
		return;

	p->queue = blk_mq_init_queue(&disk->tag_set);
	if (IS_ERR(p->queue)) {
		blk_mq_free_tag_set(&disk->tag_set);
		p->queue = NULL;
		return;
	}