Lines Matching refs:block
149 struct dasd_block *block; in dasd_alloc_block() local
151 block = kzalloc(sizeof(*block), GFP_ATOMIC); in dasd_alloc_block()
152 if (!block) in dasd_alloc_block()
155 atomic_set(&block->open_count, -1); in dasd_alloc_block()
157 spin_lock_init(&block->request_queue_lock); in dasd_alloc_block()
158 atomic_set(&block->tasklet_scheduled, 0); in dasd_alloc_block()
159 tasklet_init(&block->tasklet, in dasd_alloc_block()
161 (unsigned long) block); in dasd_alloc_block()
162 INIT_LIST_HEAD(&block->ccw_queue); in dasd_alloc_block()
163 spin_lock_init(&block->queue_lock); in dasd_alloc_block()
164 init_timer(&block->timer); in dasd_alloc_block()
165 block->timer.function = dasd_block_timeout; in dasd_alloc_block()
166 block->timer.data = (unsigned long) block; in dasd_alloc_block()
167 spin_lock_init(&block->profile.lock); in dasd_alloc_block()
169 return block; in dasd_alloc_block()
176 void dasd_free_block(struct dasd_block *block) in dasd_free_block() argument
178 kfree(block); in dasd_free_block()
195 if (device->block) { in dasd_state_new_to_known()
196 rc = dasd_alloc_queue(device->block); in dasd_state_new_to_known()
225 if (device->block) in dasd_state_known_to_new()
226 dasd_free_queue(device->block); in dasd_state_known_to_new()
251 struct dasd_block *block = device->block; in dasd_state_known_to_basic() local
255 if (block) { in dasd_state_known_to_basic()
256 rc = dasd_gendisk_alloc(block); in dasd_state_known_to_basic()
259 block->debugfs_dentry = in dasd_state_known_to_basic()
260 dasd_debugfs_setup(block->gdp->disk_name, in dasd_state_known_to_basic()
262 dasd_profile_init(&block->profile, block->debugfs_dentry); in dasd_state_known_to_basic()
264 dasd_profile_on(&device->block->profile); in dasd_state_known_to_basic()
296 if (device->block) { in dasd_state_basic_to_known()
297 dasd_profile_exit(&device->block->profile); in dasd_state_basic_to_known()
298 debugfs_remove(device->block->debugfs_dentry); in dasd_state_basic_to_known()
299 dasd_gendisk_free(device->block); in dasd_state_basic_to_known()
300 dasd_block_clear_timer(device->block); in dasd_state_basic_to_known()
334 struct dasd_block *block; in dasd_state_basic_to_ready() local
337 block = device->block; in dasd_state_basic_to_ready()
339 if (block) { in dasd_state_basic_to_ready()
340 if (block->base->discipline->do_analysis != NULL) in dasd_state_basic_to_ready()
341 rc = block->base->discipline->do_analysis(block); in dasd_state_basic_to_ready()
349 dasd_setup_queue(block); in dasd_state_basic_to_ready()
350 set_capacity(block->gdp, in dasd_state_basic_to_ready()
351 block->blocks << block->s2b_shift); in dasd_state_basic_to_ready()
353 rc = dasd_scan_partitions(block); in dasd_state_basic_to_ready()
370 if (device->block) in _wait_for_empty_queues()
372 list_empty(&device->block->ccw_queue); in _wait_for_empty_queues()
387 if (device->block) { in dasd_state_ready_to_basic()
388 struct dasd_block *block = device->block; in dasd_state_ready_to_basic() local
389 rc = dasd_flush_block_queue(block); in dasd_state_ready_to_basic()
394 dasd_flush_request_queue(block); in dasd_state_ready_to_basic()
395 dasd_destroy_partitions(block); in dasd_state_ready_to_basic()
396 block->blocks = 0; in dasd_state_ready_to_basic()
397 block->bp_block = 0; in dasd_state_ready_to_basic()
398 block->s2b_shift = 0; in dasd_state_ready_to_basic()
425 if (device->block) { in dasd_state_ready_to_online()
426 dasd_schedule_block_bh(device->block); in dasd_state_ready_to_online()
428 disk = device->block->gdp; in dasd_state_ready_to_online()
432 disk = device->block->bdev->bd_disk; in dasd_state_ready_to_online()
458 if (device->block && !(device->features & DASD_FEATURE_USERAW)) { in dasd_state_online_to_ready()
459 disk = device->block->bdev->bd_disk; in dasd_state_online_to_ready()
690 static void dasd_profile_start(struct dasd_block *block, in dasd_profile_start() argument
700 if (dasd_global_profile_level || block->profile.data) in dasd_profile_start()
701 list_for_each(l, &block->ccw_queue) in dasd_profile_start()
713 spin_lock(&block->profile.lock); in dasd_profile_start()
714 if (block->profile.data) { in dasd_profile_start()
715 block->profile.data->dasd_io_nr_req[counter]++; in dasd_profile_start()
717 block->profile.data->dasd_read_nr_req[counter]++; in dasd_profile_start()
719 spin_unlock(&block->profile.lock); in dasd_profile_start()
800 static void dasd_profile_end(struct dasd_block *block, in dasd_profile_end() argument
812 block->profile.data || in dasd_profile_end()
839 cqr->startdev != block->base, in dasd_profile_end()
849 spin_lock(&block->profile.lock); in dasd_profile_end()
850 if (block->profile.data) in dasd_profile_end()
851 dasd_profile_end_add_data(block->profile.data, in dasd_profile_end()
852 cqr->startdev != block->base, in dasd_profile_end()
859 spin_unlock(&block->profile.lock); in dasd_profile_end()
864 cqr->startdev != block->base, in dasd_profile_end()
1116 #define dasd_profile_start(block, cqr, req) do {} while (0) argument
1117 #define dasd_profile_end(block, cqr, req) do {} while (0) argument
1379 if (((cqr->block && in dasd_start_IO()
1380 test_bit(DASD_FLAG_LOCK_STOLEN, &cqr->block->base->flags)) || in dasd_start_IO()
1571 if (device->block) in dasd_generic_handle_state_change()
1572 dasd_schedule_block_bh(device->block); in dasd_generic_handle_state_change()
1742 if (!ref_cqr->block) in __dasd_device_recovery()
1748 ref_cqr->block == cqr->block) { in __dasd_device_recovery()
1790 struct dasd_block *block; in __dasd_device_process_final_queue() local
1798 block = cqr->block; in __dasd_device_process_final_queue()
1801 if (block) in __dasd_device_process_final_queue()
1802 spin_lock_bh(&block->queue_lock); in __dasd_device_process_final_queue()
1823 if (block) in __dasd_device_process_final_queue()
1824 spin_unlock_bh(&block->queue_lock); in __dasd_device_process_final_queue()
2420 if (device->block) in dasd_sleep_on_immediatly()
2421 dasd_schedule_block_bh(device->block); in dasd_sleep_on_immediatly()
2483 struct dasd_block *block; in dasd_block_timeout() local
2485 block = (struct dasd_block *) ptr; in dasd_block_timeout()
2486 spin_lock_irqsave(get_ccwdev_lock(block->base->cdev), flags); in dasd_block_timeout()
2488 dasd_device_remove_stop_bits(block->base, DASD_STOPPED_PENDING); in dasd_block_timeout()
2489 spin_unlock_irqrestore(get_ccwdev_lock(block->base->cdev), flags); in dasd_block_timeout()
2490 dasd_schedule_block_bh(block); in dasd_block_timeout()
2496 void dasd_block_set_timer(struct dasd_block *block, int expires) in dasd_block_set_timer() argument
2499 del_timer(&block->timer); in dasd_block_set_timer()
2501 mod_timer(&block->timer, jiffies + expires); in dasd_block_set_timer()
2508 void dasd_block_clear_timer(struct dasd_block *block) in dasd_block_clear_timer() argument
2510 del_timer(&block->timer); in dasd_block_clear_timer()
2533 static void __dasd_process_request_queue(struct dasd_block *block) in __dasd_process_request_queue() argument
2540 queue = block->request_queue; in __dasd_process_request_queue()
2541 basedev = block->base; in __dasd_process_request_queue()
2554 while ((req = blk_fetch_request(block->request_queue))) in __dasd_process_request_queue()
2584 cqr = basedev->discipline->build_cp(basedev, block, req); in __dasd_process_request_queue()
2597 if (!list_empty(&block->ccw_queue)) in __dasd_process_request_queue()
2605 dasd_block_set_timer(block, HZ/2); in __dasd_process_request_queue()
2624 list_add_tail(&cqr->blocklist, &block->ccw_queue); in __dasd_process_request_queue()
2626 dasd_profile_start(block, cqr, req); in __dasd_process_request_queue()
2637 dasd_profile_end(cqr->block, cqr, req); in __dasd_cleanup_cqr()
2638 status = cqr->block->base->discipline->free_cp(cqr, req); in __dasd_cleanup_cqr()
2656 static void __dasd_process_block_ccw_queue(struct dasd_block *block, in __dasd_process_block_ccw_queue() argument
2663 struct dasd_device *base = block->base; in __dasd_process_block_ccw_queue()
2667 list_for_each_safe(l, n, &block->ccw_queue) { in __dasd_process_block_ccw_queue()
2722 dasd_schedule_block_bh(cqr->block); in dasd_return_cqr_cb()
2725 static void __dasd_block_start_head(struct dasd_block *block) in __dasd_block_start_head() argument
2729 if (list_empty(&block->ccw_queue)) in __dasd_block_start_head()
2735 list_for_each_entry(cqr, &block->ccw_queue, blocklist) { in __dasd_block_start_head()
2738 if (test_bit(DASD_FLAG_LOCK_STOLEN, &block->base->flags) && in __dasd_block_start_head()
2742 dasd_schedule_block_bh(block); in __dasd_block_start_head()
2746 if (block->base->stopped & ~DASD_STOPPED_PENDING && in __dasd_block_start_head()
2748 (!dasd_eer_enabled(block->base))) { in __dasd_block_start_head()
2751 dasd_schedule_block_bh(block); in __dasd_block_start_head()
2755 if (block->base->stopped) in __dasd_block_start_head()
2760 cqr->startdev = block->base; in __dasd_block_start_head()
2774 static void dasd_block_tasklet(struct dasd_block *block) in dasd_block_tasklet() argument
2780 atomic_set(&block->tasklet_scheduled, 0); in dasd_block_tasklet()
2782 spin_lock(&block->queue_lock); in dasd_block_tasklet()
2784 __dasd_process_block_ccw_queue(block, &final_queue); in dasd_block_tasklet()
2785 spin_unlock(&block->queue_lock); in dasd_block_tasklet()
2787 spin_lock_irq(&block->request_queue_lock); in dasd_block_tasklet()
2793 spin_lock(&block->queue_lock); in dasd_block_tasklet()
2795 __dasd_process_request_queue(block); in dasd_block_tasklet()
2797 __dasd_block_start_head(block); in dasd_block_tasklet()
2798 spin_unlock(&block->queue_lock); in dasd_block_tasklet()
2799 spin_unlock_irq(&block->request_queue_lock); in dasd_block_tasklet()
2802 dasd_put_device(block->base); in dasd_block_tasklet()
2816 struct dasd_block *block = cqr->block; in _dasd_requeue_request() local
2820 if (!block) in _dasd_requeue_request()
2822 spin_lock_irqsave(&block->queue_lock, flags); in _dasd_requeue_request()
2824 blk_requeue_request(block->request_queue, req); in _dasd_requeue_request()
2825 spin_unlock_irqrestore(&block->queue_lock, flags); in _dasd_requeue_request()
2835 static int dasd_flush_block_queue(struct dasd_block *block) in dasd_flush_block_queue() argument
2842 spin_lock_bh(&block->queue_lock); in dasd_flush_block_queue()
2845 list_for_each_entry_safe(cqr, n, &block->ccw_queue, blocklist) { in dasd_flush_block_queue()
2863 spin_unlock_bh(&block->queue_lock); in dasd_flush_block_queue()
2870 spin_lock_bh(&block->queue_lock); in dasd_flush_block_queue()
2871 __dasd_process_erp(block->base, cqr); in dasd_flush_block_queue()
2872 spin_unlock_bh(&block->queue_lock); in dasd_flush_block_queue()
2878 spin_lock_irq(&block->request_queue_lock); in dasd_flush_block_queue()
2882 spin_unlock_irq(&block->request_queue_lock); in dasd_flush_block_queue()
2890 void dasd_schedule_block_bh(struct dasd_block *block) in dasd_schedule_block_bh() argument
2893 if (atomic_cmpxchg(&block->tasklet_scheduled, 0, 1) != 0) in dasd_schedule_block_bh()
2896 dasd_get_device(block->base); in dasd_schedule_block_bh()
2897 tasklet_hi_schedule(&block->tasklet); in dasd_schedule_block_bh()
2912 struct dasd_block *block; in do_dasd_request() local
2914 block = queue->queuedata; in do_dasd_request()
2915 spin_lock(&block->queue_lock); in do_dasd_request()
2917 __dasd_process_request_queue(block); in do_dasd_request()
2919 __dasd_block_start_head(block); in do_dasd_request()
2920 spin_unlock(&block->queue_lock); in do_dasd_request()
2936 struct dasd_block *block = req->q->queuedata; in dasd_times_out() local
2943 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
2950 spin_lock(&block->queue_lock); in dasd_times_out()
2965 &block->ccw_queue, blocklist) { in dasd_times_out()
2993 dasd_schedule_block_bh(block); in dasd_times_out()
2994 spin_unlock(&block->queue_lock); in dasd_times_out()
3002 static int dasd_alloc_queue(struct dasd_block *block) in dasd_alloc_queue() argument
3004 block->request_queue = blk_init_queue(do_dasd_request, in dasd_alloc_queue()
3005 &block->request_queue_lock); in dasd_alloc_queue()
3006 if (block->request_queue == NULL) in dasd_alloc_queue()
3009 block->request_queue->queuedata = block; in dasd_alloc_queue()
3017 static void dasd_setup_queue(struct dasd_block *block) in dasd_setup_queue() argument
3021 if (block->base->features & DASD_FEATURE_USERAW) { in dasd_setup_queue()
3031 max = block->base->discipline->max_blocks << block->s2b_shift; in dasd_setup_queue()
3033 queue_flag_set_unlocked(QUEUE_FLAG_NONROT, block->request_queue); in dasd_setup_queue()
3034 block->request_queue->limits.max_dev_sectors = max; in dasd_setup_queue()
3035 blk_queue_logical_block_size(block->request_queue, in dasd_setup_queue()
3036 block->bp_block); in dasd_setup_queue()
3037 blk_queue_max_hw_sectors(block->request_queue, max); in dasd_setup_queue()
3038 blk_queue_max_segments(block->request_queue, -1L); in dasd_setup_queue()
3042 blk_queue_max_segment_size(block->request_queue, PAGE_SIZE); in dasd_setup_queue()
3043 blk_queue_segment_boundary(block->request_queue, PAGE_SIZE - 1); in dasd_setup_queue()
3049 static void dasd_free_queue(struct dasd_block *block) in dasd_free_queue() argument
3051 if (block->request_queue) { in dasd_free_queue()
3052 blk_cleanup_queue(block->request_queue); in dasd_free_queue()
3053 block->request_queue = NULL; in dasd_free_queue()
3060 static void dasd_flush_request_queue(struct dasd_block *block) in dasd_flush_request_queue() argument
3064 if (!block->request_queue) in dasd_flush_request_queue()
3067 spin_lock_irq(&block->request_queue_lock); in dasd_flush_request_queue()
3068 while ((req = blk_fetch_request(block->request_queue))) in dasd_flush_request_queue()
3070 spin_unlock_irq(&block->request_queue_lock); in dasd_flush_request_queue()
3082 atomic_inc(&base->block->open_count); in dasd_open()
3121 atomic_dec(&base->block->open_count); in dasd_open()
3130 atomic_dec(&base->block->open_count); in dasd_release()
3152 base->discipline->fill_geometry(base->block, geo); in dasd_getgeo()
3153 geo->start = get_start_sect(bdev) >> base->block->s2b_shift; in dasd_getgeo()
3272 struct dasd_block *block; in dasd_generic_remove() local
3295 block = device->block; in dasd_generic_remove()
3301 if (block) in dasd_generic_remove()
3302 dasd_free_block(block); in dasd_generic_remove()
3380 if (device->block) in dasd_generic_set_online()
3381 dasd_free_block(device->block); in dasd_generic_set_online()
3397 struct dasd_block *block; in dasd_generic_set_offline() local
3411 if (device->block) { in dasd_generic_set_offline()
3412 max_count = device->block->bdev ? 0 : -1; in dasd_generic_set_offline()
3413 open_count = atomic_read(&device->block->open_count); in dasd_generic_set_offline()
3461 rc = fsync_bdev(device->block->bdev); in dasd_generic_set_offline()
3476 block = device->block; in dasd_generic_set_offline()
3482 if (block) in dasd_generic_set_offline()
3483 dasd_free_block(block); in dasd_generic_set_offline()
3534 if (device->block) in dasd_generic_path_operational()
3535 dasd_schedule_block_bh(device->block); in dasd_generic_path_operational()
3703 if (cqr->block) in dasd_generic_pm_freeze()
3705 cqr->block->base->discipline->free_cp( in dasd_generic_pm_freeze()
3751 if (device->block) in dasd_generic_restore_device()
3752 dasd_schedule_block_bh(device->block); in dasd_generic_restore_device()
3861 if (device->block) in dasd_generic_shutdown()
3862 dasd_schedule_block_bh(device->block); in dasd_generic_shutdown()