Lines Matching refs:block
147 struct dasd_block *block; in dasd_alloc_block() local
149 block = kzalloc(sizeof(*block), GFP_ATOMIC); in dasd_alloc_block()
150 if (!block) in dasd_alloc_block()
153 atomic_set(&block->open_count, -1); in dasd_alloc_block()
155 spin_lock_init(&block->request_queue_lock); in dasd_alloc_block()
156 atomic_set(&block->tasklet_scheduled, 0); in dasd_alloc_block()
157 tasklet_init(&block->tasklet, in dasd_alloc_block()
159 (unsigned long) block); in dasd_alloc_block()
160 INIT_LIST_HEAD(&block->ccw_queue); in dasd_alloc_block()
161 spin_lock_init(&block->queue_lock); in dasd_alloc_block()
162 init_timer(&block->timer); in dasd_alloc_block()
163 block->timer.function = dasd_block_timeout; in dasd_alloc_block()
164 block->timer.data = (unsigned long) block; in dasd_alloc_block()
165 spin_lock_init(&block->profile.lock); in dasd_alloc_block()
167 return block; in dasd_alloc_block()
174 void dasd_free_block(struct dasd_block *block) in dasd_free_block() argument
176 kfree(block); in dasd_free_block()
193 if (device->block) { in dasd_state_new_to_known()
194 rc = dasd_alloc_queue(device->block); in dasd_state_new_to_known()
223 if (device->block) in dasd_state_known_to_new()
224 dasd_free_queue(device->block); in dasd_state_known_to_new()
249 struct dasd_block *block = device->block; in dasd_state_known_to_basic() local
253 if (block) { in dasd_state_known_to_basic()
254 rc = dasd_gendisk_alloc(block); in dasd_state_known_to_basic()
257 block->debugfs_dentry = in dasd_state_known_to_basic()
258 dasd_debugfs_setup(block->gdp->disk_name, in dasd_state_known_to_basic()
260 dasd_profile_init(&block->profile, block->debugfs_dentry); in dasd_state_known_to_basic()
262 dasd_profile_on(&device->block->profile); in dasd_state_known_to_basic()
294 if (device->block) { in dasd_state_basic_to_known()
295 dasd_profile_exit(&device->block->profile); in dasd_state_basic_to_known()
296 debugfs_remove(device->block->debugfs_dentry); in dasd_state_basic_to_known()
297 dasd_gendisk_free(device->block); in dasd_state_basic_to_known()
298 dasd_block_clear_timer(device->block); in dasd_state_basic_to_known()
332 struct dasd_block *block; in dasd_state_basic_to_ready() local
335 block = device->block; in dasd_state_basic_to_ready()
337 if (block) { in dasd_state_basic_to_ready()
338 if (block->base->discipline->do_analysis != NULL) in dasd_state_basic_to_ready()
339 rc = block->base->discipline->do_analysis(block); in dasd_state_basic_to_ready()
347 dasd_setup_queue(block); in dasd_state_basic_to_ready()
348 set_capacity(block->gdp, in dasd_state_basic_to_ready()
349 block->blocks << block->s2b_shift); in dasd_state_basic_to_ready()
351 rc = dasd_scan_partitions(block); in dasd_state_basic_to_ready()
368 if (device->block) in _wait_for_empty_queues()
370 list_empty(&device->block->ccw_queue); in _wait_for_empty_queues()
385 if (device->block) { in dasd_state_ready_to_basic()
386 struct dasd_block *block = device->block; in dasd_state_ready_to_basic() local
387 rc = dasd_flush_block_queue(block); in dasd_state_ready_to_basic()
392 dasd_flush_request_queue(block); in dasd_state_ready_to_basic()
393 dasd_destroy_partitions(block); in dasd_state_ready_to_basic()
394 block->blocks = 0; in dasd_state_ready_to_basic()
395 block->bp_block = 0; in dasd_state_ready_to_basic()
396 block->s2b_shift = 0; in dasd_state_ready_to_basic()
423 if (device->block) { in dasd_state_ready_to_online()
424 dasd_schedule_block_bh(device->block); in dasd_state_ready_to_online()
426 disk = device->block->gdp; in dasd_state_ready_to_online()
430 disk = device->block->bdev->bd_disk; in dasd_state_ready_to_online()
456 if (device->block && !(device->features & DASD_FEATURE_USERAW)) { in dasd_state_online_to_ready()
457 disk = device->block->bdev->bd_disk; in dasd_state_online_to_ready()
688 static void dasd_profile_start(struct dasd_block *block, in dasd_profile_start() argument
698 if (dasd_global_profile_level || block->profile.data) in dasd_profile_start()
699 list_for_each(l, &block->ccw_queue) in dasd_profile_start()
711 spin_lock(&block->profile.lock); in dasd_profile_start()
712 if (block->profile.data) { in dasd_profile_start()
713 block->profile.data->dasd_io_nr_req[counter]++; in dasd_profile_start()
715 block->profile.data->dasd_read_nr_req[counter]++; in dasd_profile_start()
717 spin_unlock(&block->profile.lock); in dasd_profile_start()
798 static void dasd_profile_end(struct dasd_block *block, in dasd_profile_end() argument
810 block->profile.data || in dasd_profile_end()
837 cqr->startdev != block->base, in dasd_profile_end()
847 spin_lock(&block->profile.lock); in dasd_profile_end()
848 if (block->profile.data) in dasd_profile_end()
849 dasd_profile_end_add_data(block->profile.data, in dasd_profile_end()
850 cqr->startdev != block->base, in dasd_profile_end()
857 spin_unlock(&block->profile.lock); in dasd_profile_end()
862 cqr->startdev != block->base, in dasd_profile_end()
1114 #define dasd_profile_start(block, cqr, req) do {} while (0) argument
1115 #define dasd_profile_end(block, cqr, req) do {} while (0) argument
1377 if (((cqr->block && in dasd_start_IO()
1378 test_bit(DASD_FLAG_LOCK_STOLEN, &cqr->block->base->flags)) || in dasd_start_IO()
1569 if (device->block) in dasd_generic_handle_state_change()
1570 dasd_schedule_block_bh(device->block); in dasd_generic_handle_state_change()
1740 if (!ref_cqr->block) in __dasd_device_recovery()
1746 ref_cqr->block == cqr->block) { in __dasd_device_recovery()
1788 struct dasd_block *block; in __dasd_device_process_final_queue() local
1796 block = cqr->block; in __dasd_device_process_final_queue()
1799 if (block) in __dasd_device_process_final_queue()
1800 spin_lock_bh(&block->queue_lock); in __dasd_device_process_final_queue()
1821 if (block) in __dasd_device_process_final_queue()
1822 spin_unlock_bh(&block->queue_lock); in __dasd_device_process_final_queue()
2396 if (device->block) in dasd_sleep_on_immediatly()
2397 dasd_schedule_block_bh(device->block); in dasd_sleep_on_immediatly()
2459 struct dasd_block *block; in dasd_block_timeout() local
2461 block = (struct dasd_block *) ptr; in dasd_block_timeout()
2462 spin_lock_irqsave(get_ccwdev_lock(block->base->cdev), flags); in dasd_block_timeout()
2464 dasd_device_remove_stop_bits(block->base, DASD_STOPPED_PENDING); in dasd_block_timeout()
2465 spin_unlock_irqrestore(get_ccwdev_lock(block->base->cdev), flags); in dasd_block_timeout()
2466 dasd_schedule_block_bh(block); in dasd_block_timeout()
2472 void dasd_block_set_timer(struct dasd_block *block, int expires) in dasd_block_set_timer() argument
2475 del_timer(&block->timer); in dasd_block_set_timer()
2477 mod_timer(&block->timer, jiffies + expires); in dasd_block_set_timer()
2484 void dasd_block_clear_timer(struct dasd_block *block) in dasd_block_clear_timer() argument
2486 del_timer(&block->timer); in dasd_block_clear_timer()
2509 static void __dasd_process_request_queue(struct dasd_block *block) in __dasd_process_request_queue() argument
2516 queue = block->request_queue; in __dasd_process_request_queue()
2517 basedev = block->base; in __dasd_process_request_queue()
2530 while ((req = blk_fetch_request(block->request_queue))) in __dasd_process_request_queue()
2560 cqr = basedev->discipline->build_cp(basedev, block, req); in __dasd_process_request_queue()
2573 if (!list_empty(&block->ccw_queue)) in __dasd_process_request_queue()
2581 dasd_block_set_timer(block, HZ/2); in __dasd_process_request_queue()
2600 list_add_tail(&cqr->blocklist, &block->ccw_queue); in __dasd_process_request_queue()
2602 dasd_profile_start(block, cqr, req); in __dasd_process_request_queue()
2613 dasd_profile_end(cqr->block, cqr, req); in __dasd_cleanup_cqr()
2614 status = cqr->block->base->discipline->free_cp(cqr, req); in __dasd_cleanup_cqr()
2632 static void __dasd_process_block_ccw_queue(struct dasd_block *block, in __dasd_process_block_ccw_queue() argument
2639 struct dasd_device *base = block->base; in __dasd_process_block_ccw_queue()
2643 list_for_each_safe(l, n, &block->ccw_queue) { in __dasd_process_block_ccw_queue()
2698 dasd_schedule_block_bh(cqr->block); in dasd_return_cqr_cb()
2701 static void __dasd_block_start_head(struct dasd_block *block) in __dasd_block_start_head() argument
2705 if (list_empty(&block->ccw_queue)) in __dasd_block_start_head()
2711 list_for_each_entry(cqr, &block->ccw_queue, blocklist) { in __dasd_block_start_head()
2714 if (test_bit(DASD_FLAG_LOCK_STOLEN, &block->base->flags) && in __dasd_block_start_head()
2718 dasd_schedule_block_bh(block); in __dasd_block_start_head()
2722 if (block->base->stopped & ~DASD_STOPPED_PENDING && in __dasd_block_start_head()
2724 (!dasd_eer_enabled(block->base))) { in __dasd_block_start_head()
2727 dasd_schedule_block_bh(block); in __dasd_block_start_head()
2731 if (block->base->stopped) in __dasd_block_start_head()
2736 cqr->startdev = block->base; in __dasd_block_start_head()
2750 static void dasd_block_tasklet(struct dasd_block *block) in dasd_block_tasklet() argument
2756 atomic_set(&block->tasklet_scheduled, 0); in dasd_block_tasklet()
2758 spin_lock(&block->queue_lock); in dasd_block_tasklet()
2760 __dasd_process_block_ccw_queue(block, &final_queue); in dasd_block_tasklet()
2761 spin_unlock(&block->queue_lock); in dasd_block_tasklet()
2763 spin_lock_irq(&block->request_queue_lock); in dasd_block_tasklet()
2769 spin_lock(&block->queue_lock); in dasd_block_tasklet()
2771 __dasd_process_request_queue(block); in dasd_block_tasklet()
2773 __dasd_block_start_head(block); in dasd_block_tasklet()
2774 spin_unlock(&block->queue_lock); in dasd_block_tasklet()
2775 spin_unlock_irq(&block->request_queue_lock); in dasd_block_tasklet()
2778 dasd_put_device(block->base); in dasd_block_tasklet()
2792 struct dasd_block *block = cqr->block; in _dasd_requeue_request() local
2796 if (!block) in _dasd_requeue_request()
2798 spin_lock_irqsave(&block->queue_lock, flags); in _dasd_requeue_request()
2800 blk_requeue_request(block->request_queue, req); in _dasd_requeue_request()
2801 spin_unlock_irqrestore(&block->queue_lock, flags); in _dasd_requeue_request()
2811 static int dasd_flush_block_queue(struct dasd_block *block) in dasd_flush_block_queue() argument
2818 spin_lock_bh(&block->queue_lock); in dasd_flush_block_queue()
2821 list_for_each_entry_safe(cqr, n, &block->ccw_queue, blocklist) { in dasd_flush_block_queue()
2839 spin_unlock_bh(&block->queue_lock); in dasd_flush_block_queue()
2846 spin_lock_bh(&block->queue_lock); in dasd_flush_block_queue()
2847 __dasd_process_erp(block->base, cqr); in dasd_flush_block_queue()
2848 spin_unlock_bh(&block->queue_lock); in dasd_flush_block_queue()
2854 spin_lock_irq(&block->request_queue_lock); in dasd_flush_block_queue()
2858 spin_unlock_irq(&block->request_queue_lock); in dasd_flush_block_queue()
2866 void dasd_schedule_block_bh(struct dasd_block *block) in dasd_schedule_block_bh() argument
2869 if (atomic_cmpxchg(&block->tasklet_scheduled, 0, 1) != 0) in dasd_schedule_block_bh()
2872 dasd_get_device(block->base); in dasd_schedule_block_bh()
2873 tasklet_hi_schedule(&block->tasklet); in dasd_schedule_block_bh()
2888 struct dasd_block *block; in do_dasd_request() local
2890 block = queue->queuedata; in do_dasd_request()
2891 spin_lock(&block->queue_lock); in do_dasd_request()
2893 __dasd_process_request_queue(block); in do_dasd_request()
2895 __dasd_block_start_head(block); in do_dasd_request()
2896 spin_unlock(&block->queue_lock); in do_dasd_request()
2912 struct dasd_block *block = req->q->queuedata; in dasd_times_out() local
2919 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
2926 spin_lock(&block->queue_lock); in dasd_times_out()
2941 &block->ccw_queue, blocklist) { in dasd_times_out()
2969 dasd_schedule_block_bh(block); in dasd_times_out()
2970 spin_unlock(&block->queue_lock); in dasd_times_out()
2978 static int dasd_alloc_queue(struct dasd_block *block) in dasd_alloc_queue() argument
2980 block->request_queue = blk_init_queue(do_dasd_request, in dasd_alloc_queue()
2981 &block->request_queue_lock); in dasd_alloc_queue()
2982 if (block->request_queue == NULL) in dasd_alloc_queue()
2985 block->request_queue->queuedata = block; in dasd_alloc_queue()
2993 static void dasd_setup_queue(struct dasd_block *block) in dasd_setup_queue() argument
2997 if (block->base->features & DASD_FEATURE_USERAW) { in dasd_setup_queue()
3007 max = block->base->discipline->max_blocks << block->s2b_shift; in dasd_setup_queue()
3009 blk_queue_logical_block_size(block->request_queue, in dasd_setup_queue()
3010 block->bp_block); in dasd_setup_queue()
3011 blk_queue_max_hw_sectors(block->request_queue, max); in dasd_setup_queue()
3012 blk_queue_max_segments(block->request_queue, -1L); in dasd_setup_queue()
3016 blk_queue_max_segment_size(block->request_queue, PAGE_SIZE); in dasd_setup_queue()
3017 blk_queue_segment_boundary(block->request_queue, PAGE_SIZE - 1); in dasd_setup_queue()
3023 static void dasd_free_queue(struct dasd_block *block) in dasd_free_queue() argument
3025 if (block->request_queue) { in dasd_free_queue()
3026 blk_cleanup_queue(block->request_queue); in dasd_free_queue()
3027 block->request_queue = NULL; in dasd_free_queue()
3034 static void dasd_flush_request_queue(struct dasd_block *block) in dasd_flush_request_queue() argument
3038 if (!block->request_queue) in dasd_flush_request_queue()
3041 spin_lock_irq(&block->request_queue_lock); in dasd_flush_request_queue()
3042 while ((req = blk_fetch_request(block->request_queue))) in dasd_flush_request_queue()
3044 spin_unlock_irq(&block->request_queue_lock); in dasd_flush_request_queue()
3056 atomic_inc(&base->block->open_count); in dasd_open()
3095 atomic_dec(&base->block->open_count); in dasd_open()
3104 atomic_dec(&base->block->open_count); in dasd_release()
3126 base->discipline->fill_geometry(base->block, geo); in dasd_getgeo()
3127 geo->start = get_start_sect(bdev) >> base->block->s2b_shift; in dasd_getgeo()
3246 struct dasd_block *block; in dasd_generic_remove() local
3269 block = device->block; in dasd_generic_remove()
3275 if (block) in dasd_generic_remove()
3276 dasd_free_block(block); in dasd_generic_remove()
3339 if (device->block) in dasd_generic_set_online()
3340 dasd_free_block(device->block); in dasd_generic_set_online()
3356 struct dasd_block *block; in dasd_generic_set_offline() local
3370 if (device->block) { in dasd_generic_set_offline()
3371 max_count = device->block->bdev ? 0 : -1; in dasd_generic_set_offline()
3372 open_count = atomic_read(&device->block->open_count); in dasd_generic_set_offline()
3420 rc = fsync_bdev(device->block->bdev); in dasd_generic_set_offline()
3435 block = device->block; in dasd_generic_set_offline()
3441 if (block) in dasd_generic_set_offline()
3442 dasd_free_block(block); in dasd_generic_set_offline()
3493 if (device->block) in dasd_generic_path_operational()
3494 dasd_schedule_block_bh(device->block); in dasd_generic_path_operational()
3662 if (cqr->block) in dasd_generic_pm_freeze()
3664 cqr->block->base->discipline->free_cp( in dasd_generic_pm_freeze()
3710 if (device->block) in dasd_generic_restore_device()
3711 dasd_schedule_block_bh(device->block); in dasd_generic_restore_device()
3820 if (device->block) in dasd_generic_shutdown()
3821 dasd_schedule_block_bh(device->block); in dasd_generic_shutdown()