block fixes for 3.0-rc4
Subsystems (3)
Hi Linus,
A small collection of fixes for the current cycle. Most of these are stable material as well.
- Fix a long standing race around the ioc lookup cache in cfq-iosched. Very elusive bug, as the window is really small. Seemed to reproduce most easily on single CPU systems.
- Add REQ_SECURE to the shared bio/rq mask.
- Bad types in throtl_log() prints.
- A small series of continued fixes disk event notification and bdev claiming from Tejun.
Please pull.
git://git.kernel.dk/linux-block.git for-linus
Jens Axboe (1):
cfq-iosched: fix locking around ioc->ioc_data assignment
Joe Perches (1):
block: Add __attribute__((format(printf...) and fix fallout
Namhyung Kim (1):
block: add REQ_SECURE to REQ_COMMON_MASK
Tejun Heo (4):
block: don't use non-syncing event blocking in disk_check_events()
block: remove non-syncing __disk_block_events() and fold it into disk_block_events()
block: make disk_block_events() properly wait for work cancellation
block: use the passed in @bdev when claiming if partno is zero
block/blk-throttle.c | 4 +- block/cfq-iosched.c | 16 +++++--- block/genhd.c | 79 ++++++++++++++++++++++++------------------ fs/block_dev.c | 14 +++++++- include/linux/blk_types.h | 2 +- include/linux/blktrace_api.h | 3 +- 6 files changed, 73 insertions(+), 45 deletions(-)
block/blk-throttle.c +2 -2
@@ -927,7 +927,7 @@ static int throtl_dispatch(struct request_queue *q)bio_list_init (&bio_list_on_stack); -throtl_log (td,"dispatch nr_queued=%lu read=%u write=%u" , +throtl_log (td,"dispatch nr_queued=%d read=%u write=%u" ,total_nr_queued (td), td->nr_queued[READ ], td->nr_queued[WRITE ]);
@@ -1204,7 +1204,7 @@ int blk_throtl_bio(struct request_queue *q, struct bio **biop) } queue_bio: - throtl_log_tg(td, tg, "[%c] bio. bdisp=%u sz=%u bps=%llu" + throtl_log_tg(td, tg, "[%c] bio. bdisp=%llu sz=%u bps=%llu" " iodisp=%u iops=%u queued=%d/%d", rw == READ ? 'R' : 'W', tg->bytes_disp[rw], bio->bi_size, tg->bps[rw],
block/cfq-iosched.c +10 -6
@@ -988,9 +988,10 @@ static void cfq_group_served(struct cfq_data *cfqd, struct cfq_group *cfqg,cfq_log_cfqg (cfqd, cfqg,"served: vt=%llu min_vt=%llu" , cfqg->vdisktime, st->min_vdisktime); -cfq_log_cfqq (cfqq->cfqd, cfqq,"sl_used=%u disp=%u charge=%u iops=%u" -" sect=%u" , used_sl, cfqq->slice_dispatch, charge, -iops_mode (cfqd), cfqq->nr_sectors); +cfq_log_cfqq (cfqq->cfqd, cfqq, +"sl_used=%u disp=%u charge=%u iops=%u sect=%lu" , + used_sl, cfqq->slice_dispatch, charge, +iops_mode (cfqd), cfqq->nr_sectors);cfq_blkiocg_update_timeslice_used (&cfqg->blkg, used_sl, unaccounted_sl);cfq_blkiocg_set_start_empty_time (&cfqg->blkg);
@@ -2023,8 +2024,8 @@ static void cfq_arm_slice_timer(struct cfq_data *cfqd)*/ if (sample_valid (cic->ttime_samples) && (cfqq->slice_end - jiffies < cic->ttime_mean)) { -cfq_log_cfqq (cfqd, cfqq,"Not idling. think_time:%d" , - cic->ttime_mean); +cfq_log_cfqq (cfqd, cfqq,"Not idling. think_time:%lu" , + cic->ttime_mean);return ; }
@@ -2772,8 +2773,11 @@ static void __cfq_exit_single_io_context(struct cfq_data *cfqd,smp_wmb (); cic->key =cfqd_dead_key (cfqd); -if (ioc->ioc_data == cic) +if (rcu_dereference (ioc->ioc_data) == cic) { +spin_lock (&ioc->lock);rcu_assign_pointer (ioc->ioc_data,NULL ); +spin_unlock (&ioc->lock); + }if (cic->cfqq[BLK_RW_ASYNC ]) {cfq_exit_cfqq (cfqd, cic->cfqq[BLK_RW_ASYNC ]);
block/genhd.c +45 -34
137 lines not on this page · raw message
fs/block_dev.c +13 -1
@@ -762,7 +762,19 @@ static struct block_device *bd_start_claiming(struct block_device *bdev,if (!disk)return ERR_PTR (-ENXIO ); - whole =bdget_disk (disk,0 ); +/* +* Normally, @bdev should equal what's returned from bdget_disk() +* if partno is 0; however, some drivers (floppy) use multiple +* bdev's for the same physical device and @bdev may be one of the +* aliases. Keep @bdev if partno is 0. This means claimer +* tracking is broken for those devices but it has always been that +* way. +*/ +if (partno) + whole =bdget_disk (disk,0 ); +else + whole =bdgrab (bdev); +module_put (disk->fops->owner);put_disk (disk);if (!whole)
include/linux/blk_types.h +1 -1
@@ -167,7 +167,7 @@ enum rq_flag_bits { (REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER)#define REQ_COMMON_MASK \ (REQ_WRITE | REQ_FAILFAST_MASK | REQ_SYNC | REQ_META | REQ_DISCARD | \ - REQ_NOIDLE | REQ_FLUSH | REQ_FUA) + REQ_NOIDLE | REQ_FLUSH | REQ_FUA | REQ_SECURE)#define REQ_CLONE_MASK REQ_COMMON_MASK#define REQ_RAHEAD (1 << __REQ_RAHEAD)
include/linux/blktrace_api.h +2 -1
@@ -169,7 +169,8 @@ extern void blk_trace_shutdown(struct request_queue *);extern int do_blk_trace_setup (struct request_queue *q,char *name,dev_t dev,struct block_device *bdev,struct blk_user_trace_setup *buts); -extern void __trace_note_message (struct blk_trace *,const char *fmt, ...); +extern __attribute__((format (printf,2 ,3 ))) +void __trace_note_message (struct blk_trace *,const char *fmt, ...);/** * blk_add_trace_msg - Add a (simple) message to the blktrace stream
Signature · 1 line
Jens Axboe