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 ---