dasd.c (b32e3dc7860d00124fa432dba09667e647cb9bcc) | dasd.c (65f8da475995f667af5298c644707dbd9d646ca6) |
---|---|
1/* 2 * File...........: linux/drivers/s390/block/dasd.c 3 * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> 4 * Horst Hummel <Horst.Hummel@de.ibm.com> 5 * Carsten Otte <Cotte@de.ibm.com> 6 * Martin Schwidefsky <schwidefsky@de.ibm.com> 7 * Bugreports.to..: <Linux390@de.ibm.com> 8 * Copyright IBM Corp. 1999, 2009 --- 2300 unchanged lines hidden (view full) --- 2309 spin_lock_irq(&block->request_queue_lock); 2310 while ((req = blk_fetch_request(block->request_queue))) 2311 __blk_end_request_all(req, -EIO); 2312 spin_unlock_irq(&block->request_queue_lock); 2313} 2314 2315static int dasd_open(struct block_device *bdev, fmode_t mode) 2316{ | 1/* 2 * File...........: linux/drivers/s390/block/dasd.c 3 * Author(s)......: Holger Smolinski <Holger.Smolinski@de.ibm.com> 4 * Horst Hummel <Horst.Hummel@de.ibm.com> 5 * Carsten Otte <Cotte@de.ibm.com> 6 * Martin Schwidefsky <schwidefsky@de.ibm.com> 7 * Bugreports.to..: <Linux390@de.ibm.com> 8 * Copyright IBM Corp. 1999, 2009 --- 2300 unchanged lines hidden (view full) --- 2309 spin_lock_irq(&block->request_queue_lock); 2310 while ((req = blk_fetch_request(block->request_queue))) 2311 __blk_end_request_all(req, -EIO); 2312 spin_unlock_irq(&block->request_queue_lock); 2313} 2314 2315static int dasd_open(struct block_device *bdev, fmode_t mode) 2316{ |
2317 struct dasd_block *block = bdev->bd_disk->private_data; | |
2318 struct dasd_device *base; 2319 int rc; 2320 | 2317 struct dasd_device *base; 2318 int rc; 2319 |
2321 if (!block) | 2320 base = dasd_device_from_gendisk(bdev->bd_disk); 2321 if (!base) |
2322 return -ENODEV; 2323 | 2322 return -ENODEV; 2323 |
2324 base = block->base; 2325 atomic_inc(&block->open_count); | 2324 atomic_inc(&base->block->open_count); |
2326 if (test_bit(DASD_FLAG_OFFLINE, &base->flags)) { 2327 rc = -ENODEV; 2328 goto unlock; 2329 } 2330 2331 if (!try_module_get(base->discipline->owner)) { 2332 rc = -EINVAL; 2333 goto unlock; --- 16 unchanged lines hidden (view full) --- 2350 2351 if ((mode & FMODE_WRITE) && 2352 (test_bit(DASD_FLAG_DEVICE_RO, &base->flags) || 2353 (base->features & DASD_FEATURE_READONLY))) { 2354 rc = -EROFS; 2355 goto out; 2356 } 2357 | 2325 if (test_bit(DASD_FLAG_OFFLINE, &base->flags)) { 2326 rc = -ENODEV; 2327 goto unlock; 2328 } 2329 2330 if (!try_module_get(base->discipline->owner)) { 2331 rc = -EINVAL; 2332 goto unlock; --- 16 unchanged lines hidden (view full) --- 2349 2350 if ((mode & FMODE_WRITE) && 2351 (test_bit(DASD_FLAG_DEVICE_RO, &base->flags) || 2352 (base->features & DASD_FEATURE_READONLY))) { 2353 rc = -EROFS; 2354 goto out; 2355 } 2356 |
2357 dasd_put_device(base); |
|
2358 return 0; 2359 2360out: 2361 module_put(base->discipline->owner); 2362unlock: | 2358 return 0; 2359 2360out: 2361 module_put(base->discipline->owner); 2362unlock: |
2363 atomic_dec(&block->open_count); | 2363 atomic_dec(&base->block->open_count); 2364 dasd_put_device(base); |
2364 return rc; 2365} 2366 2367static int dasd_release(struct gendisk *disk, fmode_t mode) 2368{ | 2365 return rc; 2366} 2367 2368static int dasd_release(struct gendisk *disk, fmode_t mode) 2369{ |
2369 struct dasd_block *block = disk->private_data; | 2370 struct dasd_device *base; |
2370 | 2371 |
2371 atomic_dec(&block->open_count); 2372 module_put(block->base->discipline->owner); | 2372 base = dasd_device_from_gendisk(disk); 2373 if (!base) 2374 return -ENODEV; 2375 2376 atomic_dec(&base->block->open_count); 2377 module_put(base->discipline->owner); 2378 dasd_put_device(base); |
2373 return 0; 2374} 2375 2376/* 2377 * Return disk geometry. 2378 */ 2379static int dasd_getgeo(struct block_device *bdev, struct hd_geometry *geo) 2380{ | 2379 return 0; 2380} 2381 2382/* 2383 * Return disk geometry. 2384 */ 2385static int dasd_getgeo(struct block_device *bdev, struct hd_geometry *geo) 2386{ |
2381 struct dasd_block *block; | |
2382 struct dasd_device *base; 2383 | 2387 struct dasd_device *base; 2388 |
2384 block = bdev->bd_disk->private_data; 2385 if (!block) | 2389 base = dasd_device_from_gendisk(bdev->bd_disk); 2390 if (!base) |
2386 return -ENODEV; | 2391 return -ENODEV; |
2387 base = block->base; | |
2388 2389 if (!base->discipline || | 2392 2393 if (!base->discipline || |
2390 !base->discipline->fill_geometry) | 2394 !base->discipline->fill_geometry) { 2395 dasd_put_device(base); |
2391 return -EINVAL; | 2396 return -EINVAL; |
2392 2393 base->discipline->fill_geometry(block, geo); 2394 geo->start = get_start_sect(bdev) >> block->s2b_shift; | 2397 } 2398 base->discipline->fill_geometry(base->block, geo); 2399 geo->start = get_start_sect(bdev) >> base->block->s2b_shift; 2400 dasd_put_device(base); |
2395 return 0; 2396} 2397 2398const struct block_device_operations 2399dasd_device_operations = { 2400 .owner = THIS_MODULE, 2401 .open = dasd_open, 2402 .release = dasd_release, --- 120 unchanged lines hidden (view full) --- 2523 /* 2524 * This device is removed unconditionally. Set offline 2525 * flag to prevent dasd_open from opening it while it is 2526 * no quite down yet. 2527 */ 2528 dasd_set_target_state(device, DASD_STATE_NEW); 2529 /* dasd_delete_device destroys the device reference. */ 2530 block = device->block; | 2401 return 0; 2402} 2403 2404const struct block_device_operations 2405dasd_device_operations = { 2406 .owner = THIS_MODULE, 2407 .open = dasd_open, 2408 .release = dasd_release, --- 120 unchanged lines hidden (view full) --- 2529 /* 2530 * This device is removed unconditionally. Set offline 2531 * flag to prevent dasd_open from opening it while it is 2532 * no quite down yet. 2533 */ 2534 dasd_set_target_state(device, DASD_STATE_NEW); 2535 /* dasd_delete_device destroys the device reference. */ 2536 block = device->block; |
2531 device->block = NULL; | |
2532 dasd_delete_device(device); 2533 /* 2534 * life cycle of block is bound to device, so delete it after 2535 * device was safely removed 2536 */ 2537 if (block) 2538 dasd_free_block(block); 2539} --- 105 unchanged lines hidden (view full) --- 2645 clear_bit(DASD_FLAG_OFFLINE, &device->flags); 2646 dasd_put_device(device); 2647 return -EBUSY; 2648 } 2649 } 2650 dasd_set_target_state(device, DASD_STATE_NEW); 2651 /* dasd_delete_device destroys the device reference. */ 2652 block = device->block; | 2537 dasd_delete_device(device); 2538 /* 2539 * life cycle of block is bound to device, so delete it after 2540 * device was safely removed 2541 */ 2542 if (block) 2543 dasd_free_block(block); 2544} --- 105 unchanged lines hidden (view full) --- 2650 clear_bit(DASD_FLAG_OFFLINE, &device->flags); 2651 dasd_put_device(device); 2652 return -EBUSY; 2653 } 2654 } 2655 dasd_set_target_state(device, DASD_STATE_NEW); 2656 /* dasd_delete_device destroys the device reference. */ 2657 block = device->block; |
2653 device->block = NULL; | |
2654 dasd_delete_device(device); 2655 /* 2656 * life cycle of block is bound to device, so delete it after 2657 * device was safely removed 2658 */ 2659 if (block) 2660 dasd_free_block(block); 2661 return 0; --- 383 unchanged lines hidden --- | 2658 dasd_delete_device(device); 2659 /* 2660 * life cycle of block is bound to device, so delete it after 2661 * device was safely removed 2662 */ 2663 if (block) 2664 dasd_free_block(block); 2665 return 0; --- 383 unchanged lines hidden --- |