projects
/
linux-2.6-microblaze.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge tag 'tag-chrome-platform-for-v5.12' of git://git.kernel.org/pub/scm/linux/kerne...
[linux-2.6-microblaze.git]
/
block
/
blk-core.c
diff --git
a/block/blk-core.c
b/block/blk-core.c
index
7663a9b
..
5e75284
100644
(file)
--- a/
block/blk-core.c
+++ b/
block/blk-core.c
@@
-476,7
+476,7
@@
int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags)
static inline int bio_queue_enter(struct bio *bio)
{
static inline int bio_queue_enter(struct bio *bio)
{
- struct request_queue *q = bio->bi_disk->queue;
+ struct request_queue *q = bio->bi_
bdev->bd_
disk->queue;
bool nowait = bio->bi_opf & REQ_NOWAIT;
int ret;
bool nowait = bio->bi_opf & REQ_NOWAIT;
int ret;
@@
-531,7
+531,7
@@
struct request_queue *blk_alloc_queue(int node_id)
if (q->id < 0)
goto fail_q;
if (q->id < 0)
goto fail_q;
- ret = bioset_init(&q->bio_split, BIO_POOL_SIZE, 0,
BIOSET_NEED_BVECS
);
+ ret = bioset_init(&q->bio_split, BIO_POOL_SIZE, 0,
0
);
if (ret)
goto fail_id;
if (ret)
goto fail_id;
@@
-692,11
+692,9
@@
static inline bool should_fail_request(struct block_device *part,
#endif /* CONFIG_FAIL_MAKE_REQUEST */
#endif /* CONFIG_FAIL_MAKE_REQUEST */
-static inline bool bio_check_ro(struct bio *bio
, struct block_device *part
)
+static inline bool bio_check_ro(struct bio *bio)
{
{
- const int op = bio_op(bio);
-
- if (part->bd_read_only && op_is_write(op)) {
+ if (op_is_write(bio_op(bio)) && bdev_read_only(bio->bi_bdev)) {
char b[BDEVNAME_SIZE];
if (op_is_flush(bio->bi_opf) && !bio_sectors(bio))
char b[BDEVNAME_SIZE];
if (op_is_flush(bio->bi_opf) && !bio_sectors(bio))
@@
-704,7
+702,7
@@
static inline bool bio_check_ro(struct bio *bio, struct block_device *part)
WARN_ONCE(1,
"Trying to write to read-only block-device %s (partno %d)\n",
WARN_ONCE(1,
"Trying to write to read-only block-device %s (partno %d)\n",
- bio_devname(bio, b),
part
->bd_partno);
+ bio_devname(bio, b),
bio->bi_bdev
->bd_partno);
/* Older lvm-tools actually trigger this */
return false;
}
/* Older lvm-tools actually trigger this */
return false;
}
@@
-714,7
+712,7
@@
static inline bool bio_check_ro(struct bio *bio, struct block_device *part)
static noinline int should_fail_bio(struct bio *bio)
{
static noinline int should_fail_bio(struct bio *bio)
{
- if (should_fail_request(b
io->bi_disk->part0
, bio->bi_iter.bi_size))
+ if (should_fail_request(b
dev_whole(bio->bi_bdev)
, bio->bi_iter.bi_size))
return -EIO;
return 0;
}
return -EIO;
return 0;
}
@@
-725,8
+723,9
@@
ALLOW_ERROR_INJECTION(should_fail_bio, ERRNO);
* This may well happen - the kernel calls bread() without checking the size of
* the device, e.g., when mounting a file system.
*/
* This may well happen - the kernel calls bread() without checking the size of
* the device, e.g., when mounting a file system.
*/
-static inline int bio_check_eod(struct bio *bio
, sector_t maxsector
)
+static inline int bio_check_eod(struct bio *bio)
{
{
+ sector_t maxsector = bdev_nr_sectors(bio->bi_bdev);
unsigned int nr_sectors = bio_sectors(bio);
if (nr_sectors && maxsector &&
unsigned int nr_sectors = bio_sectors(bio);
if (nr_sectors && maxsector &&
@@
-741,33
+740,20
@@
static inline int bio_check_eod(struct bio *bio, sector_t maxsector)
/*
* Remap block n of partition p to block n+start(p) of the disk.
*/
/*
* Remap block n of partition p to block n+start(p) of the disk.
*/
-static in
line in
t blk_partition_remap(struct bio *bio)
+static int blk_partition_remap(struct bio *bio)
{
{
- struct block_device *p;
- int ret = -EIO;
+ struct block_device *p = bio->bi_bdev;
- rcu_read_lock();
- p = __disk_get_part(bio->bi_disk, bio->bi_partno);
- if (unlikely(!p))
- goto out;
if (unlikely(should_fail_request(p, bio->bi_iter.bi_size)))
if (unlikely(should_fail_request(p, bio->bi_iter.bi_size)))
- goto out;
- if (unlikely(bio_check_ro(bio, p)))
- goto out;
-
+ return -EIO;
if (bio_sectors(bio)) {
if (bio_sectors(bio)) {
- if (bio_check_eod(bio, bdev_nr_sectors(p)))
- goto out;
bio->bi_iter.bi_sector += p->bd_start_sect;
trace_block_bio_remap(bio, p->bd_dev,
bio->bi_iter.bi_sector -
p->bd_start_sect);
}
bio->bi_iter.bi_sector += p->bd_start_sect;
trace_block_bio_remap(bio, p->bd_dev,
bio->bi_iter.bi_sector -
p->bd_start_sect);
}
- bio->bi_partno = 0;
- ret = 0;
-out:
- rcu_read_unlock();
- return ret;
+ bio_set_flag(bio, BIO_REMAPPED);
+ return 0;
}
/*
}
/*
@@
-807,7
+793,8
@@
static inline blk_status_t blk_check_zone_append(struct request_queue *q,
static noinline_for_stack bool submit_bio_checks(struct bio *bio)
{
static noinline_for_stack bool submit_bio_checks(struct bio *bio)
{
- struct request_queue *q = bio->bi_disk->queue;
+ struct block_device *bdev = bio->bi_bdev;
+ struct request_queue *q = bdev->bd_disk->queue;
blk_status_t status = BLK_STS_IOERR;
struct blk_plug *plug;
blk_status_t status = BLK_STS_IOERR;
struct blk_plug *plug;
@@
-826,14
+813,12
@@
static noinline_for_stack bool submit_bio_checks(struct bio *bio)
if (should_fail_bio(bio))
goto end_io;
if (should_fail_bio(bio))
goto end_io;
-
- if (bio->bi_partno) {
- if (unlikely(blk_partition_remap(bio)))
- goto end_io;
- } else {
- if (unlikely(bio_check_ro(bio, bio->bi_disk->part0)))
+ if (unlikely(bio_check_ro(bio)))
+ goto end_io;
+ if (!bio_flagged(bio, BIO_REMAPPED)) {
+ if (unlikely(bio_check_eod(bio)))
goto end_io;
goto end_io;
- if (
unlikely(bio_check_eod(bio, get_capacity(bio->bi_disk)
)))
+ if (
bdev->bd_partno && unlikely(blk_partition_remap(bio
)))
goto end_io;
}
goto end_io;
}
@@
-926,7
+911,7
@@
end_io:
static blk_qc_t __submit_bio(struct bio *bio)
{
static blk_qc_t __submit_bio(struct bio *bio)
{
- struct gendisk *disk = bio->bi_disk;
+ struct gendisk *disk = bio->bi_
bdev->bd_
disk;
blk_qc_t ret = BLK_QC_T_NONE;
if (blk_crypto_bio_prep(&bio)) {
blk_qc_t ret = BLK_QC_T_NONE;
if (blk_crypto_bio_prep(&bio)) {
@@
-968,7
+953,7
@@
static blk_qc_t __submit_bio_noacct(struct bio *bio)
current->bio_list = bio_list_on_stack;
do {
current->bio_list = bio_list_on_stack;
do {
- struct request_queue *q = bio->bi_disk->queue;
+ struct request_queue *q = bio->bi_
bdev->bd_
disk->queue;
struct bio_list lower, same;
if (unlikely(bio_queue_enter(bio) != 0))
struct bio_list lower, same;
if (unlikely(bio_queue_enter(bio) != 0))
@@
-989,7
+974,7
@@
static blk_qc_t __submit_bio_noacct(struct bio *bio)
bio_list_init(&lower);
bio_list_init(&same);
while ((bio = bio_list_pop(&bio_list_on_stack[0])) != NULL)
bio_list_init(&lower);
bio_list_init(&same);
while ((bio = bio_list_pop(&bio_list_on_stack[0])) != NULL)
- if (q == bio->bi_disk->queue)
+ if (q == bio->bi_
bdev->bd_
disk->queue)
bio_list_add(&same, bio);
else
bio_list_add(&lower, bio);
bio_list_add(&same, bio);
else
bio_list_add(&lower, bio);
@@
-1014,7
+999,7
@@
static blk_qc_t __submit_bio_noacct_mq(struct bio *bio)
current->bio_list = bio_list;
do {
current->bio_list = bio_list;
do {
- struct gendisk *disk = bio->bi_disk;
+ struct gendisk *disk = bio->bi_
bdev->bd_
disk;
if (unlikely(bio_queue_enter(bio) != 0))
continue;
if (unlikely(bio_queue_enter(bio) != 0))
continue;
@@
-1057,7
+1042,7
@@
blk_qc_t submit_bio_noacct(struct bio *bio)
return BLK_QC_T_NONE;
}
return BLK_QC_T_NONE;
}
- if (!bio->bi_disk->fops->submit_bio)
+ if (!bio->bi_
bdev->bd_
disk->fops->submit_bio)
return __submit_bio_noacct_mq(bio);
return __submit_bio_noacct(bio);
}
return __submit_bio_noacct_mq(bio);
return __submit_bio_noacct(bio);
}
@@
-1069,7
+1054,7
@@
EXPORT_SYMBOL(submit_bio_noacct);
*
* submit_bio() is used to submit I/O requests to block devices. It is passed a
* fully set up &struct bio that describes the I/O that needs to be done. The
*
* submit_bio() is used to submit I/O requests to block devices. It is passed a
* fully set up &struct bio that describes the I/O that needs to be done. The
- * bio will be send to the device described by the bi_
disk and bi_partno fields
.
+ * bio will be send to the device described by the bi_
bdev field
.
*
* The success/failure status of the request, along with notification of
* completion, is delivered asynchronously through the ->bi_end_io() callback
*
* The success/failure status of the request, along with notification of
* completion, is delivered asynchronously through the ->bi_end_io() callback
@@
-1089,7
+1074,8
@@
blk_qc_t submit_bio(struct bio *bio)
unsigned int count;
if (unlikely(bio_op(bio) == REQ_OP_WRITE_SAME))
unsigned int count;
if (unlikely(bio_op(bio) == REQ_OP_WRITE_SAME))
- count = queue_logical_block_size(bio->bi_disk->queue) >> 9;
+ count = queue_logical_block_size(
+ bio->bi_bdev->bd_disk->queue) >> 9;
else
count = bio_sectors(bio);
else
count = bio_sectors(bio);
@@
-1313,7
+1299,11
@@
void blk_account_io_start(struct request *rq)
if (!blk_do_io_stat(rq))
return;
if (!blk_do_io_stat(rq))
return;
- rq->part = disk_map_sector_rcu(rq->rq_disk, blk_rq_pos(rq));
+ /* passthrough requests can hold bios that do not have ->bi_bdev set */
+ if (rq->bio && rq->bio->bi_bdev)
+ rq->part = rq->bio->bi_bdev;
+ else
+ rq->part = rq->rq_disk->part0;
part_stat_lock();
update_io_ticks(rq->part, jiffies, false);
part_stat_lock();
update_io_ticks(rq->part, jiffies, false);
@@
-1336,14
+1326,17
@@
static unsigned long __part_start_io_acct(struct block_device *part,
return now;
}
return now;
}
-unsigned long part_start_io_acct(struct gendisk *disk, struct block_device **part,
- struct bio *bio)
+/**
+ * bio_start_io_acct - start I/O accounting for bio based drivers
+ * @bio: bio to start account for
+ *
+ * Returns the start time that should be passed back to bio_end_io_acct().
+ */
+unsigned long bio_start_io_acct(struct bio *bio)
{
{
- *part = disk_map_sector_rcu(disk, bio->bi_iter.bi_sector);
-
- return __part_start_io_acct(*part, bio_sectors(bio), bio_op(bio));
+ return __part_start_io_acct(bio->bi_bdev, bio_sectors(bio), bio_op(bio));
}
}
-EXPORT_SYMBOL_GPL(
part
_start_io_acct);
+EXPORT_SYMBOL_GPL(
bio
_start_io_acct);
unsigned long disk_start_io_acct(struct gendisk *disk, unsigned int sectors,
unsigned int op)
unsigned long disk_start_io_acct(struct gendisk *disk, unsigned int sectors,
unsigned int op)
@@
-1366,12
+1359,12
@@
static void __part_end_io_acct(struct block_device *part, unsigned int op,
part_stat_unlock();
}
part_stat_unlock();
}
-void
part_end_io_acct(struct block_device *part, struct bio *bio
,
-
unsigned long start_time
)
+void
bio_end_io_acct_remapped(struct bio *bio, unsigned long start_time
,
+
struct block_device *orig_bdev
)
{
{
- __part_end_io_acct(
part
, bio_op(bio), start_time);
+ __part_end_io_acct(
orig_bdev
, bio_op(bio), start_time);
}
}
-EXPORT_SYMBOL_GPL(
part_end_io_acct
);
+EXPORT_SYMBOL_GPL(
bio_end_io_acct_remapped
);
void disk_end_io_acct(struct gendisk *disk, unsigned int op,
unsigned long start_time)
void disk_end_io_acct(struct gendisk *disk, unsigned int op,
unsigned long start_time)