diff options
Diffstat (limited to 'block')
47 files changed, 94 insertions, 18 deletions
diff --git a/block/Kconfig b/block/Kconfig index 3ab42bbb06d5..28ec55752b68 100644 --- a/block/Kconfig +++ b/block/Kconfig @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 # # Block layer core configuration # diff --git a/block/Kconfig.iosched b/block/Kconfig.iosched index fd2cefa47d35..a4a8914bf7a4 100644 --- a/block/Kconfig.iosched +++ b/block/Kconfig.iosched @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 if BLOCK menu "IO Schedulers" diff --git a/block/Makefile b/block/Makefile index 9396ebc85d24..6a56303b9925 100644 --- a/block/Makefile +++ b/block/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 # # Makefile for the kernel block layer # diff --git a/block/bio.c b/block/bio.c index b38e962fa83e..101c2a9b5481 100644 --- a/block/bio.c +++ b/block/bio.c @@ -1239,8 +1239,8 @@ struct bio *bio_copy_user_iov(struct request_queue *q, */ bmd->is_our_pages = map_data ? 0 : 1; memcpy(bmd->iov, iter->iov, sizeof(struct iovec) * iter->nr_segs); - iov_iter_init(&bmd->iter, iter->type, bmd->iov, - iter->nr_segs, iter->count); + bmd->iter = *iter; + bmd->iter.iov = bmd->iov; ret = -ENOMEM; bio = bio_kmalloc(gfp_mask, nr_pages); @@ -1331,6 +1331,7 @@ struct bio *bio_map_user_iov(struct request_queue *q, int ret, offset; struct iov_iter i; struct iovec iov; + struct bio_vec *bvec; iov_for_each(iov, i, *iter) { unsigned long uaddr = (unsigned long) iov.iov_base; @@ -1375,7 +1376,12 @@ struct bio *bio_map_user_iov(struct request_queue *q, ret = get_user_pages_fast(uaddr, local_nr_pages, (iter->type & WRITE) != WRITE, &pages[cur_page]); - if (ret < local_nr_pages) { + if (unlikely(ret < local_nr_pages)) { + for (j = cur_page; j < page_limit; j++) { + if (!pages[j]) + break; + put_page(pages[j]); + } ret = -EFAULT; goto out_unmap; } @@ -1383,6 +1389,7 @@ struct bio *bio_map_user_iov(struct request_queue *q, offset = offset_in_page(uaddr); for (j = cur_page; j < page_limit; j++) { unsigned int bytes = PAGE_SIZE - offset; + unsigned short prev_bi_vcnt = bio->bi_vcnt; if (len <= 0) break; @@ -1397,6 +1404,13 @@ struct bio *bio_map_user_iov(struct request_queue *q, bytes) break; + /* + * check if vector was merged with previous + * drop page reference if needed + */ + if (bio->bi_vcnt == prev_bi_vcnt) + put_page(pages[j]); + len -= bytes; offset = 0; } @@ -1423,10 +1437,8 @@ struct bio *bio_map_user_iov(struct request_queue *q, return bio; out_unmap: - for (j = 0; j < nr_pages; j++) { - if (!pages[j]) - break; - put_page(pages[j]); + bio_for_each_segment_all(bvec, bio, j) { + put_page(bvec->bv_page); } out: kfree(pages); diff --git a/block/blk-core.c b/block/blk-core.c index aebe676225e6..048be4aa6024 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -854,6 +854,9 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id) kobject_init(&q->kobj, &blk_queue_ktype); +#ifdef CONFIG_BLK_DEV_IO_TRACE + mutex_init(&q->blk_trace_mutex); +#endif mutex_init(&q->sysfs_lock); spin_lock_init(&q->__queue_lock); diff --git a/block/blk-ioc.c b/block/blk-ioc.c index 63898d229cb9..f23311e4b201 100644 --- a/block/blk-ioc.c +++ b/block/blk-ioc.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions related to io context handling */ diff --git a/block/blk-lib.c b/block/blk-lib.c index 62240f8832ca..63fb971d6574 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions related to generic helpers functions */ diff --git a/block/blk-map.c b/block/blk-map.c index 2547016aa7aa..d5251edcc0dd 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions related to mapping data to requests */ diff --git a/block/blk-merge.c b/block/blk-merge.c index aa524cad5bea..f5dedd57dff6 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions related to segment and merge handling */ diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c index 980e73095643..de294d775acf 100644 --- a/block/blk-mq-debugfs.c +++ b/block/blk-mq-debugfs.c @@ -815,10 +815,14 @@ int blk_mq_debugfs_register(struct request_queue *q) goto err; /* - * blk_mq_init_hctx() attempted to do this already, but q->debugfs_dir + * blk_mq_init_sched() attempted to do this already, but q->debugfs_dir * didn't exist yet (because we don't know what to name the directory * until the queue is registered to a gendisk). */ + if (q->elevator && !q->sched_debugfs_dir) + blk_mq_debugfs_register_sched(q); + + /* Similarly, blk_mq_init_hctx() couldn't do this previously. */ queue_for_each_hw_ctx(q, hctx, i) { if (!hctx->debugfs_dir && blk_mq_debugfs_register_hctx(q, hctx)) goto err; diff --git a/block/blk-mq-debugfs.h b/block/blk-mq-debugfs.h index a182e6f97565..b9d366e57097 100644 --- a/block/blk-mq-debugfs.h +++ b/block/blk-mq-debugfs.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #ifndef INT_BLK_MQ_DEBUGFS_H #define INT_BLK_MQ_DEBUGFS_H diff --git a/block/blk-mq-sched.h b/block/blk-mq-sched.h index 9267d0b7c197..ba1d1418a96d 100644 --- a/block/blk-mq-sched.h +++ b/block/blk-mq-sched.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #ifndef BLK_MQ_SCHED_H #define BLK_MQ_SCHED_H diff --git a/block/blk-mq-tag.h b/block/blk-mq-tag.h index 5cb51e53cc03..c190165d92ea 100644 --- a/block/blk-mq-tag.h +++ b/block/blk-mq-tag.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #ifndef INT_BLK_MQ_TAG_H #define INT_BLK_MQ_TAG_H diff --git a/block/blk-mq.h b/block/blk-mq.h index ef15b3414da5..4933af9d61f7 100644 --- a/block/blk-mq.h +++ b/block/blk-mq.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #ifndef INT_BLK_MQ_H #define INT_BLK_MQ_H diff --git a/block/blk-softirq.c b/block/blk-softirq.c index 07125e7941f4..01e2b353a2b9 100644 --- a/block/blk-softirq.c +++ b/block/blk-softirq.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions related to softirq rq completions */ diff --git a/block/blk-stat.h b/block/blk-stat.h index 2fb20d1a341a..2dd36347252a 100644 --- a/block/blk-stat.h +++ b/block/blk-stat.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #ifndef BLK_STAT_H #define BLK_STAT_H diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index b8362c0df51d..e54be402899d 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions related to sysfs handling */ diff --git a/block/blk-tag.c b/block/blk-tag.c index e1a9c15eb1b8..09f19c6c52ce 100644 --- a/block/blk-tag.c +++ b/block/blk-tag.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Functions related to tagged command queuing */ diff --git a/block/blk-throttle.c b/block/blk-throttle.c index 0fea76aa0f3f..8631763866c6 100644 --- a/block/blk-throttle.c +++ b/block/blk-throttle.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Interface for controlling IO bandwidth on a request queue * @@ -1911,11 +1912,11 @@ static void throtl_upgrade_state(struct throtl_data *td) tg->disptime = jiffies - 1; throtl_select_dispatch(sq); - throtl_schedule_next_dispatch(sq, false); + throtl_schedule_next_dispatch(sq, true); } rcu_read_unlock(); throtl_select_dispatch(&td->service_queue); - throtl_schedule_next_dispatch(&td->service_queue, false); + throtl_schedule_next_dispatch(&td->service_queue, true); queue_work(kthrotld_workqueue, &td->dispatch_work); } diff --git a/block/blk-wbt.h b/block/blk-wbt.h index df6de50c5d59..a232c98fbf4d 100644 --- a/block/blk-wbt.h +++ b/block/blk-wbt.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #ifndef WB_THROTTLE_H #define WB_THROTTLE_H diff --git a/block/blk.h b/block/blk.h index fcb9775b997d..85be8b232b37 100644 --- a/block/blk.h +++ b/block/blk.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #ifndef BLK_INTERNAL_H #define BLK_INTERNAL_H diff --git a/block/bounce.c b/block/bounce.c index 5793c2dc1a15..fceb1a96480b 100644 --- a/block/bounce.c +++ b/block/bounce.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* bounce buffer handling for block devices * * - Split from highmem.c diff --git a/block/bsg-lib.c b/block/bsg-lib.c index c82408c7cc3c..15d25ccd51a5 100644 --- a/block/bsg-lib.c +++ b/block/bsg-lib.c @@ -154,7 +154,6 @@ static int bsg_prepare_job(struct device *dev, struct request *req) failjob_rls_rqst_payload: kfree(job->request_payload.sg_list); failjob_rls_job: - kfree(job); return -ENOMEM; } @@ -208,20 +207,34 @@ static int bsg_init_rq(struct request_queue *q, struct request *req, gfp_t gfp) struct bsg_job *job = blk_mq_rq_to_pdu(req); struct scsi_request *sreq = &job->sreq; + /* called right after the request is allocated for the request_queue */ + + sreq->sense = kzalloc(SCSI_SENSE_BUFFERSIZE, gfp); + if (!sreq->sense) + return -ENOMEM; + + return 0; +} + +static void bsg_initialize_rq(struct request *req) +{ + struct bsg_job *job = blk_mq_rq_to_pdu(req); + struct scsi_request *sreq = &job->sreq; + void *sense = sreq->sense; + + /* called right before the request is given to the request_queue user */ + memset(job, 0, sizeof(*job)); scsi_req_init(sreq); + + sreq->sense = sense; sreq->sense_len = SCSI_SENSE_BUFFERSIZE; - sreq->sense = kzalloc(sreq->sense_len, gfp); - if (!sreq->sense) - return -ENOMEM; job->req = req; - job->reply = sreq->sense; + job->reply = sense; job->reply_len = sreq->sense_len; job->dd_data = job + 1; - - return 0; } static void bsg_exit_rq(struct request_queue *q, struct request *req) @@ -252,6 +265,7 @@ struct request_queue *bsg_setup_queue(struct device *dev, const char *name, q->cmd_size = sizeof(struct bsg_job) + dd_job_size; q->init_rq_fn = bsg_init_rq; q->exit_rq_fn = bsg_exit_rq; + q->initialize_rq_fn = bsg_initialize_rq; q->request_fn = bsg_request_fn; ret = blk_init_allocated_queue(q); diff --git a/block/cmdline-parser.c b/block/cmdline-parser.c index 9dbc67e42a99..f2a14571882b 100644 --- a/block/cmdline-parser.c +++ b/block/cmdline-parser.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Parse command line, get partition information * diff --git a/block/compat_ioctl.c b/block/compat_ioctl.c index abaf9d78a206..6ca015f92766 100644 --- a/block/compat_ioctl.c +++ b/block/compat_ioctl.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 #include <linux/blkdev.h> #include <linux/blkpg.h> #include <linux/blktrace_api.h> diff --git a/block/partition-generic.c b/block/partition-generic.c index 86e8fe1adcdb..91622db9aedf 100644 --- a/block/partition-generic.c +++ b/block/partition-generic.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Code extracted from drivers/block/genhd.c * Copyright (C) 1991-1998 Linus Torvalds @@ -112,7 +113,7 @@ ssize_t part_stat_show(struct device *dev, struct device_attribute *attr, char *buf) { struct hd_struct *p = dev_to_part(dev); - struct request_queue *q = dev_to_disk(dev)->queue; + struct request_queue *q = part_to_disk(p)->queue; unsigned int inflight[2]; int cpu; diff --git a/block/partitions/Kconfig b/block/partitions/Kconfig index 9b29a996c311..37b9710cc80a 100644 --- a/block/partitions/Kconfig +++ b/block/partitions/Kconfig @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 # # Partition configuration # diff --git a/block/partitions/Makefile b/block/partitions/Makefile index 37a95270503c..2f276b677c81 100644 --- a/block/partitions/Makefile +++ b/block/partitions/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0 # # Makefile for the linux kernel. # diff --git a/block/partitions/acorn.h b/block/partitions/acorn.h index ede828529692..67b06601ca4c 100644 --- a/block/partitions/acorn.h +++ b/block/partitions/acorn.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ /* * linux/fs/partitions/acorn.h * diff --git a/block/partitions/aix.c b/block/partitions/aix.c index f3ed7b2d89bf..007f95eea0e1 100644 --- a/block/partitions/aix.c +++ b/block/partitions/aix.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/aix.c * diff --git a/block/partitions/amiga.c b/block/partitions/amiga.c index 2b13533d60a2..560936617d9c 100644 --- a/block/partitions/amiga.c +++ b/block/partitions/amiga.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/amiga.c * diff --git a/block/partitions/atari.c b/block/partitions/atari.c index ff1fb93712c1..2305840c8522 100644 --- a/block/partitions/atari.c +++ b/block/partitions/atari.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/atari.c * diff --git a/block/partitions/atari.h b/block/partitions/atari.h index f2ec43bfeec1..01c2b9457394 100644 --- a/block/partitions/atari.h +++ b/block/partitions/atari.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ /* * fs/partitions/atari.h * Moved by Russell King from: diff --git a/block/partitions/check.c b/block/partitions/check.c index 16118d11dbfc..720145c49066 100644 --- a/block/partitions/check.c +++ b/block/partitions/check.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/check.c * diff --git a/block/partitions/check.h b/block/partitions/check.h index eade17ea910b..6042f769471a 100644 --- a/block/partitions/check.h +++ b/block/partitions/check.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ #include <linux/pagemap.h> #include <linux/blkdev.h> #include <linux/genhd.h> diff --git a/block/partitions/cmdline.c b/block/partitions/cmdline.c index 5141b563adf1..e333583ab38c 100644 --- a/block/partitions/cmdline.c +++ b/block/partitions/cmdline.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2013 HUAWEI * Author: Cai Zhiyong <caizhiyong@huawei.com> diff --git a/block/partitions/cmdline.h b/block/partitions/cmdline.h index 26e0f8da1414..e64a31636a1f 100644 --- a/block/partitions/cmdline.h +++ b/block/partitions/cmdline.h @@ -1,2 +1,3 @@ +/* SPDX-License-Identifier: GPL-2.0 */ int cmdline_partition(struct parsed_partitions *state); diff --git a/block/partitions/ibm.c b/block/partitions/ibm.c index 14b081af8d61..a5d480f807f3 100644 --- a/block/partitions/ibm.c +++ b/block/partitions/ibm.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> * Volker Sameske <sameske@de.ibm.com> diff --git a/block/partitions/karma.c b/block/partitions/karma.c index 9721fa589bb1..59812d705c3d 100644 --- a/block/partitions/karma.c +++ b/block/partitions/karma.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/karma.c * Rio Karma partition info. diff --git a/block/partitions/mac.c b/block/partitions/mac.c index 621317ac4d59..b6095335636c 100644 --- a/block/partitions/mac.c +++ b/block/partitions/mac.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/mac.c * diff --git a/block/partitions/mac.h b/block/partitions/mac.h index 3c7d98436380..453ed2964804 100644 --- a/block/partitions/mac.h +++ b/block/partitions/mac.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */ /* * fs/partitions/mac.h */ diff --git a/block/partitions/msdos.c b/block/partitions/msdos.c index 5610cd537da7..0af3a3db6fb0 100644 --- a/block/partitions/msdos.c +++ b/block/partitions/msdos.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/msdos.c * diff --git a/block/partitions/osf.c b/block/partitions/osf.c index 764b86a01965..4b873973d6c0 100644 --- a/block/partitions/osf.c +++ b/block/partitions/osf.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/osf.c * diff --git a/block/partitions/sgi.c b/block/partitions/sgi.c index ea8a86dceaf4..d7b421c6e530 100644 --- a/block/partitions/sgi.c +++ b/block/partitions/sgi.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/sgi.c * diff --git a/block/partitions/sun.c b/block/partitions/sun.c index b5b6fcfb3d36..90f36724e796 100644 --- a/block/partitions/sun.c +++ b/block/partitions/sun.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/sun.c * diff --git a/block/partitions/sysv68.c b/block/partitions/sysv68.c index 9627ccffc1c4..92e810826b01 100644 --- a/block/partitions/sysv68.c +++ b/block/partitions/sysv68.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/sysv68.c * diff --git a/block/partitions/ultrix.c b/block/partitions/ultrix.c index 8dbaf9f77a99..ecd0d7346c3d 100644 --- a/block/partitions/ultrix.c +++ b/block/partitions/ultrix.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0 /* * fs/partitions/ultrix.c * |