Skip to content

Commit 1028e4b

Browse files
committed
bsg: move bsg-lib parts outside of request queue
Get rid of the special bsg job fn and timeout handler, move them into a private bsg_set instead. Mostly from Christoph, with fixes for error handling and cleanups. Reviewed-by: Hannes Reinecke <hare@suse.com> Tested-by: Ming Lei <ming.lei@redhat.com> Reviewed-by: Omar Sandoval <osandov@fb.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 4316b79 commit 1028e4b

File tree

3 files changed

+31
-22
lines changed

3 files changed

+31
-22
lines changed

block/bsg-lib.c

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@
3131

3232
#define uptr64(val) ((void __user *)(uintptr_t)(val))
3333

34+
struct bsg_set {
35+
struct blk_mq_tag_set tag_set;
36+
bsg_job_fn *job_fn;
37+
bsg_timeout_fn *timeout_fn;
38+
};
39+
3440
static int bsg_transport_check_proto(struct sg_io_v4 *hdr)
3541
{
3642
if (hdr->protocol != BSG_PROTOCOL_SCSI ||
@@ -239,6 +245,8 @@ static blk_status_t bsg_queue_rq(struct blk_mq_hw_ctx *hctx,
239245
struct request_queue *q = hctx->queue;
240246
struct device *dev = q->queuedata;
241247
struct request *req = bd->rq;
248+
struct bsg_set *bset =
249+
container_of(q->tag_set, struct bsg_set, tag_set);
242250
int ret;
243251

244252
blk_mq_start_request(req);
@@ -249,7 +257,7 @@ static blk_status_t bsg_queue_rq(struct blk_mq_hw_ctx *hctx,
249257
if (!bsg_prepare_job(dev, req))
250258
return BLK_STS_IOERR;
251259

252-
ret = q->bsg_job_fn(blk_mq_rq_to_pdu(req));
260+
ret = bset->job_fn(blk_mq_rq_to_pdu(req));
253261
if (ret)
254262
return BLK_STS_IOERR;
255263

@@ -292,25 +300,25 @@ static void bsg_exit_rq(struct blk_mq_tag_set *set, struct request *req,
292300
void bsg_remove_queue(struct request_queue *q)
293301
{
294302
if (q) {
295-
struct blk_mq_tag_set *set = q->tag_set;
303+
struct bsg_set *bset =
304+
container_of(q->tag_set, struct bsg_set, tag_set);
296305

297306
bsg_unregister_queue(q);
298307
blk_cleanup_queue(q);
299-
blk_mq_free_tag_set(set);
300-
kfree(set);
308+
blk_mq_free_tag_set(&bset->tag_set);
309+
kfree(bset);
301310
}
302311
}
303312
EXPORT_SYMBOL_GPL(bsg_remove_queue);
304313

305314
static enum blk_eh_timer_return bsg_timeout(struct request *rq, bool reserved)
306315
{
307-
enum blk_eh_timer_return ret = BLK_EH_DONE;
308-
struct request_queue *q = rq->q;
309-
310-
if (q->bsg_job_timeout_fn)
311-
ret = q->bsg_job_timeout_fn(rq);
316+
struct bsg_set *bset =
317+
container_of(rq->q->tag_set, struct bsg_set, tag_set);
312318

313-
return ret;
319+
if (!bset->timeout_fn)
320+
return BLK_EH_DONE;
321+
return bset->timeout_fn(rq);
314322
}
315323

316324
static const struct blk_mq_ops bsg_mq_ops = {
@@ -330,16 +338,21 @@ static const struct blk_mq_ops bsg_mq_ops = {
330338
* @dd_job_size: size of LLD data needed for each job
331339
*/
332340
struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
333-
bsg_job_fn *job_fn, rq_timed_out_fn *timeout, int dd_job_size)
341+
bsg_job_fn *job_fn, bsg_timeout_fn *timeout, int dd_job_size)
334342
{
343+
struct bsg_set *bset;
335344
struct blk_mq_tag_set *set;
336345
struct request_queue *q;
337346
int ret = -ENOMEM;
338347

339-
set = kzalloc(sizeof(*set), GFP_KERNEL);
340-
if (!set)
348+
bset = kzalloc(sizeof(*bset), GFP_KERNEL);
349+
if (!bset)
341350
return ERR_PTR(-ENOMEM);
342351

352+
bset->job_fn = job_fn;
353+
bset->timeout_fn = timeout;
354+
355+
set = &bset->tag_set;
343356
set->ops = &bsg_mq_ops,
344357
set->nr_hw_queues = 1;
345358
set->queue_depth = 128;
@@ -356,8 +369,6 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
356369
}
357370

358371
q->queuedata = dev;
359-
q->bsg_job_fn = job_fn;
360-
q->bsg_job_timeout_fn = timeout;
361372
blk_queue_flag_set(QUEUE_FLAG_BIDI, q);
362373
blk_queue_rq_timeout(q, BLK_DEFAULT_SG_TIMEOUT);
363374

@@ -374,7 +385,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
374385
out_queue:
375386
blk_mq_free_tag_set(set);
376387
out_tag_set:
377-
kfree(set);
388+
kfree(bset);
378389
return ERR_PTR(ret);
379390
}
380391
EXPORT_SYMBOL_GPL(bsg_setup_queue);

include/linux/blkdev.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,6 @@ typedef bool (poll_q_fn) (struct request_queue *q, blk_qc_t);
312312
struct bio_vec;
313313
typedef void (softirq_done_fn)(struct request *);
314314
typedef int (dma_drain_needed_fn)(struct request *);
315-
typedef int (bsg_job_fn) (struct bsg_job *);
316315
typedef int (init_rq_fn)(struct request_queue *, struct request *, gfp_t);
317316
typedef void (exit_rq_fn)(struct request_queue *, struct request *);
318317

@@ -321,8 +320,6 @@ enum blk_eh_timer_return {
321320
BLK_EH_RESET_TIMER, /* reset timer and try again */
322321
};
323322

324-
typedef enum blk_eh_timer_return (rq_timed_out_fn)(struct request *);
325-
326323
enum blk_queue_state {
327324
Queue_down,
328325
Queue_up,
@@ -598,8 +595,6 @@ struct request_queue {
598595
atomic_t mq_freeze_depth;
599596

600597
#if defined(CONFIG_BLK_DEV_BSG)
601-
bsg_job_fn *bsg_job_fn;
602-
rq_timed_out_fn *bsg_job_timeout_fn;
603598
struct bsg_class_device bsg_dev;
604599
#endif
605600

include/linux/bsg-lib.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ struct device;
3131
struct scatterlist;
3232
struct request_queue;
3333

34+
typedef int (bsg_job_fn) (struct bsg_job *);
35+
typedef enum blk_eh_timer_return (bsg_timeout_fn)(struct request *);
36+
3437
struct bsg_buffer {
3538
unsigned int payload_len;
3639
int sg_cnt;
@@ -72,7 +75,7 @@ struct bsg_job {
7275
void bsg_job_done(struct bsg_job *job, int result,
7376
unsigned int reply_payload_rcv_len);
7477
struct request_queue *bsg_setup_queue(struct device *dev, const char *name,
75-
bsg_job_fn *job_fn, rq_timed_out_fn *timeout, int dd_job_size);
78+
bsg_job_fn *job_fn, bsg_timeout_fn *timeout, int dd_job_size);
7679
void bsg_remove_queue(struct request_queue *q);
7780
void bsg_job_put(struct bsg_job *job);
7881
int __must_check bsg_job_get(struct bsg_job *job);

0 commit comments

Comments
 (0)