Lines Matching refs:block
165 struct dasd_block *block; in dasd_alloc_block() local
167 block = kzalloc(sizeof(*block), GFP_ATOMIC); in dasd_alloc_block()
168 if (!block) in dasd_alloc_block()
171 atomic_set(&block->open_count, -1); in dasd_alloc_block()
173 atomic_set(&block->tasklet_scheduled, 0); in dasd_alloc_block()
174 tasklet_init(&block->tasklet, dasd_block_tasklet, in dasd_alloc_block()
175 (unsigned long) block); in dasd_alloc_block()
176 INIT_LIST_HEAD(&block->ccw_queue); in dasd_alloc_block()
177 spin_lock_init(&block->queue_lock); in dasd_alloc_block()
178 INIT_LIST_HEAD(&block->format_list); in dasd_alloc_block()
179 spin_lock_init(&block->format_lock); in dasd_alloc_block()
180 timer_setup(&block->timer, dasd_block_timeout, 0); in dasd_alloc_block()
181 spin_lock_init(&block->profile.lock); in dasd_alloc_block()
183 return block; in dasd_alloc_block()
190 void dasd_free_block(struct dasd_block *block) in dasd_free_block() argument
192 kfree(block); in dasd_free_block()
209 if (device->block) { in dasd_state_new_to_known()
210 rc = dasd_alloc_queue(device->block); in dasd_state_new_to_known()
229 if (device->block) in dasd_state_known_to_new()
230 dasd_free_queue(device->block); in dasd_state_known_to_new()
255 struct dasd_block *block = device->block; in dasd_state_known_to_basic() local
259 if (block) { in dasd_state_known_to_basic()
260 rc = dasd_gendisk_alloc(block); in dasd_state_known_to_basic()
263 block->debugfs_dentry = in dasd_state_known_to_basic()
264 dasd_debugfs_setup(block->gdp->disk_name, in dasd_state_known_to_basic()
266 dasd_profile_init(&block->profile, block->debugfs_dentry); in dasd_state_known_to_basic()
268 dasd_profile_on(&device->block->profile); in dasd_state_known_to_basic()
301 if (device->block) { in dasd_state_basic_to_known()
302 dasd_profile_exit(&device->block->profile); in dasd_state_basic_to_known()
303 debugfs_remove(device->block->debugfs_dentry); in dasd_state_basic_to_known()
304 dasd_gendisk_free(device->block); in dasd_state_basic_to_known()
305 dasd_block_clear_timer(device->block); in dasd_state_basic_to_known()
340 struct dasd_block *block; in dasd_state_basic_to_ready() local
344 block = device->block; in dasd_state_basic_to_ready()
346 if (block) { in dasd_state_basic_to_ready()
347 if (block->base->discipline->do_analysis != NULL) in dasd_state_basic_to_ready()
348 rc = block->base->discipline->do_analysis(block); in dasd_state_basic_to_ready()
352 disk = device->block->gdp; in dasd_state_basic_to_ready()
360 device->discipline->setup_blk_queue(block); in dasd_state_basic_to_ready()
361 set_capacity(block->gdp, in dasd_state_basic_to_ready()
362 block->blocks << block->s2b_shift); in dasd_state_basic_to_ready()
364 rc = dasd_scan_partitions(block); in dasd_state_basic_to_ready()
381 if (device->block) in _wait_for_empty_queues()
383 list_empty(&device->block->ccw_queue); in _wait_for_empty_queues()
398 if (device->block) { in dasd_state_ready_to_basic()
399 struct dasd_block *block = device->block; in dasd_state_ready_to_basic() local
400 rc = dasd_flush_block_queue(block); in dasd_state_ready_to_basic()
405 dasd_destroy_partitions(block); in dasd_state_ready_to_basic()
406 block->blocks = 0; in dasd_state_ready_to_basic()
407 block->bp_block = 0; in dasd_state_ready_to_basic()
408 block->s2b_shift = 0; in dasd_state_ready_to_basic()
431 if (device->block) { in dasd_state_ready_to_online()
432 dasd_schedule_block_bh(device->block); in dasd_state_ready_to_online()
434 kobject_uevent(&disk_to_dev(device->block->gdp)->kobj, in dasd_state_ready_to_online()
438 disk_uevent(device->block->bdev->bd_disk, KOBJ_CHANGE); in dasd_state_ready_to_online()
457 if (device->block && !(device->features & DASD_FEATURE_USERAW)) in dasd_state_online_to_ready()
458 disk_uevent(device->block->bdev->bd_disk, KOBJ_CHANGE); in dasd_state_online_to_ready()
663 static void dasd_profile_start(struct dasd_block *block, in dasd_profile_start() argument
673 if (dasd_global_profile_level || block->profile.data) in dasd_profile_start()
674 list_for_each(l, &block->ccw_queue) in dasd_profile_start()
686 spin_lock(&block->profile.lock); in dasd_profile_start()
687 if (block->profile.data) { in dasd_profile_start()
688 block->profile.data->dasd_io_nr_req[counter]++; in dasd_profile_start()
690 block->profile.data->dasd_read_nr_req[counter]++; in dasd_profile_start()
692 spin_unlock(&block->profile.lock); in dasd_profile_start()
775 static void dasd_profile_end(struct dasd_block *block, in dasd_profile_end() argument
788 block->profile.data || in dasd_profile_end()
820 cqr->startdev != block->base, in dasd_profile_end()
830 spin_lock(&block->profile.lock); in dasd_profile_end()
831 if (block->profile.data) { in dasd_profile_end()
832 data = block->profile.data; in dasd_profile_end()
837 dasd_profile_end_add_data(block->profile.data, in dasd_profile_end()
838 cqr->startdev != block->base, in dasd_profile_end()
846 spin_unlock(&block->profile.lock); in dasd_profile_end()
856 cqr->startdev != block->base, in dasd_profile_end()
1117 #define dasd_profile_start(block, cqr, req) do {} while (0) argument
1118 #define dasd_profile_end(block, cqr, req) do {} while (0) argument
1401 if (((cqr->block && in dasd_start_IO()
1402 test_bit(DASD_FLAG_LOCK_STOLEN, &cqr->block->base->flags)) || in dasd_start_IO()
1431 if (cqr->block) in dasd_start_IO()
1432 cqr->trkcount = atomic_read(&cqr->block->trkcount); in dasd_start_IO()
1594 if (device->block) { in dasd_generic_handle_state_change()
1595 dasd_schedule_block_bh(device->block); in dasd_generic_handle_state_change()
1596 if (device->block->request_queue) in dasd_generic_handle_state_change()
1597 blk_mq_run_hw_queues(device->block->request_queue, in dasd_generic_handle_state_change()
1610 static int dasd_ese_needs_format(struct dasd_block *block, struct irb *irb) in dasd_ese_needs_format() argument
1615 if (!block) in dasd_ese_needs_format()
1617 device = block->base; in dasd_ese_needs_format()
1751 if (dasd_ese_needs_format(cqr->block, irb)) { in dasd_int_handler()
1891 if (!ref_cqr->block) in __dasd_device_recovery()
1897 ref_cqr->block == cqr->block) { in __dasd_device_recovery()
1966 struct dasd_block *block; in __dasd_device_process_final_queue() local
1971 block = cqr->block; in __dasd_device_process_final_queue()
1972 if (!block) { in __dasd_device_process_final_queue()
1975 spin_lock_bh(&block->queue_lock); in __dasd_device_process_final_queue()
1977 spin_unlock_bh(&block->queue_lock); in __dasd_device_process_final_queue()
2617 if (device->block) in dasd_sleep_on_immediatly()
2618 dasd_schedule_block_bh(device->block); in dasd_sleep_on_immediatly()
2685 struct dasd_block *block; in dasd_block_timeout() local
2687 block = from_timer(block, t, timer); in dasd_block_timeout()
2688 spin_lock_irqsave(get_ccwdev_lock(block->base->cdev), flags); in dasd_block_timeout()
2690 dasd_device_remove_stop_bits(block->base, DASD_STOPPED_PENDING); in dasd_block_timeout()
2691 spin_unlock_irqrestore(get_ccwdev_lock(block->base->cdev), flags); in dasd_block_timeout()
2692 dasd_schedule_block_bh(block); in dasd_block_timeout()
2693 blk_mq_run_hw_queues(block->request_queue, true); in dasd_block_timeout()
2699 void dasd_block_set_timer(struct dasd_block *block, int expires) in dasd_block_set_timer() argument
2702 del_timer(&block->timer); in dasd_block_set_timer()
2704 mod_timer(&block->timer, jiffies + expires); in dasd_block_set_timer()
2711 void dasd_block_clear_timer(struct dasd_block *block) in dasd_block_clear_timer() argument
2713 del_timer(&block->timer); in dasd_block_clear_timer()
2741 dasd_profile_end(cqr->block, cqr, req); in __dasd_cleanup_cqr()
2744 status = cqr->block->base->discipline->free_cp(cqr, req); in __dasd_cleanup_cqr()
2791 static void __dasd_process_block_ccw_queue(struct dasd_block *block, in __dasd_process_block_ccw_queue() argument
2798 struct dasd_device *base = block->base; in __dasd_process_block_ccw_queue()
2802 list_for_each_safe(l, n, &block->ccw_queue) { in __dasd_process_block_ccw_queue()
2857 dasd_schedule_block_bh(cqr->block); in dasd_return_cqr_cb()
2860 static void __dasd_block_start_head(struct dasd_block *block) in __dasd_block_start_head() argument
2864 if (list_empty(&block->ccw_queue)) in __dasd_block_start_head()
2870 list_for_each_entry(cqr, &block->ccw_queue, blocklist) { in __dasd_block_start_head()
2873 if (test_bit(DASD_FLAG_LOCK_STOLEN, &block->base->flags) && in __dasd_block_start_head()
2877 dasd_schedule_block_bh(block); in __dasd_block_start_head()
2881 if (block->base->stopped & ~DASD_STOPPED_PENDING && in __dasd_block_start_head()
2883 (!dasd_eer_enabled(block->base))) { in __dasd_block_start_head()
2886 dasd_schedule_block_bh(block); in __dasd_block_start_head()
2890 if (block->base->stopped) in __dasd_block_start_head()
2895 cqr->startdev = block->base; in __dasd_block_start_head()
2911 struct dasd_block *block = (struct dasd_block *) data; in dasd_block_tasklet() local
2917 atomic_set(&block->tasklet_scheduled, 0); in dasd_block_tasklet()
2919 spin_lock_irq(&block->queue_lock); in dasd_block_tasklet()
2921 __dasd_process_block_ccw_queue(block, &final_queue); in dasd_block_tasklet()
2922 spin_unlock_irq(&block->queue_lock); in dasd_block_tasklet()
2934 spin_lock_irq(&block->queue_lock); in dasd_block_tasklet()
2936 __dasd_block_start_head(block); in dasd_block_tasklet()
2937 spin_unlock_irq(&block->queue_lock); in dasd_block_tasklet()
2941 dasd_put_device(block->base); in dasd_block_tasklet()
2971 static int _dasd_requests_to_flushqueue(struct dasd_block *block, in _dasd_requests_to_flushqueue() argument
2978 spin_lock_irqsave(&block->queue_lock, flags); in _dasd_requests_to_flushqueue()
2981 list_for_each_entry_safe(cqr, n, &block->ccw_queue, blocklist) { in _dasd_requests_to_flushqueue()
2999 spin_unlock_irqrestore(&block->queue_lock, flags); in _dasd_requests_to_flushqueue()
3009 static int dasd_flush_block_queue(struct dasd_block *block) in dasd_flush_block_queue() argument
3017 rc = _dasd_requests_to_flushqueue(block, &flush_queue); in dasd_flush_block_queue()
3025 spin_lock_bh(&block->queue_lock); in dasd_flush_block_queue()
3026 __dasd_process_erp(block->base, cqr); in dasd_flush_block_queue()
3027 spin_unlock_bh(&block->queue_lock); in dasd_flush_block_queue()
3045 void dasd_schedule_block_bh(struct dasd_block *block) in dasd_schedule_block_bh() argument
3048 if (atomic_cmpxchg(&block->tasklet_scheduled, 0, 1) != 0) in dasd_schedule_block_bh()
3051 dasd_get_device(block->base); in dasd_schedule_block_bh()
3052 tasklet_hi_schedule(&block->tasklet); in dasd_schedule_block_bh()
3068 struct dasd_block *block = hctx->queue->queuedata; in do_dasd_request() local
3075 basedev = block->base; in do_dasd_request()
3114 cqr = basedev->discipline->build_cp(basedev, block, req); in do_dasd_request()
3137 spin_lock(&block->queue_lock); in do_dasd_request()
3138 list_add_tail(&cqr->blocklist, &block->ccw_queue); in do_dasd_request()
3140 dasd_profile_start(block, cqr, req); in do_dasd_request()
3141 dasd_schedule_block_bh(block); in do_dasd_request()
3142 spin_unlock(&block->queue_lock); in do_dasd_request()
3159 struct dasd_block *block = req->q->queuedata; in dasd_times_out() local
3170 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
3179 spin_lock(&block->queue_lock); in dasd_times_out()
3192 &block->ccw_queue, blocklist) { in dasd_times_out()
3218 dasd_schedule_block_bh(block); in dasd_times_out()
3219 spin_unlock(&block->queue_lock); in dasd_times_out()
3262 static int dasd_alloc_queue(struct dasd_block *block) in dasd_alloc_queue() argument
3266 block->tag_set.ops = &dasd_mq_ops; in dasd_alloc_queue()
3267 block->tag_set.cmd_size = sizeof(struct dasd_ccw_req); in dasd_alloc_queue()
3268 block->tag_set.nr_hw_queues = nr_hw_queues; in dasd_alloc_queue()
3269 block->tag_set.queue_depth = queue_depth; in dasd_alloc_queue()
3270 block->tag_set.flags = BLK_MQ_F_SHOULD_MERGE; in dasd_alloc_queue()
3271 block->tag_set.numa_node = NUMA_NO_NODE; in dasd_alloc_queue()
3273 rc = blk_mq_alloc_tag_set(&block->tag_set); in dasd_alloc_queue()
3277 block->request_queue = blk_mq_init_queue(&block->tag_set); in dasd_alloc_queue()
3278 if (IS_ERR(block->request_queue)) in dasd_alloc_queue()
3279 return PTR_ERR(block->request_queue); in dasd_alloc_queue()
3281 block->request_queue->queuedata = block; in dasd_alloc_queue()
3289 static void dasd_free_queue(struct dasd_block *block) in dasd_free_queue() argument
3291 if (block->request_queue) { in dasd_free_queue()
3292 blk_cleanup_queue(block->request_queue); in dasd_free_queue()
3293 blk_mq_free_tag_set(&block->tag_set); in dasd_free_queue()
3294 block->request_queue = NULL; in dasd_free_queue()
3307 atomic_inc(&base->block->open_count); in dasd_open()
3346 atomic_dec(&base->block->open_count); in dasd_open()
3355 atomic_dec(&base->block->open_count); in dasd_release()
3377 base->discipline->fill_geometry(base->block, geo); in dasd_getgeo()
3378 geo->start = get_start_sect(bdev) >> base->block->s2b_shift; in dasd_getgeo()
3502 struct dasd_block *block; in dasd_generic_remove() local
3522 block = device->block; in dasd_generic_remove()
3528 if (block) in dasd_generic_remove()
3529 dasd_free_block(block); in dasd_generic_remove()
3605 if (device->block) in dasd_generic_set_online()
3606 dasd_free_block(device->block); in dasd_generic_set_online()
3622 struct dasd_block *block; in dasd_generic_set_offline() local
3640 if (device->block) { in dasd_generic_set_offline()
3641 max_count = device->block->bdev ? 0 : -1; in dasd_generic_set_offline()
3642 open_count = atomic_read(&device->block->open_count); in dasd_generic_set_offline()
3687 if (device->block) { in dasd_generic_set_offline()
3688 rc = fsync_bdev(device->block->bdev); in dasd_generic_set_offline()
3716 block = device->block; in dasd_generic_set_offline()
3722 if (block) in dasd_generic_set_offline()
3723 dasd_free_block(block); in dasd_generic_set_offline()
3772 if (device->block) { in dasd_generic_path_operational()
3773 dasd_schedule_block_bh(device->block); in dasd_generic_path_operational()
3774 if (device->block->request_queue) in dasd_generic_path_operational()
3775 blk_mq_run_hw_queues(device->block->request_queue, in dasd_generic_path_operational()
3926 if (device->block) { in dasd_generic_space_avail()
3927 dasd_schedule_block_bh(device->block); in dasd_generic_space_avail()
3928 if (device->block->request_queue) in dasd_generic_space_avail()
3929 blk_mq_run_hw_queues(device->block->request_queue, true); in dasd_generic_space_avail()
3941 struct dasd_block *block = device->block; in dasd_generic_requeue_all_requests() local
3946 if (!block) in dasd_generic_requeue_all_requests()
3950 rc = _dasd_requests_to_flushqueue(block, &requeue_queue); in dasd_generic_requeue_all_requests()
3958 spin_lock_bh(&block->queue_lock); in dasd_generic_requeue_all_requests()
3959 __dasd_process_erp(block->base, cqr); in dasd_generic_requeue_all_requests()
3960 spin_unlock_bh(&block->queue_lock); in dasd_generic_requeue_all_requests()
3968 cqr->block->base->discipline->free_cp( in dasd_generic_requeue_all_requests()
3981 if (device->block) in do_requeue_requests()
3982 dasd_schedule_block_bh(device->block); in do_requeue_requests()
4088 if (device->block) in dasd_generic_shutdown()
4089 dasd_schedule_block_bh(device->block); in dasd_generic_shutdown()