Skip to content

Commit 74d4699

Browse files
Christoph Hellwigaxboe
authored andcommitted
block: replace bi_bdev with a gendisk pointer and partitions index
This way we don't need a block_device structure to submit I/O. The block_device has different life time rules from the gendisk and request_queue and is usually only available when the block device node is open. Other callers need to explicitly create one (e.g. the lightnvm passthrough code, or the new nvme multipathing code). For the actual I/O path all that we need is the gendisk, which exists once per block device. But given that the block layer also does partition remapping we additionally need a partition index, which is used for said remapping in generic_make_request. Note that all the block drivers generally want request_queue or sometimes the gendisk, so this removes a layer of indirection all over the stack. Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
1 parent c2ee070 commit 74d4699

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+358
-357
lines changed

arch/powerpc/sysdev/axonram.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ axon_ram_irq_handler(int irq, void *dev)
110110
static blk_qc_t
111111
axon_ram_make_request(struct request_queue *queue, struct bio *bio)
112112
{
113-
struct axon_ram_bank *bank = bio->bi_bdev->bd_disk->private_data;
113+
struct axon_ram_bank *bank = bio->bi_disk->private_data;
114114
unsigned long phys_mem, phys_end;
115115
void *user_mem;
116116
struct bio_vec vec;

block/bio-integrity.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ int bio_integrity_add_page(struct bio *bio, struct page *page,
146146
iv = bip->bip_vec + bip->bip_vcnt;
147147

148148
if (bip->bip_vcnt &&
149-
bvec_gap_to_prev(bdev_get_queue(bio->bi_bdev),
149+
bvec_gap_to_prev(bio->bi_disk->queue,
150150
&bip->bip_vec[bip->bip_vcnt - 1], offset))
151151
return 0;
152152

@@ -190,7 +190,7 @@ static inline unsigned int bio_integrity_bytes(struct blk_integrity *bi,
190190
static blk_status_t bio_integrity_process(struct bio *bio,
191191
struct bvec_iter *proc_iter, integrity_processing_fn *proc_fn)
192192
{
193-
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
193+
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
194194
struct blk_integrity_iter iter;
195195
struct bvec_iter bviter;
196196
struct bio_vec bv;
@@ -199,7 +199,7 @@ static blk_status_t bio_integrity_process(struct bio *bio,
199199
void *prot_buf = page_address(bip->bip_vec->bv_page) +
200200
bip->bip_vec->bv_offset;
201201

202-
iter.disk_name = bio->bi_bdev->bd_disk->disk_name;
202+
iter.disk_name = bio->bi_disk->disk_name;
203203
iter.interval = 1 << bi->interval_exp;
204204
iter.seed = proc_iter->bi_sector;
205205
iter.prot_buf = prot_buf;
@@ -236,20 +236,18 @@ static blk_status_t bio_integrity_process(struct bio *bio,
236236
bool bio_integrity_prep(struct bio *bio)
237237
{
238238
struct bio_integrity_payload *bip;
239-
struct blk_integrity *bi;
240-
struct request_queue *q;
239+
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
240+
struct request_queue *q = bio->bi_disk->queue;
241241
void *buf;
242242
unsigned long start, end;
243243
unsigned int len, nr_pages;
244244
unsigned int bytes, offset, i;
245245
unsigned int intervals;
246246
blk_status_t status;
247247

248-
bi = bdev_get_integrity(bio->bi_bdev);
249248
if (!bi)
250249
return true;
251250

252-
q = bdev_get_queue(bio->bi_bdev);
253251
if (bio_op(bio) != REQ_OP_READ && bio_op(bio) != REQ_OP_WRITE)
254252
return true;
255253

@@ -354,7 +352,7 @@ static void bio_integrity_verify_fn(struct work_struct *work)
354352
struct bio_integrity_payload *bip =
355353
container_of(work, struct bio_integrity_payload, bip_work);
356354
struct bio *bio = bip->bip_bio;
357-
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
355+
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
358356
struct bvec_iter iter = bio->bi_iter;
359357

360358
/*
@@ -411,7 +409,7 @@ bool __bio_integrity_endio(struct bio *bio)
411409
void bio_integrity_advance(struct bio *bio, unsigned int bytes_done)
412410
{
413411
struct bio_integrity_payload *bip = bio_integrity(bio);
414-
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
412+
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
415413
unsigned bytes = bio_integrity_bytes(bi, bytes_done >> 9);
416414

417415
bip->bip_iter.bi_sector += bytes_done >> 9;
@@ -428,7 +426,7 @@ EXPORT_SYMBOL(bio_integrity_advance);
428426
void bio_integrity_trim(struct bio *bio)
429427
{
430428
struct bio_integrity_payload *bip = bio_integrity(bio);
431-
struct blk_integrity *bi = bdev_get_integrity(bio->bi_bdev);
429+
struct blk_integrity *bi = blk_get_integrity(bio->bi_disk);
432430

433431
bip->bip_iter.bi_size = bio_integrity_bytes(bi, bio_sectors(bio));
434432
}

block/bio.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -593,10 +593,10 @@ void __bio_clone_fast(struct bio *bio, struct bio *bio_src)
593593
BUG_ON(bio->bi_pool && BVEC_POOL_IDX(bio));
594594

595595
/*
596-
* most users will be overriding ->bi_bdev with a new target,
596+
* most users will be overriding ->bi_disk with a new target,
597597
* so we don't set nor calculate new physical/hw segment counts here
598598
*/
599-
bio->bi_bdev = bio_src->bi_bdev;
599+
bio->bi_disk = bio_src->bi_disk;
600600
bio_set_flag(bio, BIO_CLONED);
601601
bio->bi_opf = bio_src->bi_opf;
602602
bio->bi_write_hint = bio_src->bi_write_hint;
@@ -681,7 +681,7 @@ struct bio *bio_clone_bioset(struct bio *bio_src, gfp_t gfp_mask,
681681
bio = bio_alloc_bioset(gfp_mask, bio_segments(bio_src), bs);
682682
if (!bio)
683683
return NULL;
684-
bio->bi_bdev = bio_src->bi_bdev;
684+
bio->bi_disk = bio_src->bi_disk;
685685
bio->bi_opf = bio_src->bi_opf;
686686
bio->bi_write_hint = bio_src->bi_write_hint;
687687
bio->bi_iter.bi_sector = bio_src->bi_iter.bi_sector;
@@ -1830,8 +1830,8 @@ void bio_endio(struct bio *bio)
18301830
goto again;
18311831
}
18321832

1833-
if (bio->bi_bdev && bio_flagged(bio, BIO_TRACE_COMPLETION)) {
1834-
trace_block_bio_complete(bdev_get_queue(bio->bi_bdev), bio,
1833+
if (bio->bi_disk && bio_flagged(bio, BIO_TRACE_COMPLETION)) {
1834+
trace_block_bio_complete(bio->bi_disk->queue, bio,
18351835
blk_status_to_errno(bio->bi_status));
18361836
bio_clear_flag(bio, BIO_TRACE_COMPLETION);
18371837
}

block/blk-core.c

Lines changed: 49 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1910,40 +1910,15 @@ static blk_qc_t blk_queue_bio(struct request_queue *q, struct bio *bio)
19101910
return BLK_QC_T_NONE;
19111911
}
19121912

1913-
/*
1914-
* If bio->bi_dev is a partition, remap the location
1915-
*/
1916-
static inline void blk_partition_remap(struct bio *bio)
1917-
{
1918-
struct block_device *bdev = bio->bi_bdev;
1919-
1920-
/*
1921-
* Zone reset does not include bi_size so bio_sectors() is always 0.
1922-
* Include a test for the reset op code and perform the remap if needed.
1923-
*/
1924-
if (bdev != bdev->bd_contains &&
1925-
(bio_sectors(bio) || bio_op(bio) == REQ_OP_ZONE_RESET)) {
1926-
struct hd_struct *p = bdev->bd_part;
1927-
1928-
bio->bi_iter.bi_sector += p->start_sect;
1929-
bio->bi_bdev = bdev->bd_contains;
1930-
1931-
trace_block_bio_remap(bdev_get_queue(bio->bi_bdev), bio,
1932-
bdev->bd_dev,
1933-
bio->bi_iter.bi_sector - p->start_sect);
1934-
}
1935-
}
1936-
19371913
static void handle_bad_sector(struct bio *bio)
19381914
{
19391915
char b[BDEVNAME_SIZE];
19401916

19411917
printk(KERN_INFO "attempt to access beyond end of device\n");
19421918
printk(KERN_INFO "%s: rw=%d, want=%Lu, limit=%Lu\n",
1943-
bdevname(bio->bi_bdev, b),
1944-
bio->bi_opf,
1919+
bio_devname(bio, b), bio->bi_opf,
19451920
(unsigned long long)bio_end_sector(bio),
1946-
(long long)(i_size_read(bio->bi_bdev->bd_inode) >> 9));
1921+
(long long)get_capacity(bio->bi_disk));
19471922
}
19481923

19491924
#ifdef CONFIG_FAIL_MAKE_REQUEST
@@ -1981,6 +1956,38 @@ static inline bool should_fail_request(struct hd_struct *part,
19811956

19821957
#endif /* CONFIG_FAIL_MAKE_REQUEST */
19831958

1959+
/*
1960+
* Remap block n of partition p to block n+start(p) of the disk.
1961+
*/
1962+
static inline int blk_partition_remap(struct bio *bio)
1963+
{
1964+
struct hd_struct *p;
1965+
int ret = 0;
1966+
1967+
/*
1968+
* Zone reset does not include bi_size so bio_sectors() is always 0.
1969+
* Include a test for the reset op code and perform the remap if needed.
1970+
*/
1971+
if (!bio->bi_partno ||
1972+
(!bio_sectors(bio) && bio_op(bio) != REQ_OP_ZONE_RESET))
1973+
return 0;
1974+
1975+
rcu_read_lock();
1976+
p = __disk_get_part(bio->bi_disk, bio->bi_partno);
1977+
if (likely(p && !should_fail_request(p, bio->bi_iter.bi_size))) {
1978+
bio->bi_iter.bi_sector += p->start_sect;
1979+
bio->bi_partno = 0;
1980+
trace_block_bio_remap(bio->bi_disk->queue, bio, part_devt(p),
1981+
bio->bi_iter.bi_sector - p->start_sect);
1982+
} else {
1983+
printk("%s: fail for partition %d\n", __func__, bio->bi_partno);
1984+
ret = -EIO;
1985+
}
1986+
rcu_read_unlock();
1987+
1988+
return ret;
1989+
}
1990+
19841991
/*
19851992
* Check whether this bio extends beyond the end of the device.
19861993
*/
@@ -1992,7 +1999,7 @@ static inline int bio_check_eod(struct bio *bio, unsigned int nr_sectors)
19921999
return 0;
19932000

19942001
/* Test device or partition size, when known. */
1995-
maxsector = i_size_read(bio->bi_bdev->bd_inode) >> 9;
2002+
maxsector = get_capacity(bio->bi_disk);
19962003
if (maxsector) {
19972004
sector_t sector = bio->bi_iter.bi_sector;
19982005

@@ -2017,20 +2024,18 @@ generic_make_request_checks(struct bio *bio)
20172024
int nr_sectors = bio_sectors(bio);
20182025
blk_status_t status = BLK_STS_IOERR;
20192026
char b[BDEVNAME_SIZE];
2020-
struct hd_struct *part;
20212027

20222028
might_sleep();
20232029

20242030
if (bio_check_eod(bio, nr_sectors))
20252031
goto end_io;
20262032

2027-
q = bdev_get_queue(bio->bi_bdev);
2033+
q = bio->bi_disk->queue;
20282034
if (unlikely(!q)) {
20292035
printk(KERN_ERR
20302036
"generic_make_request: Trying to access "
20312037
"nonexistent block-device %s (%Lu)\n",
2032-
bdevname(bio->bi_bdev, b),
2033-
(long long) bio->bi_iter.bi_sector);
2038+
bio_devname(bio, b), (long long)bio->bi_iter.bi_sector);
20342039
goto end_io;
20352040
}
20362041

@@ -2042,17 +2047,11 @@ generic_make_request_checks(struct bio *bio)
20422047
if ((bio->bi_opf & REQ_NOWAIT) && !queue_is_rq_based(q))
20432048
goto not_supported;
20442049

2045-
part = bio->bi_bdev->bd_part;
2046-
if (should_fail_request(part, bio->bi_iter.bi_size) ||
2047-
should_fail_request(&part_to_disk(part)->part0,
2048-
bio->bi_iter.bi_size))
2050+
if (should_fail_request(&bio->bi_disk->part0, bio->bi_iter.bi_size))
20492051
goto end_io;
20502052

2051-
/*
2052-
* If this device has partitions, remap block n
2053-
* of partition p to block n+start(p) of the disk.
2054-
*/
2055-
blk_partition_remap(bio);
2053+
if (blk_partition_remap(bio))
2054+
goto end_io;
20562055

20572056
if (bio_check_eod(bio, nr_sectors))
20582057
goto end_io;
@@ -2081,16 +2080,16 @@ generic_make_request_checks(struct bio *bio)
20812080
goto not_supported;
20822081
break;
20832082
case REQ_OP_WRITE_SAME:
2084-
if (!bdev_write_same(bio->bi_bdev))
2083+
if (!q->limits.max_write_same_sectors)
20852084
goto not_supported;
20862085
break;
20872086
case REQ_OP_ZONE_REPORT:
20882087
case REQ_OP_ZONE_RESET:
2089-
if (!bdev_is_zoned(bio->bi_bdev))
2088+
if (!blk_queue_is_zoned(q))
20902089
goto not_supported;
20912090
break;
20922091
case REQ_OP_WRITE_ZEROES:
2093-
if (!bdev_write_zeroes_sectors(bio->bi_bdev))
2092+
if (!q->limits.max_write_zeroes_sectors)
20942093
goto not_supported;
20952094
break;
20962095
default:
@@ -2197,7 +2196,7 @@ blk_qc_t generic_make_request(struct bio *bio)
21972196
bio_list_init(&bio_list_on_stack[0]);
21982197
current->bio_list = bio_list_on_stack;
21992198
do {
2200-
struct request_queue *q = bdev_get_queue(bio->bi_bdev);
2199+
struct request_queue *q = bio->bi_disk->queue;
22012200

22022201
if (likely(blk_queue_enter(q, bio->bi_opf & REQ_NOWAIT) == 0)) {
22032202
struct bio_list lower, same;
@@ -2215,7 +2214,7 @@ blk_qc_t generic_make_request(struct bio *bio)
22152214
bio_list_init(&lower);
22162215
bio_list_init(&same);
22172216
while ((bio = bio_list_pop(&bio_list_on_stack[0])) != NULL)
2218-
if (q == bdev_get_queue(bio->bi_bdev))
2217+
if (q == bio->bi_disk->queue)
22192218
bio_list_add(&same, bio);
22202219
else
22212220
bio_list_add(&lower, bio);
@@ -2258,7 +2257,7 @@ blk_qc_t submit_bio(struct bio *bio)
22582257
unsigned int count;
22592258

22602259
if (unlikely(bio_op(bio) == REQ_OP_WRITE_SAME))
2261-
count = bdev_logical_block_size(bio->bi_bdev) >> 9;
2260+
count = queue_logical_block_size(bio->bi_disk->queue);
22622261
else
22632262
count = bio_sectors(bio);
22642263

@@ -2275,8 +2274,7 @@ blk_qc_t submit_bio(struct bio *bio)
22752274
current->comm, task_pid_nr(current),
22762275
op_is_write(bio_op(bio)) ? "WRITE" : "READ",
22772276
(unsigned long long)bio->bi_iter.bi_sector,
2278-
bdevname(bio->bi_bdev, b),
2279-
count);
2277+
bio_devname(bio, b), count);
22802278
}
22812279
}
22822280

@@ -3049,8 +3047,8 @@ void blk_rq_bio_prep(struct request_queue *q, struct request *rq,
30493047
rq->__data_len = bio->bi_iter.bi_size;
30503048
rq->bio = rq->biotail = bio;
30513049

3052-
if (bio->bi_bdev)
3053-
rq->rq_disk = bio->bi_bdev->bd_disk;
3050+
if (bio->bi_disk)
3051+
rq->rq_disk = bio->bi_disk;
30543052
}
30553053

30563054
#if ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE

block/blk-flush.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -525,7 +525,7 @@ int blkdev_issue_flush(struct block_device *bdev, gfp_t gfp_mask,
525525
return -ENXIO;
526526

527527
bio = bio_alloc(gfp_mask, 0);
528-
bio->bi_bdev = bdev;
528+
bio_set_dev(bio, bdev);
529529
bio->bi_opf = REQ_OP_WRITE | REQ_PREFLUSH;
530530

531531
ret = submit_bio_wait(bio);

block/blk-lib.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
7777

7878
bio = next_bio(bio, 0, gfp_mask);
7979
bio->bi_iter.bi_sector = sector;
80-
bio->bi_bdev = bdev;
80+
bio_set_dev(bio, bdev);
8181
bio_set_op_attrs(bio, op, 0);
8282

8383
bio->bi_iter.bi_size = req_sects << 9;
@@ -168,7 +168,7 @@ static int __blkdev_issue_write_same(struct block_device *bdev, sector_t sector,
168168
while (nr_sects) {
169169
bio = next_bio(bio, 1, gfp_mask);
170170
bio->bi_iter.bi_sector = sector;
171-
bio->bi_bdev = bdev;
171+
bio_set_dev(bio, bdev);
172172
bio->bi_vcnt = 1;
173173
bio->bi_io_vec->bv_page = page;
174174
bio->bi_io_vec->bv_offset = 0;
@@ -241,7 +241,7 @@ static int __blkdev_issue_write_zeroes(struct block_device *bdev,
241241
while (nr_sects) {
242242
bio = next_bio(bio, 0, gfp_mask);
243243
bio->bi_iter.bi_sector = sector;
244-
bio->bi_bdev = bdev;
244+
bio_set_dev(bio, bdev);
245245
bio->bi_opf = REQ_OP_WRITE_ZEROES;
246246
if (flags & BLKDEV_ZERO_NOUNMAP)
247247
bio->bi_opf |= REQ_NOUNMAP;
@@ -323,7 +323,7 @@ int __blkdev_issue_zeroout(struct block_device *bdev, sector_t sector,
323323
bio = next_bio(bio, __blkdev_sectors_to_bio_pages(nr_sects),
324324
gfp_mask);
325325
bio->bi_iter.bi_sector = sector;
326-
bio->bi_bdev = bdev;
326+
bio_set_dev(bio, bdev);
327327
bio_set_op_attrs(bio, REQ_OP_WRITE, 0);
328328

329329
while (nr_sects != 0) {

block/blk-merge.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -786,7 +786,7 @@ bool blk_rq_merge_ok(struct request *rq, struct bio *bio)
786786
return false;
787787

788788
/* must be same device and not a special request */
789-
if (rq->rq_disk != bio->bi_bdev->bd_disk || req_no_special_merge(rq))
789+
if (rq->rq_disk != bio->bi_disk || req_no_special_merge(rq))
790790
return false;
791791

792792
/* only merge integrity protected bio into ditto rq */

block/blk-zoned.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ int blkdev_report_zones(struct block_device *bdev,
116116
if (!bio)
117117
return -ENOMEM;
118118

119-
bio->bi_bdev = bdev;
119+
bio_set_dev(bio, bdev);
120120
bio->bi_iter.bi_sector = blk_zone_start(q, sector);
121121
bio_set_op_attrs(bio, REQ_OP_ZONE_REPORT, 0);
122122

@@ -234,7 +234,7 @@ int blkdev_reset_zones(struct block_device *bdev,
234234

235235
bio = bio_alloc(gfp_mask, 0);
236236
bio->bi_iter.bi_sector = sector;
237-
bio->bi_bdev = bdev;
237+
bio_set_dev(bio, bdev);
238238
bio_set_op_attrs(bio, REQ_OP_ZONE_RESET, 0);
239239

240240
ret = submit_bio_wait(bio);

0 commit comments

Comments
 (0)