aboutsummaryrefslogtreecommitdiffstats
path: root/block
diff options
context:
space:
mode:
Diffstat (limited to 'block')
-rw-r--r--block/as-iosched.c2
-rw-r--r--block/genhd.c53
-rw-r--r--block/ll_rw_blk.c9
3 files changed, 58 insertions, 6 deletions
diff --git a/block/as-iosched.c b/block/as-iosched.c
index 640aa839d63f..109e91b91ffa 100644
--- a/block/as-iosched.c
+++ b/block/as-iosched.c
@@ -1306,7 +1306,7 @@ static void as_exit_queue(elevator_t *e)
1306 struct as_data *ad = e->elevator_data; 1306 struct as_data *ad = e->elevator_data;
1307 1307
1308 del_timer_sync(&ad->antic_timer); 1308 del_timer_sync(&ad->antic_timer);
1309 kblockd_flush(); 1309 kblockd_flush_work(&ad->antic_work);
1310 1310
1311 BUG_ON(!list_empty(&ad->fifo_list[REQ_SYNC])); 1311 BUG_ON(!list_empty(&ad->fifo_list[REQ_SYNC]));
1312 BUG_ON(!list_empty(&ad->fifo_list[REQ_ASYNC])); 1312 BUG_ON(!list_empty(&ad->fifo_list[REQ_ASYNC]));
diff --git a/block/genhd.c b/block/genhd.c
index b5664440896c..93a2cf654597 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -213,6 +213,59 @@ struct gendisk *get_gendisk(dev_t dev, int *part)
213 return kobj ? to_disk(kobj) : NULL; 213 return kobj ? to_disk(kobj) : NULL;
214} 214}
215 215
216/*
217 * print a full list of all partitions - intended for places where the root
218 * filesystem can't be mounted and thus to give the victim some idea of what
219 * went wrong
220 */
221void __init printk_all_partitions(void)
222{
223 int n;
224 struct gendisk *sgp;
225
226 mutex_lock(&block_subsys_lock);
227 /* For each block device... */
228 list_for_each_entry(sgp, &block_subsys.list, kobj.entry) {
229 char buf[BDEVNAME_SIZE];
230 /*
231 * Don't show empty devices or things that have been surpressed
232 */
233 if (get_capacity(sgp) == 0 ||
234 (sgp->flags & GENHD_FL_SUPPRESS_PARTITION_INFO))
235 continue;
236
237 /*
238 * Note, unlike /proc/partitions, I am showing the numbers in
239 * hex - the same format as the root= option takes.
240 */
241 printk("%02x%02x %10llu %s",
242 sgp->major, sgp->first_minor,
243 (unsigned long long)get_capacity(sgp) >> 1,
244 disk_name(sgp, 0, buf));
245 if (sgp->driverfs_dev != NULL &&
246 sgp->driverfs_dev->driver != NULL)
247 printk(" driver: %s\n",
248 sgp->driverfs_dev->driver->name);
249 else
250 printk(" (driver?)\n");
251
252 /* now show the partitions */
253 for (n = 0; n < sgp->minors - 1; ++n) {
254 if (sgp->part[n] == NULL)
255 continue;
256 if (sgp->part[n]->nr_sects == 0)
257 continue;
258 printk(" %02x%02x %10llu %s\n",
259 sgp->major, n + 1 + sgp->first_minor,
260 (unsigned long long)sgp->part[n]->nr_sects >> 1,
261 disk_name(sgp, n + 1, buf));
262 } /* partition subloop */
263 } /* Block device loop */
264
265 mutex_unlock(&block_subsys_lock);
266 return;
267}
268
216#ifdef CONFIG_PROC_FS 269#ifdef CONFIG_PROC_FS
217/* iterator */ 270/* iterator */
218static void *part_start(struct seq_file *part, loff_t *pos) 271static void *part_start(struct seq_file *part, loff_t *pos)
diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index f294f1538f1e..17e188973428 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -1712,7 +1712,6 @@ EXPORT_SYMBOL(blk_stop_queue);
1712void blk_sync_queue(struct request_queue *q) 1712void blk_sync_queue(struct request_queue *q)
1713{ 1713{
1714 del_timer_sync(&q->unplug_timer); 1714 del_timer_sync(&q->unplug_timer);
1715 kblockd_flush();
1716} 1715}
1717EXPORT_SYMBOL(blk_sync_queue); 1716EXPORT_SYMBOL(blk_sync_queue);
1718 1717
@@ -3508,7 +3507,7 @@ static int blk_cpu_notify(struct notifier_block *self, unsigned long action,
3508 * If a CPU goes away, splice its entries to the current CPU 3507 * If a CPU goes away, splice its entries to the current CPU
3509 * and trigger a run of the softirq 3508 * and trigger a run of the softirq
3510 */ 3509 */
3511 if (action == CPU_DEAD) { 3510 if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {
3512 int cpu = (unsigned long) hcpu; 3511 int cpu = (unsigned long) hcpu;
3513 3512
3514 local_irq_disable(); 3513 local_irq_disable();
@@ -3632,11 +3631,11 @@ int kblockd_schedule_work(struct work_struct *work)
3632 3631
3633EXPORT_SYMBOL(kblockd_schedule_work); 3632EXPORT_SYMBOL(kblockd_schedule_work);
3634 3633
3635void kblockd_flush(void) 3634void kblockd_flush_work(struct work_struct *work)
3636{ 3635{
3637 flush_workqueue(kblockd_workqueue); 3636 cancel_work_sync(work);
3638} 3637}
3639EXPORT_SYMBOL(kblockd_flush); 3638EXPORT_SYMBOL(kblockd_flush_work);
3640 3639
3641int __init blk_dev_init(void) 3640int __init blk_dev_init(void)
3642{ 3641{