block: move ->make_request_fn to struct block_device_operations

The make_request_fn is a little weird in that it sits directly in
struct request_queue instead of an operation vector.  Replace it with
a block_device_operations method called submit_bio (which describes much
better what it does).  Also remove the request_queue argument to it, as
the queue can be derived pretty trivially from the bio.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Christoph Hellwig 2020-07-01 10:59:43 +02:00 коммит произвёл Jens Axboe
Родитель e439ab710f
Коммит c62b37d96b
36 изменённых файлов: 153 добавлений и 140 удалений

Просмотреть файл

@ -1036,7 +1036,7 @@ Now the generic block layer performs partition-remapping early and thus
provides drivers with a sector number relative to whole device, rather than provides drivers with a sector number relative to whole device, rather than
having to take partition number into account in order to arrive at the true having to take partition number into account in order to arrive at the true
sector number. The routine blk_partition_remap() is invoked by sector number. The routine blk_partition_remap() is invoked by
generic_make_request even before invoking the queue specific make_request_fn, generic_make_request even before invoking the queue specific ->submit_bio,
so the i/o scheduler also gets to operate on whole disk sector numbers. This so the i/o scheduler also gets to operate on whole disk sector numbers. This
should typically not require changes to block drivers, it just never gets should typically not require changes to block drivers, it just never gets
to invoke its own partition sector offset calculations since all bios to invoke its own partition sector offset calculations since all bios

Просмотреть файл

@ -47,7 +47,7 @@ the Forced Unit Access is implemented. The REQ_PREFLUSH and REQ_FUA flags
may both be set on a single bio. may both be set on a single bio.
Implementation details for make_request_fn based block drivers Implementation details for bio based block drivers
-------------------------------------------------------------- --------------------------------------------------------------
These drivers will always see the REQ_PREFLUSH and REQ_FUA bits as they sit These drivers will always see the REQ_PREFLUSH and REQ_FUA bits as they sit

Просмотреть файл

@ -59,7 +59,7 @@ struct nfhd_device {
struct gendisk *disk; struct gendisk *disk;
}; };
static blk_qc_t nfhd_make_request(struct request_queue *queue, struct bio *bio) static blk_qc_t nfhd_submit_bio(struct bio *bio)
{ {
struct nfhd_device *dev = bio->bi_disk->private_data; struct nfhd_device *dev = bio->bi_disk->private_data;
struct bio_vec bvec; struct bio_vec bvec;
@ -93,6 +93,7 @@ static int nfhd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
static const struct block_device_operations nfhd_ops = { static const struct block_device_operations nfhd_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = nfhd_submit_bio,
.getgeo = nfhd_getgeo, .getgeo = nfhd_getgeo,
}; };
@ -118,7 +119,7 @@ static int __init nfhd_init_one(int id, u32 blocks, u32 bsize)
dev->bsize = bsize; dev->bsize = bsize;
dev->bshift = ffs(bsize) - 10; dev->bshift = ffs(bsize) - 10;
dev->queue = blk_alloc_queue(nfhd_make_request, NUMA_NO_NODE); dev->queue = blk_alloc_queue(NUMA_NO_NODE);
if (dev->queue == NULL) if (dev->queue == NULL)
goto free_dev; goto free_dev;

Просмотреть файл

@ -101,7 +101,7 @@ static void simdisk_transfer(struct simdisk *dev, unsigned long sector,
spin_unlock(&dev->lock); spin_unlock(&dev->lock);
} }
static blk_qc_t simdisk_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t simdisk_submit_bio(struct bio *bio)
{ {
struct simdisk *dev = bio->bi_disk->private_data; struct simdisk *dev = bio->bi_disk->private_data;
struct bio_vec bvec; struct bio_vec bvec;
@ -144,6 +144,7 @@ static void simdisk_release(struct gendisk *disk, fmode_t mode)
static const struct block_device_operations simdisk_ops = { static const struct block_device_operations simdisk_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = simdisk_submit_bio,
.open = simdisk_open, .open = simdisk_open,
.release = simdisk_release, .release = simdisk_release,
}; };
@ -267,7 +268,7 @@ static int __init simdisk_setup(struct simdisk *dev, int which,
spin_lock_init(&dev->lock); spin_lock_init(&dev->lock);
dev->users = 0; dev->users = 0;
dev->queue = blk_alloc_queue(simdisk_make_request, NUMA_NO_NODE); dev->queue = blk_alloc_queue(NUMA_NO_NODE);
if (dev->queue == NULL) { if (dev->queue == NULL) {
pr_err("blk_alloc_queue failed\n"); pr_err("blk_alloc_queue failed\n");
goto out_alloc_queue; goto out_alloc_queue;

Просмотреть файл

@ -1012,7 +1012,7 @@ static int blkcg_css_online(struct cgroup_subsys_state *css)
* blkcg_init_queue - initialize blkcg part of request queue * blkcg_init_queue - initialize blkcg part of request queue
* @q: request_queue to initialize * @q: request_queue to initialize
* *
* Called from __blk_alloc_queue(). Responsible for initializing blkcg * Called from blk_alloc_queue(). Responsible for initializing blkcg
* part of new request_queue @q. * part of new request_queue @q.
* *
* RETURNS: * RETURNS:

Просмотреть файл

@ -283,7 +283,7 @@ EXPORT_SYMBOL(blk_dump_rq_flags);
* A block device may call blk_sync_queue to ensure that any * A block device may call blk_sync_queue to ensure that any
* such activity is cancelled, thus allowing it to release resources * such activity is cancelled, thus allowing it to release resources
* that the callbacks might use. The caller must already have made sure * that the callbacks might use. The caller must already have made sure
* that its ->make_request_fn will not re-add plugging prior to calling * that its ->submit_bio will not re-add plugging prior to calling
* this function. * this function.
* *
* This function does not cancel any asynchronous activity arising * This function does not cancel any asynchronous activity arising
@ -510,7 +510,7 @@ static void blk_timeout_work(struct work_struct *work)
{ {
} }
struct request_queue *__blk_alloc_queue(int node_id) struct request_queue *blk_alloc_queue(int node_id)
{ {
struct request_queue *q; struct request_queue *q;
int ret; int ret;
@ -575,6 +575,7 @@ struct request_queue *__blk_alloc_queue(int node_id)
blk_queue_dma_alignment(q, 511); blk_queue_dma_alignment(q, 511);
blk_set_default_limits(&q->limits); blk_set_default_limits(&q->limits);
q->nr_requests = BLKDEV_MAX_RQ;
return q; return q;
@ -592,21 +593,6 @@ fail_q:
kmem_cache_free(blk_requestq_cachep, q); kmem_cache_free(blk_requestq_cachep, q);
return NULL; return NULL;
} }
struct request_queue *blk_alloc_queue(make_request_fn make_request, int node_id)
{
struct request_queue *q;
if (WARN_ON_ONCE(!make_request))
return NULL;
q = __blk_alloc_queue(node_id);
if (!q)
return NULL;
q->make_request_fn = make_request;
q->nr_requests = BLKDEV_MAX_RQ;
return q;
}
EXPORT_SYMBOL(blk_alloc_queue); EXPORT_SYMBOL(blk_alloc_queue);
/** /**
@ -1088,15 +1074,15 @@ end_io:
static blk_qc_t do_make_request(struct bio *bio) static blk_qc_t do_make_request(struct bio *bio)
{ {
struct request_queue *q = bio->bi_disk->queue; struct gendisk *disk = bio->bi_disk;
blk_qc_t ret = BLK_QC_T_NONE; blk_qc_t ret = BLK_QC_T_NONE;
if (blk_crypto_bio_prep(&bio)) { if (blk_crypto_bio_prep(&bio)) {
if (!q->make_request_fn) if (!disk->fops->submit_bio)
return blk_mq_make_request(q, bio); return blk_mq_submit_bio(bio);
ret = q->make_request_fn(q, bio); ret = disk->fops->submit_bio(bio);
} }
blk_queue_exit(q); blk_queue_exit(disk->queue);
return ret; return ret;
} }
@ -1113,10 +1099,9 @@ blk_qc_t generic_make_request(struct bio *bio)
{ {
/* /*
* bio_list_on_stack[0] contains bios submitted by the current * bio_list_on_stack[0] contains bios submitted by the current
* make_request_fn. * ->submit_bio.
* bio_list_on_stack[1] contains bios that were submitted before * bio_list_on_stack[1] contains bios that were submitted before the
* the current make_request_fn, but that haven't been processed * current ->submit_bio_bio, but that haven't been processed yet.
* yet.
*/ */
struct bio_list bio_list_on_stack[2]; struct bio_list bio_list_on_stack[2];
blk_qc_t ret = BLK_QC_T_NONE; blk_qc_t ret = BLK_QC_T_NONE;
@ -1125,10 +1110,10 @@ blk_qc_t generic_make_request(struct bio *bio)
goto out; goto out;
/* /*
* We only want one ->make_request_fn to be active at a time, else * We only want one ->submit_bio to be active at a time, else
* stack usage with stacked devices could be a problem. So use * stack usage with stacked devices could be a problem. So use
* current->bio_list to keep a list of requests submited by a * current->bio_list to keep a list of requests submited by a
* make_request_fn function. current->bio_list is also used as a * ->submit_bio method. current->bio_list is also used as a
* flag to say if generic_make_request is currently active in this * flag to say if generic_make_request is currently active in this
* task or not. If it is NULL, then no make_request is active. If * task or not. If it is NULL, then no make_request is active. If
* it is non-NULL, then a make_request is active, and new requests * it is non-NULL, then a make_request is active, and new requests
@ -1146,12 +1131,12 @@ blk_qc_t generic_make_request(struct bio *bio)
* We pretend that we have just taken it off a longer list, so * We pretend that we have just taken it off a longer list, so
* we assign bio_list to a pointer to the bio_list_on_stack, * we assign bio_list to a pointer to the bio_list_on_stack,
* thus initialising the bio_list of new bios to be * thus initialising the bio_list of new bios to be
* added. ->make_request() may indeed add some more bios * added. ->submit_bio() may indeed add some more bios
* through a recursive call to generic_make_request. If it * through a recursive call to generic_make_request. If it
* did, we find a non-NULL value in bio_list and re-enter the loop * did, we find a non-NULL value in bio_list and re-enter the loop
* from the top. In this case we really did just take the bio * from the top. In this case we really did just take the bio
* of the top of the list (no pretending) and so remove it from * of the top of the list (no pretending) and so remove it from
* bio_list, and call into ->make_request() again. * bio_list, and call into ->submit_bio() again.
*/ */
BUG_ON(bio->bi_next); BUG_ON(bio->bi_next);
bio_list_init(&bio_list_on_stack[0]); bio_list_init(&bio_list_on_stack[0]);
@ -1201,9 +1186,9 @@ EXPORT_SYMBOL(generic_make_request);
*/ */
blk_qc_t direct_make_request(struct bio *bio) blk_qc_t direct_make_request(struct bio *bio)
{ {
struct request_queue *q = bio->bi_disk->queue; struct gendisk *disk = bio->bi_disk;
if (WARN_ON_ONCE(q->make_request_fn)) { if (WARN_ON_ONCE(!disk->queue->mq_ops)) {
bio_io_error(bio); bio_io_error(bio);
return BLK_QC_T_NONE; return BLK_QC_T_NONE;
} }
@ -1212,10 +1197,10 @@ blk_qc_t direct_make_request(struct bio *bio)
if (unlikely(bio_queue_enter(bio))) if (unlikely(bio_queue_enter(bio)))
return BLK_QC_T_NONE; return BLK_QC_T_NONE;
if (!blk_crypto_bio_prep(&bio)) { if (!blk_crypto_bio_prep(&bio)) {
blk_queue_exit(q); blk_queue_exit(disk->queue);
return BLK_QC_T_NONE; return BLK_QC_T_NONE;
} }
return blk_mq_make_request(q, bio); return blk_mq_submit_bio(bio);
} }
EXPORT_SYMBOL_GPL(direct_make_request); EXPORT_SYMBOL_GPL(direct_make_request);

Просмотреть файл

@ -2136,8 +2136,7 @@ static void blk_add_rq_to_plug(struct blk_plug *plug, struct request *rq)
} }
/** /**
* blk_mq_make_request - Create and send a request to block device. * blk_mq_submit_bio - Create and send a request to block device.
* @q: Request queue pointer.
* @bio: Bio pointer. * @bio: Bio pointer.
* *
* Builds up a request structure from @q and @bio and send to the device. The * Builds up a request structure from @q and @bio and send to the device. The
@ -2151,8 +2150,9 @@ static void blk_add_rq_to_plug(struct blk_plug *plug, struct request *rq)
* *
* Returns: Request queue cookie. * Returns: Request queue cookie.
*/ */
blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) blk_qc_t blk_mq_submit_bio(struct bio *bio)
{ {
struct request_queue *q = bio->bi_disk->queue;
const int is_sync = op_is_sync(bio->bi_opf); const int is_sync = op_is_sync(bio->bi_opf);
const int is_flush_fua = op_is_flush(bio->bi_opf); const int is_flush_fua = op_is_flush(bio->bi_opf);
struct blk_mq_alloc_data data = { struct blk_mq_alloc_data data = {
@ -2277,7 +2277,7 @@ queue_exit:
blk_queue_exit(q); blk_queue_exit(q);
return BLK_QC_T_NONE; return BLK_QC_T_NONE;
} }
EXPORT_SYMBOL_GPL(blk_mq_make_request); /* only for request based dm */ EXPORT_SYMBOL_GPL(blk_mq_submit_bio); /* only for request based dm */
void blk_mq_free_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags, void blk_mq_free_rqs(struct blk_mq_tag_set *set, struct blk_mq_tags *tags,
unsigned int hctx_idx) unsigned int hctx_idx)
@ -3017,7 +3017,7 @@ struct request_queue *blk_mq_init_queue_data(struct blk_mq_tag_set *set,
{ {
struct request_queue *uninit_q, *q; struct request_queue *uninit_q, *q;
uninit_q = __blk_alloc_queue(set->numa_node); uninit_q = blk_alloc_queue(set->numa_node);
if (!uninit_q) if (!uninit_q)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
uninit_q->queuedata = queuedata; uninit_q->queuedata = queuedata;

Просмотреть файл

@ -419,8 +419,6 @@ static inline void part_nr_sects_write(struct hd_struct *part, sector_t size)
#endif #endif
} }
struct request_queue *__blk_alloc_queue(int node_id);
int bio_add_hw_page(struct request_queue *q, struct bio *bio, int bio_add_hw_page(struct request_queue *q, struct bio *bio,
struct page *page, unsigned int len, unsigned int offset, struct page *page, unsigned int len, unsigned int offset,
unsigned int max_sectors, bool *same_page); unsigned int max_sectors, bool *same_page);

Просмотреть файл

@ -282,7 +282,7 @@ out:
return err; return err;
} }
static blk_qc_t brd_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t brd_submit_bio(struct bio *bio)
{ {
struct brd_device *brd = bio->bi_disk->private_data; struct brd_device *brd = bio->bi_disk->private_data;
struct bio_vec bvec; struct bio_vec bvec;
@ -330,6 +330,7 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector,
static const struct block_device_operations brd_fops = { static const struct block_device_operations brd_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = brd_submit_bio,
.rw_page = brd_rw_page, .rw_page = brd_rw_page,
}; };
@ -381,7 +382,7 @@ static struct brd_device *brd_alloc(int i)
spin_lock_init(&brd->brd_lock); spin_lock_init(&brd->brd_lock);
INIT_RADIX_TREE(&brd->brd_pages, GFP_ATOMIC); INIT_RADIX_TREE(&brd->brd_pages, GFP_ATOMIC);
brd->brd_queue = blk_alloc_queue(brd_make_request, NUMA_NO_NODE); brd->brd_queue = blk_alloc_queue(NUMA_NO_NODE);
if (!brd->brd_queue) if (!brd->brd_queue)
goto out_free_dev; goto out_free_dev;

Просмотреть файл

@ -1451,7 +1451,7 @@ extern void conn_free_crypto(struct drbd_connection *connection);
/* drbd_req */ /* drbd_req */
extern void do_submit(struct work_struct *ws); extern void do_submit(struct work_struct *ws);
extern void __drbd_make_request(struct drbd_device *, struct bio *, unsigned long); extern void __drbd_make_request(struct drbd_device *, struct bio *, unsigned long);
extern blk_qc_t drbd_make_request(struct request_queue *q, struct bio *bio); extern blk_qc_t drbd_submit_bio(struct bio *bio);
extern int drbd_read_remote(struct drbd_device *device, struct drbd_request *req); extern int drbd_read_remote(struct drbd_device *device, struct drbd_request *req);
extern int is_valid_ar_handle(struct drbd_request *, sector_t); extern int is_valid_ar_handle(struct drbd_request *, sector_t);

Просмотреть файл

@ -132,9 +132,10 @@ wait_queue_head_t drbd_pp_wait;
DEFINE_RATELIMIT_STATE(drbd_ratelimit_state, 5 * HZ, 5); DEFINE_RATELIMIT_STATE(drbd_ratelimit_state, 5 * HZ, 5);
static const struct block_device_operations drbd_ops = { static const struct block_device_operations drbd_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = drbd_open, .submit_bio = drbd_submit_bio,
.release = drbd_release, .open = drbd_open,
.release = drbd_release,
}; };
struct bio *bio_alloc_drbd(gfp_t gfp_mask) struct bio *bio_alloc_drbd(gfp_t gfp_mask)
@ -2801,7 +2802,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
drbd_init_set_defaults(device); drbd_init_set_defaults(device);
q = blk_alloc_queue(drbd_make_request, NUMA_NO_NODE); q = blk_alloc_queue(NUMA_NO_NODE);
if (!q) if (!q)
goto out_no_q; goto out_no_q;
device->rq_queue = q; device->rq_queue = q;

Просмотреть файл

@ -1593,7 +1593,7 @@ void do_submit(struct work_struct *ws)
} }
} }
blk_qc_t drbd_make_request(struct request_queue *q, struct bio *bio) blk_qc_t drbd_submit_bio(struct bio *bio)
{ {
struct drbd_device *device = bio->bi_disk->private_data; struct drbd_device *device = bio->bi_disk->private_data;
unsigned long start_jif; unsigned long start_jif;

Просмотреть файл

@ -1388,7 +1388,7 @@ static struct nullb_queue *nullb_to_queue(struct nullb *nullb)
return &nullb->queues[index]; return &nullb->queues[index];
} }
static blk_qc_t null_queue_bio(struct request_queue *q, struct bio *bio) static blk_qc_t null_submit_bio(struct bio *bio)
{ {
sector_t sector = bio->bi_iter.bi_sector; sector_t sector = bio->bi_iter.bi_sector;
sector_t nr_sectors = bio_sectors(bio); sector_t nr_sectors = bio_sectors(bio);
@ -1575,7 +1575,13 @@ static void null_config_discard(struct nullb *nullb)
blk_queue_flag_set(QUEUE_FLAG_DISCARD, nullb->q); blk_queue_flag_set(QUEUE_FLAG_DISCARD, nullb->q);
} }
static const struct block_device_operations null_ops = { static const struct block_device_operations null_bio_ops = {
.owner = THIS_MODULE,
.submit_bio = null_submit_bio,
.report_zones = null_report_zones,
};
static const struct block_device_operations null_rq_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.report_zones = null_report_zones, .report_zones = null_report_zones,
}; };
@ -1647,7 +1653,10 @@ static int null_gendisk_register(struct nullb *nullb)
disk->flags |= GENHD_FL_EXT_DEVT | GENHD_FL_SUPPRESS_PARTITION_INFO; disk->flags |= GENHD_FL_EXT_DEVT | GENHD_FL_SUPPRESS_PARTITION_INFO;
disk->major = null_major; disk->major = null_major;
disk->first_minor = nullb->index; disk->first_minor = nullb->index;
disk->fops = &null_ops; if (queue_is_mq(nullb->q))
disk->fops = &null_rq_ops;
else
disk->fops = &null_bio_ops;
disk->private_data = nullb; disk->private_data = nullb;
disk->queue = nullb->q; disk->queue = nullb->q;
strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN); strncpy(disk->disk_name, nullb->disk_name, DISK_NAME_LEN);
@ -1792,7 +1801,7 @@ static int null_add_dev(struct nullb_device *dev)
goto out_cleanup_tags; goto out_cleanup_tags;
} }
} else if (dev->queue_mode == NULL_Q_BIO) { } else if (dev->queue_mode == NULL_Q_BIO) {
nullb->q = blk_alloc_queue(null_queue_bio, dev->home_node); nullb->q = blk_alloc_queue(dev->home_node);
if (!nullb->q) { if (!nullb->q) {
rv = -ENOMEM; rv = -ENOMEM;
goto out_cleanup_queues; goto out_cleanup_queues;

Просмотреть файл

@ -36,7 +36,7 @@
* block device, assembling the pieces to full packets and queuing them to the * block device, assembling the pieces to full packets and queuing them to the
* packet I/O scheduler. * packet I/O scheduler.
* *
* At the top layer there is a custom make_request_fn function that forwards * At the top layer there is a custom ->submit_bio function that forwards
* read requests directly to the iosched queue and puts write requests in the * read requests directly to the iosched queue and puts write requests in the
* unaligned write queue. A kernel thread performs the necessary read * unaligned write queue. A kernel thread performs the necessary read
* gathering to convert the unaligned writes to aligned writes and then feeds * gathering to convert the unaligned writes to aligned writes and then feeds
@ -2428,7 +2428,7 @@ static void pkt_make_request_write(struct request_queue *q, struct bio *bio)
} }
} }
static blk_qc_t pkt_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t pkt_submit_bio(struct bio *bio)
{ {
struct pktcdvd_device *pd; struct pktcdvd_device *pd;
char b[BDEVNAME_SIZE]; char b[BDEVNAME_SIZE];
@ -2436,7 +2436,7 @@ static blk_qc_t pkt_make_request(struct request_queue *q, struct bio *bio)
blk_queue_split(&bio); blk_queue_split(&bio);
pd = q->queuedata; pd = bio->bi_disk->queue->queuedata;
if (!pd) { if (!pd) {
pr_err("%s incorrect request queue\n", bio_devname(bio, b)); pr_err("%s incorrect request queue\n", bio_devname(bio, b));
goto end_io; goto end_io;
@ -2480,7 +2480,7 @@ static blk_qc_t pkt_make_request(struct request_queue *q, struct bio *bio)
split = bio; split = bio;
} }
pkt_make_request_write(q, split); pkt_make_request_write(bio->bi_disk->queue, split);
} while (split != bio); } while (split != bio);
return BLK_QC_T_NONE; return BLK_QC_T_NONE;
@ -2685,6 +2685,7 @@ static char *pkt_devnode(struct gendisk *disk, umode_t *mode)
static const struct block_device_operations pktcdvd_ops = { static const struct block_device_operations pktcdvd_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = pkt_submit_bio,
.open = pkt_open, .open = pkt_open,
.release = pkt_close, .release = pkt_close,
.ioctl = pkt_ioctl, .ioctl = pkt_ioctl,
@ -2749,7 +2750,7 @@ static int pkt_setup_dev(dev_t dev, dev_t* pkt_dev)
disk->flags = GENHD_FL_REMOVABLE; disk->flags = GENHD_FL_REMOVABLE;
strcpy(disk->disk_name, pd->name); strcpy(disk->disk_name, pd->name);
disk->private_data = pd; disk->private_data = pd;
disk->queue = blk_alloc_queue(pkt_make_request, NUMA_NO_NODE); disk->queue = blk_alloc_queue(NUMA_NO_NODE);
if (!disk->queue) if (!disk->queue)
goto out_mem2; goto out_mem2;

Просмотреть файл

@ -90,12 +90,6 @@ struct ps3vram_priv {
static int ps3vram_major; static int ps3vram_major;
static const struct block_device_operations ps3vram_fops = {
.owner = THIS_MODULE,
};
#define DMA_NOTIFIER_HANDLE_BASE 0x66604200 /* first DMA notifier handle */ #define DMA_NOTIFIER_HANDLE_BASE 0x66604200 /* first DMA notifier handle */
#define DMA_NOTIFIER_OFFSET_BASE 0x1000 /* first DMA notifier offset */ #define DMA_NOTIFIER_OFFSET_BASE 0x1000 /* first DMA notifier offset */
#define DMA_NOTIFIER_SIZE 0x40 #define DMA_NOTIFIER_SIZE 0x40
@ -585,7 +579,7 @@ out:
return next; return next;
} }
static blk_qc_t ps3vram_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t ps3vram_submit_bio(struct bio *bio)
{ {
struct ps3_system_bus_device *dev = bio->bi_disk->private_data; struct ps3_system_bus_device *dev = bio->bi_disk->private_data;
struct ps3vram_priv *priv = ps3_system_bus_get_drvdata(dev); struct ps3vram_priv *priv = ps3_system_bus_get_drvdata(dev);
@ -610,6 +604,11 @@ static blk_qc_t ps3vram_make_request(struct request_queue *q, struct bio *bio)
return BLK_QC_T_NONE; return BLK_QC_T_NONE;
} }
static const struct block_device_operations ps3vram_fops = {
.owner = THIS_MODULE,
.submit_bio = ps3vram_submit_bio,
};
static int ps3vram_probe(struct ps3_system_bus_device *dev) static int ps3vram_probe(struct ps3_system_bus_device *dev)
{ {
struct ps3vram_priv *priv; struct ps3vram_priv *priv;
@ -737,7 +736,7 @@ static int ps3vram_probe(struct ps3_system_bus_device *dev)
ps3vram_proc_init(dev); ps3vram_proc_init(dev);
queue = blk_alloc_queue(ps3vram_make_request, NUMA_NO_NODE); queue = blk_alloc_queue(NUMA_NO_NODE);
if (!queue) { if (!queue) {
dev_err(&dev->core, "blk_alloc_queue failed\n"); dev_err(&dev->core, "blk_alloc_queue failed\n");
error = -ENOMEM; error = -ENOMEM;

Просмотреть файл

@ -50,6 +50,8 @@ struct rsxx_bio_meta {
static struct kmem_cache *bio_meta_pool; static struct kmem_cache *bio_meta_pool;
static blk_qc_t rsxx_submit_bio(struct bio *bio);
/*----------------- Block Device Operations -----------------*/ /*----------------- Block Device Operations -----------------*/
static int rsxx_blkdev_ioctl(struct block_device *bdev, static int rsxx_blkdev_ioctl(struct block_device *bdev,
fmode_t mode, fmode_t mode,
@ -92,6 +94,7 @@ static int rsxx_getgeo(struct block_device *bdev, struct hd_geometry *geo)
static const struct block_device_operations rsxx_fops = { static const struct block_device_operations rsxx_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = rsxx_submit_bio,
.getgeo = rsxx_getgeo, .getgeo = rsxx_getgeo,
.ioctl = rsxx_blkdev_ioctl, .ioctl = rsxx_blkdev_ioctl,
}; };
@ -117,7 +120,7 @@ static void bio_dma_done_cb(struct rsxx_cardinfo *card,
} }
} }
static blk_qc_t rsxx_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t rsxx_submit_bio(struct bio *bio)
{ {
struct rsxx_cardinfo *card = bio->bi_disk->private_data; struct rsxx_cardinfo *card = bio->bi_disk->private_data;
struct rsxx_bio_meta *bio_meta; struct rsxx_bio_meta *bio_meta;
@ -233,7 +236,7 @@ int rsxx_setup_dev(struct rsxx_cardinfo *card)
return -ENOMEM; return -ENOMEM;
} }
card->queue = blk_alloc_queue(rsxx_make_request, NUMA_NO_NODE); card->queue = blk_alloc_queue(NUMA_NO_NODE);
if (!card->queue) { if (!card->queue) {
dev_err(CARD_TO_DEV(card), "Failed queue alloc\n"); dev_err(CARD_TO_DEV(card), "Failed queue alloc\n");
unregister_blkdev(card->major, DRIVER_NAME); unregister_blkdev(card->major, DRIVER_NAME);

Просмотреть файл

@ -519,7 +519,7 @@ static int mm_check_plugged(struct cardinfo *card)
return !!blk_check_plugged(mm_unplug, card, sizeof(struct blk_plug_cb)); return !!blk_check_plugged(mm_unplug, card, sizeof(struct blk_plug_cb));
} }
static blk_qc_t mm_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t mm_submit_bio(struct bio *bio)
{ {
struct cardinfo *card = bio->bi_disk->private_data; struct cardinfo *card = bio->bi_disk->private_data;
@ -779,6 +779,7 @@ static int mm_getgeo(struct block_device *bdev, struct hd_geometry *geo)
static const struct block_device_operations mm_fops = { static const struct block_device_operations mm_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = mm_submit_bio,
.getgeo = mm_getgeo, .getgeo = mm_getgeo,
.revalidate_disk = mm_revalidate, .revalidate_disk = mm_revalidate,
}; };
@ -886,7 +887,7 @@ static int mm_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
card->biotail = &card->bio; card->biotail = &card->bio;
spin_lock_init(&card->lock); spin_lock_init(&card->lock);
card->queue = blk_alloc_queue(mm_make_request, NUMA_NO_NODE); card->queue = blk_alloc_queue(NUMA_NO_NODE);
if (!card->queue) if (!card->queue)
goto failed_alloc; goto failed_alloc;

Просмотреть файл

@ -793,9 +793,9 @@ static void zram_sync_read(struct work_struct *work)
} }
/* /*
* Block layer want one ->make_request_fn to be active at a time * Block layer want one ->submit_bio to be active at a time, so if we use
* so if we use chained IO with parent IO in same context, * chained IO with parent IO in same context, it's a deadlock. To avoid that,
* it's a deadlock. To avoid, it, it uses worker thread context. * use a worker thread context.
*/ */
static int read_from_bdev_sync(struct zram *zram, struct bio_vec *bvec, static int read_from_bdev_sync(struct zram *zram, struct bio_vec *bvec,
unsigned long entry, struct bio *bio) unsigned long entry, struct bio *bio)
@ -1584,7 +1584,7 @@ static void __zram_make_request(struct zram *zram, struct bio *bio)
/* /*
* Handler function for all zram I/O requests. * Handler function for all zram I/O requests.
*/ */
static blk_qc_t zram_make_request(struct request_queue *queue, struct bio *bio) static blk_qc_t zram_submit_bio(struct bio *bio)
{ {
struct zram *zram = bio->bi_disk->private_data; struct zram *zram = bio->bi_disk->private_data;
@ -1813,6 +1813,7 @@ static int zram_open(struct block_device *bdev, fmode_t mode)
static const struct block_device_operations zram_devops = { static const struct block_device_operations zram_devops = {
.open = zram_open, .open = zram_open,
.submit_bio = zram_submit_bio,
.swap_slot_free_notify = zram_slot_free_notify, .swap_slot_free_notify = zram_slot_free_notify,
.rw_page = zram_rw_page, .rw_page = zram_rw_page,
.owner = THIS_MODULE .owner = THIS_MODULE
@ -1891,7 +1892,7 @@ static int zram_add(void)
#ifdef CONFIG_ZRAM_WRITEBACK #ifdef CONFIG_ZRAM_WRITEBACK
spin_lock_init(&zram->wb_limit_lock); spin_lock_init(&zram->wb_limit_lock);
#endif #endif
queue = blk_alloc_queue(zram_make_request, NUMA_NO_NODE); queue = blk_alloc_queue(NUMA_NO_NODE);
if (!queue) { if (!queue) {
pr_err("Error allocating disk queue for device %d\n", pr_err("Error allocating disk queue for device %d\n",
device_id); device_id);

Просмотреть файл

@ -236,10 +236,6 @@ err_dev:
return tgt_dev; return tgt_dev;
} }
static const struct block_device_operations nvm_fops = {
.owner = THIS_MODULE,
};
static struct nvm_tgt_type *__nvm_find_target_type(const char *name) static struct nvm_tgt_type *__nvm_find_target_type(const char *name)
{ {
struct nvm_tgt_type *tt; struct nvm_tgt_type *tt;
@ -380,7 +376,7 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
goto err_dev; goto err_dev;
} }
tqueue = blk_alloc_queue(tt->make_rq, dev->q->node); tqueue = blk_alloc_queue(dev->q->node);
if (!tqueue) { if (!tqueue) {
ret = -ENOMEM; ret = -ENOMEM;
goto err_disk; goto err_disk;
@ -390,7 +386,7 @@ static int nvm_create_tgt(struct nvm_dev *dev, struct nvm_ioctl_create *create)
tdisk->flags = GENHD_FL_EXT_DEVT; tdisk->flags = GENHD_FL_EXT_DEVT;
tdisk->major = 0; tdisk->major = 0;
tdisk->first_minor = 0; tdisk->first_minor = 0;
tdisk->fops = &nvm_fops; tdisk->fops = tt->bops;
tdisk->queue = tqueue; tdisk->queue = tqueue;
targetdata = tt->init(tgt_dev, tdisk, create->flags); targetdata = tt->init(tgt_dev, tdisk, create->flags);

Просмотреть файл

@ -47,9 +47,9 @@ static struct pblk_global_caches pblk_caches = {
struct bio_set pblk_bio_set; struct bio_set pblk_bio_set;
static blk_qc_t pblk_make_rq(struct request_queue *q, struct bio *bio) static blk_qc_t pblk_submit_bio(struct bio *bio)
{ {
struct pblk *pblk = q->queuedata; struct pblk *pblk = bio->bi_disk->queue->queuedata;
if (bio_op(bio) == REQ_OP_DISCARD) { if (bio_op(bio) == REQ_OP_DISCARD) {
pblk_discard(pblk, bio); pblk_discard(pblk, bio);
@ -79,6 +79,12 @@ static blk_qc_t pblk_make_rq(struct request_queue *q, struct bio *bio)
return BLK_QC_T_NONE; return BLK_QC_T_NONE;
} }
static const struct block_device_operations pblk_bops = {
.owner = THIS_MODULE,
.submit_bio = pblk_submit_bio,
};
static size_t pblk_trans_map_size(struct pblk *pblk) static size_t pblk_trans_map_size(struct pblk *pblk)
{ {
int entry_size = 8; int entry_size = 8;
@ -1280,7 +1286,7 @@ static struct nvm_tgt_type tt_pblk = {
.name = "pblk", .name = "pblk",
.version = {1, 0, 0}, .version = {1, 0, 0},
.make_rq = pblk_make_rq, .bops = &pblk_bops,
.capacity = pblk_capacity, .capacity = pblk_capacity,
.init = pblk_init, .init = pblk_init,

Просмотреть файл

@ -1158,7 +1158,7 @@ static void quit_max_writeback_rate(struct cache_set *c,
/* Cached devices - read & write stuff */ /* Cached devices - read & write stuff */
blk_qc_t cached_dev_make_request(struct request_queue *q, struct bio *bio) blk_qc_t cached_dev_submit_bio(struct bio *bio)
{ {
struct search *s; struct search *s;
struct bcache_device *d = bio->bi_disk->private_data; struct bcache_device *d = bio->bi_disk->private_data;
@ -1291,7 +1291,7 @@ static void flash_dev_nodata(struct closure *cl)
continue_at(cl, search_free, NULL); continue_at(cl, search_free, NULL);
} }
blk_qc_t flash_dev_make_request(struct request_queue *q, struct bio *bio) blk_qc_t flash_dev_submit_bio(struct bio *bio)
{ {
struct search *s; struct search *s;
struct closure *cl; struct closure *cl;

Просмотреть файл

@ -37,10 +37,10 @@ unsigned int bch_get_congested(const struct cache_set *c);
void bch_data_insert(struct closure *cl); void bch_data_insert(struct closure *cl);
void bch_cached_dev_request_init(struct cached_dev *dc); void bch_cached_dev_request_init(struct cached_dev *dc);
blk_qc_t cached_dev_make_request(struct request_queue *q, struct bio *bio); blk_qc_t cached_dev_submit_bio(struct bio *bio);
void bch_flash_dev_request_init(struct bcache_device *d); void bch_flash_dev_request_init(struct bcache_device *d);
blk_qc_t flash_dev_make_request(struct request_queue *q, struct bio *bio); blk_qc_t flash_dev_submit_bio(struct bio *bio);
extern struct kmem_cache *bch_search_cache; extern struct kmem_cache *bch_search_cache;

Просмотреть файл

@ -680,7 +680,16 @@ static int ioctl_dev(struct block_device *b, fmode_t mode,
return d->ioctl(d, mode, cmd, arg); return d->ioctl(d, mode, cmd, arg);
} }
static const struct block_device_operations bcache_ops = { static const struct block_device_operations bcache_cached_ops = {
.submit_bio = cached_dev_submit_bio,
.open = open_dev,
.release = release_dev,
.ioctl = ioctl_dev,
.owner = THIS_MODULE,
};
static const struct block_device_operations bcache_flash_ops = {
.submit_bio = flash_dev_submit_bio,
.open = open_dev, .open = open_dev,
.release = release_dev, .release = release_dev,
.ioctl = ioctl_dev, .ioctl = ioctl_dev,
@ -820,8 +829,8 @@ static void bcache_device_free(struct bcache_device *d)
} }
static int bcache_device_init(struct bcache_device *d, unsigned int block_size, static int bcache_device_init(struct bcache_device *d, unsigned int block_size,
sector_t sectors, make_request_fn make_request_fn, sector_t sectors, struct block_device *cached_bdev,
struct block_device *cached_bdev) const struct block_device_operations *ops)
{ {
struct request_queue *q; struct request_queue *q;
const size_t max_stripes = min_t(size_t, INT_MAX, const size_t max_stripes = min_t(size_t, INT_MAX,
@ -868,10 +877,10 @@ static int bcache_device_init(struct bcache_device *d, unsigned int block_size,
d->disk->major = bcache_major; d->disk->major = bcache_major;
d->disk->first_minor = idx_to_first_minor(idx); d->disk->first_minor = idx_to_first_minor(idx);
d->disk->fops = &bcache_ops; d->disk->fops = ops;
d->disk->private_data = d; d->disk->private_data = d;
q = blk_alloc_queue(make_request_fn, NUMA_NO_NODE); q = blk_alloc_queue(NUMA_NO_NODE);
if (!q) if (!q)
return -ENOMEM; return -ENOMEM;
@ -1355,7 +1364,7 @@ static int cached_dev_init(struct cached_dev *dc, unsigned int block_size)
ret = bcache_device_init(&dc->disk, block_size, ret = bcache_device_init(&dc->disk, block_size,
dc->bdev->bd_part->nr_sects - dc->sb.data_offset, dc->bdev->bd_part->nr_sects - dc->sb.data_offset,
cached_dev_make_request, dc->bdev); dc->bdev, &bcache_cached_ops);
if (ret) if (ret)
return ret; return ret;
@ -1468,7 +1477,7 @@ static int flash_dev_run(struct cache_set *c, struct uuid_entry *u)
kobject_init(&d->kobj, &bch_flash_dev_ktype); kobject_init(&d->kobj, &bch_flash_dev_ktype);
if (bcache_device_init(d, block_bytes(c), u->sectors, if (bcache_device_init(d, block_bytes(c), u->sectors,
flash_dev_make_request, NULL)) NULL, &bcache_flash_ops))
goto err; goto err;
bcache_device_attach(d, c, u - c->uuids); bcache_device_attach(d, c, u - c->uuids);

Просмотреть файл

@ -1770,7 +1770,7 @@ static blk_qc_t dm_process_bio(struct mapped_device *md,
} }
/* /*
* If in ->make_request_fn we need to use blk_queue_split(), otherwise * If in ->queue_bio we need to use blk_queue_split(), otherwise
* queue_limits for abnormal requests (e.g. discard, writesame, etc) * queue_limits for abnormal requests (e.g. discard, writesame, etc)
* won't be imposed. * won't be imposed.
*/ */
@ -1787,7 +1787,7 @@ static blk_qc_t dm_process_bio(struct mapped_device *md,
return __split_and_process_bio(md, map, bio); return __split_and_process_bio(md, map, bio);
} }
static blk_qc_t dm_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t dm_submit_bio(struct bio *bio)
{ {
struct mapped_device *md = bio->bi_disk->private_data; struct mapped_device *md = bio->bi_disk->private_data;
blk_qc_t ret = BLK_QC_T_NONE; blk_qc_t ret = BLK_QC_T_NONE;
@ -1798,12 +1798,12 @@ static blk_qc_t dm_make_request(struct request_queue *q, struct bio *bio)
/* /*
* We are called with a live reference on q_usage_counter, but * We are called with a live reference on q_usage_counter, but
* that one will be released as soon as we return. Grab an * that one will be released as soon as we return. Grab an
* extra one as blk_mq_make_request expects to be able to * extra one as blk_mq_submit_bio expects to be able to consume
* consume a reference (which lives until the request is freed * a reference (which lives until the request is freed in case a
* in case a request is allocated). * request is allocated).
*/ */
percpu_ref_get(&q->q_usage_counter); percpu_ref_get(&bio->bi_disk->queue->q_usage_counter);
return blk_mq_make_request(q, bio); return blk_mq_submit_bio(bio);
} }
map = dm_get_live_table(md, &srcu_idx); map = dm_get_live_table(md, &srcu_idx);
@ -1988,11 +1988,11 @@ static struct mapped_device *alloc_dev(int minor)
spin_lock_init(&md->uevent_lock); spin_lock_init(&md->uevent_lock);
/* /*
* default to bio-based required ->make_request_fn until DM * default to bio-based until DM table is loaded and md->type
* table is loaded and md->type established. If request-based * established. If request-based table is loaded: blk-mq will
* table is loaded: blk-mq will override accordingly. * override accordingly.
*/ */
md->queue = blk_alloc_queue(dm_make_request, numa_node_id); md->queue = blk_alloc_queue(numa_node_id);
if (!md->queue) if (!md->queue)
goto bad; goto bad;
@ -3232,6 +3232,7 @@ static const struct pr_ops dm_pr_ops = {
}; };
static const struct block_device_operations dm_blk_dops = { static const struct block_device_operations dm_blk_dops = {
.submit_bio = dm_submit_bio,
.open = dm_blk_open, .open = dm_blk_open,
.release = dm_blk_close, .release = dm_blk_close,
.ioctl = dm_blk_ioctl, .ioctl = dm_blk_ioctl,

Просмотреть файл

@ -463,7 +463,7 @@ check_suspended:
} }
EXPORT_SYMBOL(md_handle_request); EXPORT_SYMBOL(md_handle_request);
static blk_qc_t md_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t md_submit_bio(struct bio *bio)
{ {
const int rw = bio_data_dir(bio); const int rw = bio_data_dir(bio);
const int sgrp = op_stat_group(bio_op(bio)); const int sgrp = op_stat_group(bio_op(bio));
@ -5641,7 +5641,7 @@ static int md_alloc(dev_t dev, char *name)
mddev->hold_active = UNTIL_STOP; mddev->hold_active = UNTIL_STOP;
error = -ENOMEM; error = -ENOMEM;
mddev->queue = blk_alloc_queue(md_make_request, NUMA_NO_NODE); mddev->queue = blk_alloc_queue(NUMA_NO_NODE);
if (!mddev->queue) if (!mddev->queue)
goto abort; goto abort;
@ -7823,6 +7823,7 @@ static int md_revalidate(struct gendisk *disk)
static const struct block_device_operations md_fops = static const struct block_device_operations md_fops =
{ {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = md_submit_bio,
.open = md_open, .open = md_open,
.release = md_release, .release = md_release,
.ioctl = md_ioctl, .ioctl = md_ioctl,

Просмотреть файл

@ -162,7 +162,7 @@ static int nsblk_do_bvec(struct nd_namespace_blk *nsblk,
return err; return err;
} }
static blk_qc_t nd_blk_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t nd_blk_submit_bio(struct bio *bio)
{ {
struct bio_integrity_payload *bip; struct bio_integrity_payload *bip;
struct nd_namespace_blk *nsblk = bio->bi_disk->private_data; struct nd_namespace_blk *nsblk = bio->bi_disk->private_data;
@ -225,6 +225,7 @@ static int nsblk_rw_bytes(struct nd_namespace_common *ndns,
static const struct block_device_operations nd_blk_fops = { static const struct block_device_operations nd_blk_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = nd_blk_submit_bio,
.revalidate_disk = nvdimm_revalidate_disk, .revalidate_disk = nvdimm_revalidate_disk,
}; };
@ -250,7 +251,7 @@ static int nsblk_attach_disk(struct nd_namespace_blk *nsblk)
internal_nlba = div_u64(nsblk->size, nsblk_internal_lbasize(nsblk)); internal_nlba = div_u64(nsblk->size, nsblk_internal_lbasize(nsblk));
available_disk_size = internal_nlba * nsblk_sector_size(nsblk); available_disk_size = internal_nlba * nsblk_sector_size(nsblk);
q = blk_alloc_queue(nd_blk_make_request, NUMA_NO_NODE); q = blk_alloc_queue(NUMA_NO_NODE);
if (!q) if (!q)
return -ENOMEM; return -ENOMEM;
if (devm_add_action_or_reset(dev, nd_blk_release_queue, q)) if (devm_add_action_or_reset(dev, nd_blk_release_queue, q))

Просмотреть файл

@ -1439,7 +1439,7 @@ static int btt_do_bvec(struct btt *btt, struct bio_integrity_payload *bip,
return ret; return ret;
} }
static blk_qc_t btt_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t btt_submit_bio(struct bio *bio)
{ {
struct bio_integrity_payload *bip = bio_integrity(bio); struct bio_integrity_payload *bip = bio_integrity(bio);
struct btt *btt = bio->bi_disk->private_data; struct btt *btt = bio->bi_disk->private_data;
@ -1512,6 +1512,7 @@ static int btt_getgeo(struct block_device *bd, struct hd_geometry *geo)
static const struct block_device_operations btt_fops = { static const struct block_device_operations btt_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = btt_submit_bio,
.rw_page = btt_rw_page, .rw_page = btt_rw_page,
.getgeo = btt_getgeo, .getgeo = btt_getgeo,
.revalidate_disk = nvdimm_revalidate_disk, .revalidate_disk = nvdimm_revalidate_disk,
@ -1523,7 +1524,7 @@ static int btt_blk_init(struct btt *btt)
struct nd_namespace_common *ndns = nd_btt->ndns; struct nd_namespace_common *ndns = nd_btt->ndns;
/* create a new disk and request queue for btt */ /* create a new disk and request queue for btt */
btt->btt_queue = blk_alloc_queue(btt_make_request, NUMA_NO_NODE); btt->btt_queue = blk_alloc_queue(NUMA_NO_NODE);
if (!btt->btt_queue) if (!btt->btt_queue)
return -ENOMEM; return -ENOMEM;

Просмотреть файл

@ -189,7 +189,7 @@ static blk_status_t pmem_do_write(struct pmem_device *pmem,
return rc; return rc;
} }
static blk_qc_t pmem_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t pmem_submit_bio(struct bio *bio)
{ {
int ret = 0; int ret = 0;
blk_status_t rc = 0; blk_status_t rc = 0;
@ -281,6 +281,7 @@ __weak long __pmem_direct_access(struct pmem_device *pmem, pgoff_t pgoff,
static const struct block_device_operations pmem_fops = { static const struct block_device_operations pmem_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = pmem_submit_bio,
.rw_page = pmem_rw_page, .rw_page = pmem_rw_page,
.revalidate_disk = nvdimm_revalidate_disk, .revalidate_disk = nvdimm_revalidate_disk,
}; };
@ -423,7 +424,7 @@ static int pmem_attach_disk(struct device *dev,
return -EBUSY; return -EBUSY;
} }
q = blk_alloc_queue(pmem_make_request, dev_to_node(dev)); q = blk_alloc_queue(dev_to_node(dev));
if (!q) if (!q)
return -ENOMEM; return -ENOMEM;

Просмотреть файл

@ -2178,6 +2178,7 @@ static void nvme_ns_head_release(struct gendisk *disk, fmode_t mode)
const struct block_device_operations nvme_ns_head_ops = { const struct block_device_operations nvme_ns_head_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = nvme_ns_head_submit_bio,
.open = nvme_ns_head_open, .open = nvme_ns_head_open,
.release = nvme_ns_head_release, .release = nvme_ns_head_release,
.ioctl = nvme_ioctl, .ioctl = nvme_ioctl,

Просмотреть файл

@ -291,8 +291,7 @@ static bool nvme_available_path(struct nvme_ns_head *head)
return false; return false;
} }
static blk_qc_t nvme_ns_head_make_request(struct request_queue *q, blk_qc_t nvme_ns_head_submit_bio(struct bio *bio)
struct bio *bio)
{ {
struct nvme_ns_head *head = bio->bi_disk->private_data; struct nvme_ns_head *head = bio->bi_disk->private_data;
struct device *dev = disk_to_dev(head->disk); struct device *dev = disk_to_dev(head->disk);
@ -374,7 +373,7 @@ int nvme_mpath_alloc_disk(struct nvme_ctrl *ctrl, struct nvme_ns_head *head)
if (!(ctrl->subsys->cmic & NVME_CTRL_CMIC_MULTI_CTRL) || !multipath) if (!(ctrl->subsys->cmic & NVME_CTRL_CMIC_MULTI_CTRL) || !multipath)
return 0; return 0;
q = blk_alloc_queue(nvme_ns_head_make_request, ctrl->numa_node); q = blk_alloc_queue(ctrl->numa_node);
if (!q) if (!q)
goto out; goto out;
blk_queue_flag_set(QUEUE_FLAG_NONROT, q); blk_queue_flag_set(QUEUE_FLAG_NONROT, q);

Просмотреть файл

@ -586,6 +586,7 @@ void nvme_mpath_stop(struct nvme_ctrl *ctrl);
bool nvme_mpath_clear_current_path(struct nvme_ns *ns); bool nvme_mpath_clear_current_path(struct nvme_ns *ns);
void nvme_mpath_clear_ctrl_paths(struct nvme_ctrl *ctrl); void nvme_mpath_clear_ctrl_paths(struct nvme_ctrl *ctrl);
struct nvme_ns *nvme_find_path(struct nvme_ns_head *head); struct nvme_ns *nvme_find_path(struct nvme_ns_head *head);
blk_qc_t nvme_ns_head_submit_bio(struct bio *bio);
static inline void nvme_mpath_check_last_path(struct nvme_ns *ns) static inline void nvme_mpath_check_last_path(struct nvme_ns *ns)
{ {

Просмотреть файл

@ -31,8 +31,7 @@
static int dcssblk_open(struct block_device *bdev, fmode_t mode); static int dcssblk_open(struct block_device *bdev, fmode_t mode);
static void dcssblk_release(struct gendisk *disk, fmode_t mode); static void dcssblk_release(struct gendisk *disk, fmode_t mode);
static blk_qc_t dcssblk_make_request(struct request_queue *q, static blk_qc_t dcssblk_submit_bio(struct bio *bio);
struct bio *bio);
static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff, static long dcssblk_dax_direct_access(struct dax_device *dax_dev, pgoff_t pgoff,
long nr_pages, void **kaddr, pfn_t *pfn); long nr_pages, void **kaddr, pfn_t *pfn);
@ -41,6 +40,7 @@ static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0";
static int dcssblk_major; static int dcssblk_major;
static const struct block_device_operations dcssblk_devops = { static const struct block_device_operations dcssblk_devops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = dcssblk_submit_bio,
.open = dcssblk_open, .open = dcssblk_open,
.release = dcssblk_release, .release = dcssblk_release,
}; };
@ -651,8 +651,7 @@ dcssblk_add_store(struct device *dev, struct device_attribute *attr, const char
} }
dev_info->gd->major = dcssblk_major; dev_info->gd->major = dcssblk_major;
dev_info->gd->fops = &dcssblk_devops; dev_info->gd->fops = &dcssblk_devops;
dev_info->dcssblk_queue = dev_info->dcssblk_queue = blk_alloc_queue(NUMA_NO_NODE);
blk_alloc_queue(dcssblk_make_request, NUMA_NO_NODE);
dev_info->gd->queue = dev_info->dcssblk_queue; dev_info->gd->queue = dev_info->dcssblk_queue;
dev_info->gd->private_data = dev_info; dev_info->gd->private_data = dev_info;
blk_queue_logical_block_size(dev_info->dcssblk_queue, 4096); blk_queue_logical_block_size(dev_info->dcssblk_queue, 4096);
@ -868,7 +867,7 @@ dcssblk_release(struct gendisk *disk, fmode_t mode)
} }
static blk_qc_t static blk_qc_t
dcssblk_make_request(struct request_queue *q, struct bio *bio) dcssblk_submit_bio(struct bio *bio)
{ {
struct dcssblk_dev_info *dev_info; struct dcssblk_dev_info *dev_info;
struct bio_vec bvec; struct bio_vec bvec;

Просмотреть файл

@ -182,7 +182,7 @@ static unsigned long xpram_highest_page_index(void)
/* /*
* Block device make request function. * Block device make request function.
*/ */
static blk_qc_t xpram_make_request(struct request_queue *q, struct bio *bio) static blk_qc_t xpram_submit_bio(struct bio *bio)
{ {
xpram_device_t *xdev = bio->bi_disk->private_data; xpram_device_t *xdev = bio->bi_disk->private_data;
struct bio_vec bvec; struct bio_vec bvec;
@ -250,6 +250,7 @@ static int xpram_getgeo(struct block_device *bdev, struct hd_geometry *geo)
static const struct block_device_operations xpram_devops = static const struct block_device_operations xpram_devops =
{ {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.submit_bio = xpram_submit_bio,
.getgeo = xpram_getgeo, .getgeo = xpram_getgeo,
}; };
@ -343,8 +344,7 @@ static int __init xpram_setup_blkdev(void)
xpram_disks[i] = alloc_disk(1); xpram_disks[i] = alloc_disk(1);
if (!xpram_disks[i]) if (!xpram_disks[i])
goto out; goto out;
xpram_queues[i] = blk_alloc_queue(xpram_make_request, xpram_queues[i] = blk_alloc_queue(NUMA_NO_NODE);
NUMA_NO_NODE);
if (!xpram_queues[i]) { if (!xpram_queues[i]) {
put_disk(xpram_disks[i]); put_disk(xpram_disks[i]);
goto out; goto out;

Просмотреть файл

@ -596,6 +596,6 @@ static inline void blk_mq_cleanup_rq(struct request *rq)
rq->q->mq_ops->cleanup_rq(rq); rq->q->mq_ops->cleanup_rq(rq);
} }
blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio); blk_qc_t blk_mq_submit_bio(struct bio *bio);
#endif #endif

Просмотреть файл

@ -286,8 +286,6 @@ static inline unsigned short req_get_ioprio(struct request *req)
struct blk_queue_ctx; struct blk_queue_ctx;
typedef blk_qc_t (make_request_fn) (struct request_queue *q, struct bio *bio);
struct bio_vec; struct bio_vec;
enum blk_eh_timer_return { enum blk_eh_timer_return {
@ -398,8 +396,6 @@ struct request_queue {
struct blk_queue_stats *stats; struct blk_queue_stats *stats;
struct rq_qos *rq_qos; struct rq_qos *rq_qos;
make_request_fn *make_request_fn;
const struct blk_mq_ops *mq_ops; const struct blk_mq_ops *mq_ops;
/* sw queues */ /* sw queues */
@ -1162,7 +1158,7 @@ static inline int blk_rq_map_sg(struct request_queue *q, struct request *rq,
extern void blk_dump_rq_flags(struct request *, char *); extern void blk_dump_rq_flags(struct request *, char *);
bool __must_check blk_get_queue(struct request_queue *); bool __must_check blk_get_queue(struct request_queue *);
struct request_queue *blk_alloc_queue(make_request_fn make_request, int node_id); struct request_queue *blk_alloc_queue(int node_id);
extern void blk_put_queue(struct request_queue *); extern void blk_put_queue(struct request_queue *);
extern void blk_set_queue_dying(struct request_queue *); extern void blk_set_queue_dying(struct request_queue *);
@ -1778,6 +1774,7 @@ static inline void blk_ksm_unregister(struct request_queue *q) { }
struct block_device_operations { struct block_device_operations {
blk_qc_t (*submit_bio) (struct bio *bio);
int (*open) (struct block_device *, fmode_t); int (*open) (struct block_device *, fmode_t);
void (*release) (struct gendisk *, fmode_t); void (*release) (struct gendisk *, fmode_t);
int (*rw_page)(struct block_device *, sector_t, struct page *, unsigned int); int (*rw_page)(struct block_device *, sector_t, struct page *, unsigned int);

Просмотреть файл

@ -631,7 +631,6 @@ static inline int nvm_next_ppa_in_chk(struct nvm_tgt_dev *dev,
return last; return last;
} }
typedef blk_qc_t (nvm_tgt_make_rq_fn)(struct request_queue *, struct bio *);
typedef sector_t (nvm_tgt_capacity_fn)(void *); typedef sector_t (nvm_tgt_capacity_fn)(void *);
typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *, typedef void *(nvm_tgt_init_fn)(struct nvm_tgt_dev *, struct gendisk *,
int flags); int flags);
@ -650,7 +649,7 @@ struct nvm_tgt_type {
int flags; int flags;
/* target entry points */ /* target entry points */
nvm_tgt_make_rq_fn *make_rq; const struct block_device_operations *bops;
nvm_tgt_capacity_fn *capacity; nvm_tgt_capacity_fn *capacity;
/* module-specific init/teardown */ /* module-specific init/teardown */