diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-04-26 14:38:48 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-04-26 14:38:48 -0400 |
| commit | fc7b3ff1ac0ca3250628911ca6534882db9f2cb3 (patch) | |
| tree | 96972cb5ef0a54c5011b308497ee43de550c8b3d | |
| parent | 019793b7554b18818624e9cf7a2ee8ba8cf6bda0 (diff) | |
| parent | 9ff4cfb3fcfd48b49fdd9be7381b3be340853aa4 (diff) | |
Merge branch 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6
* 'for-linus' of git://git390.marist.edu/pub/scm/linux-2.6:
[S390] kvm-390: Let kernel exit SIE instruction on work
[S390] dasd: check sense type in device change handler
[S390] pfault: fix token handling
[S390] qdio: reset error states immediately
[S390] fix page table walk for changing page attributes
[S390] prng: prevent access beyond end of stack
[S390] dasd: fix race between open and offline
| -rw-r--r-- | arch/s390/crypto/prng.c | 2 | ||||
| -rw-r--r-- | arch/s390/kvm/sie64a.S | 4 | ||||
| -rw-r--r-- | arch/s390/mm/fault.c | 4 | ||||
| -rw-r--r-- | arch/s390/mm/pageattr.c | 5 | ||||
| -rw-r--r-- | drivers/s390/block/dasd.c | 40 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_devmap.c | 30 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_eckd.c | 5 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_genhd.c | 2 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_int.h | 3 | ||||
| -rw-r--r-- | drivers/s390/block/dasd_ioctl.c | 128 | ||||
| -rw-r--r-- | drivers/s390/cio/qdio_main.c | 17 |
11 files changed, 166 insertions, 74 deletions
diff --git a/arch/s390/crypto/prng.c b/arch/s390/crypto/prng.c index 975e3ab13cb5..44bca3f994b0 100644 --- a/arch/s390/crypto/prng.c +++ b/arch/s390/crypto/prng.c | |||
| @@ -76,7 +76,7 @@ static void prng_seed(int nbytes) | |||
| 76 | 76 | ||
| 77 | /* Add the entropy */ | 77 | /* Add the entropy */ |
| 78 | while (nbytes >= 8) { | 78 | while (nbytes >= 8) { |
| 79 | *((__u64 *)parm_block) ^= *((__u64 *)buf+i*8); | 79 | *((__u64 *)parm_block) ^= *((__u64 *)buf+i); |
| 80 | prng_add_entropy(); | 80 | prng_add_entropy(); |
| 81 | i += 8; | 81 | i += 8; |
| 82 | nbytes -= 8; | 82 | nbytes -= 8; |
diff --git a/arch/s390/kvm/sie64a.S b/arch/s390/kvm/sie64a.S index 7e9d30d567b0..ab0e041ac54c 100644 --- a/arch/s390/kvm/sie64a.S +++ b/arch/s390/kvm/sie64a.S | |||
| @@ -48,10 +48,10 @@ sie_irq_handler: | |||
| 48 | tm __TI_flags+7(%r2),_TIF_EXIT_SIE | 48 | tm __TI_flags+7(%r2),_TIF_EXIT_SIE |
| 49 | jz 0f | 49 | jz 0f |
| 50 | larl %r2,sie_exit # work pending, leave sie | 50 | larl %r2,sie_exit # work pending, leave sie |
| 51 | stg %r2,__LC_RETURN_PSW+8 | 51 | stg %r2,SPI_PSW+8(0,%r15) |
| 52 | br %r14 | 52 | br %r14 |
| 53 | 0: larl %r2,sie_reenter # re-enter with guest id | 53 | 0: larl %r2,sie_reenter # re-enter with guest id |
| 54 | stg %r2,__LC_RETURN_PSW+8 | 54 | stg %r2,SPI_PSW+8(0,%r15) |
| 55 | 1: br %r14 | 55 | 1: br %r14 |
| 56 | 56 | ||
| 57 | /* | 57 | /* |
diff --git a/arch/s390/mm/fault.c b/arch/s390/mm/fault.c index 9217e332b118..4cf85fef407c 100644 --- a/arch/s390/mm/fault.c +++ b/arch/s390/mm/fault.c | |||
| @@ -558,9 +558,9 @@ static void pfault_interrupt(unsigned int ext_int_code, | |||
| 558 | * Get the token (= address of the task structure of the affected task). | 558 | * Get the token (= address of the task structure of the affected task). |
| 559 | */ | 559 | */ |
| 560 | #ifdef CONFIG_64BIT | 560 | #ifdef CONFIG_64BIT |
| 561 | tsk = *(struct task_struct **) param64; | 561 | tsk = (struct task_struct *) param64; |
| 562 | #else | 562 | #else |
| 563 | tsk = *(struct task_struct **) param32; | 563 | tsk = (struct task_struct *) param32; |
| 564 | #endif | 564 | #endif |
| 565 | 565 | ||
| 566 | if (subcode & 0x0080) { | 566 | if (subcode & 0x0080) { |
diff --git a/arch/s390/mm/pageattr.c b/arch/s390/mm/pageattr.c index 122ffbd08ce0..0607e4b14b27 100644 --- a/arch/s390/mm/pageattr.c +++ b/arch/s390/mm/pageattr.c | |||
| @@ -24,12 +24,13 @@ static void change_page_attr(unsigned long addr, int numpages, | |||
| 24 | WARN_ON_ONCE(1); | 24 | WARN_ON_ONCE(1); |
| 25 | continue; | 25 | continue; |
| 26 | } | 26 | } |
| 27 | ptep = pte_offset_kernel(pmdp, addr + i * PAGE_SIZE); | 27 | ptep = pte_offset_kernel(pmdp, addr); |
| 28 | 28 | ||
| 29 | pte = *ptep; | 29 | pte = *ptep; |
| 30 | pte = set(pte); | 30 | pte = set(pte); |
| 31 | ptep_invalidate(&init_mm, addr + i * PAGE_SIZE, ptep); | 31 | ptep_invalidate(&init_mm, addr, ptep); |
| 32 | *ptep = pte; | 32 | *ptep = pte; |
| 33 | addr += PAGE_SIZE; | ||
| 33 | } | 34 | } |
| 34 | } | 35 | } |
| 35 | 36 | ||
diff --git a/drivers/s390/block/dasd.c b/drivers/s390/block/dasd.c index 4d2df2f76ea0..475e603fc584 100644 --- a/drivers/s390/block/dasd.c +++ b/drivers/s390/block/dasd.c | |||
| @@ -2314,15 +2314,14 @@ static void dasd_flush_request_queue(struct dasd_block *block) | |||
| 2314 | 2314 | ||
| 2315 | static int dasd_open(struct block_device *bdev, fmode_t mode) | 2315 | static int dasd_open(struct block_device *bdev, fmode_t mode) |
| 2316 | { | 2316 | { |
| 2317 | struct dasd_block *block = bdev->bd_disk->private_data; | ||
| 2318 | struct dasd_device *base; | 2317 | struct dasd_device *base; |
| 2319 | int rc; | 2318 | int rc; |
| 2320 | 2319 | ||
| 2321 | if (!block) | 2320 | base = dasd_device_from_gendisk(bdev->bd_disk); |
| 2321 | if (!base) | ||
| 2322 | return -ENODEV; | 2322 | return -ENODEV; |
| 2323 | 2323 | ||
| 2324 | base = block->base; | 2324 | atomic_inc(&base->block->open_count); |
| 2325 | atomic_inc(&block->open_count); | ||
| 2326 | if (test_bit(DASD_FLAG_OFFLINE, &base->flags)) { | 2325 | if (test_bit(DASD_FLAG_OFFLINE, &base->flags)) { |
| 2327 | rc = -ENODEV; | 2326 | rc = -ENODEV; |
| 2328 | goto unlock; | 2327 | goto unlock; |
| @@ -2355,21 +2354,28 @@ static int dasd_open(struct block_device *bdev, fmode_t mode) | |||
| 2355 | goto out; | 2354 | goto out; |
| 2356 | } | 2355 | } |
| 2357 | 2356 | ||
| 2357 | dasd_put_device(base); | ||
| 2358 | return 0; | 2358 | return 0; |
| 2359 | 2359 | ||
| 2360 | out: | 2360 | out: |
| 2361 | module_put(base->discipline->owner); | 2361 | module_put(base->discipline->owner); |
| 2362 | unlock: | 2362 | unlock: |
| 2363 | atomic_dec(&block->open_count); | 2363 | atomic_dec(&base->block->open_count); |
| 2364 | dasd_put_device(base); | ||
| 2364 | return rc; | 2365 | return rc; |
| 2365 | } | 2366 | } |
| 2366 | 2367 | ||
| 2367 | static int dasd_release(struct gendisk *disk, fmode_t mode) | 2368 | static int dasd_release(struct gendisk *disk, fmode_t mode) |
| 2368 | { | 2369 | { |
| 2369 | struct dasd_block *block = disk->private_data; | 2370 | struct dasd_device *base; |
| 2370 | 2371 | ||
| 2371 | atomic_dec(&block->open_count); | 2372 | base = dasd_device_from_gendisk(disk); |
| 2372 | module_put(block->base->discipline->owner); | 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; | 2379 | return 0; |
| 2374 | } | 2380 | } |
| 2375 | 2381 | ||
| @@ -2378,20 +2384,20 @@ static int dasd_release(struct gendisk *disk, fmode_t mode) | |||
| 2378 | */ | 2384 | */ |
| 2379 | static int dasd_getgeo(struct block_device *bdev, struct hd_geometry *geo) | 2385 | static int dasd_getgeo(struct block_device *bdev, struct hd_geometry *geo) |
| 2380 | { | 2386 | { |
| 2381 | struct dasd_block *block; | ||
| 2382 | struct dasd_device *base; | 2387 | struct dasd_device *base; |
| 2383 | 2388 | ||
| 2384 | block = bdev->bd_disk->private_data; | 2389 | base = dasd_device_from_gendisk(bdev->bd_disk); |
| 2385 | if (!block) | 2390 | if (!base) |
| 2386 | return -ENODEV; | 2391 | return -ENODEV; |
| 2387 | base = block->base; | ||
| 2388 | 2392 | ||
| 2389 | if (!base->discipline || | 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 | 2397 | } | |
| 2393 | base->discipline->fill_geometry(block, geo); | 2398 | base->discipline->fill_geometry(base->block, geo); |
| 2394 | geo->start = get_start_sect(bdev) >> block->s2b_shift; | 2399 | geo->start = get_start_sect(bdev) >> base->block->s2b_shift; |
| 2400 | dasd_put_device(base); | ||
| 2395 | return 0; | 2401 | return 0; |
| 2396 | } | 2402 | } |
| 2397 | 2403 | ||
| @@ -2528,7 +2534,6 @@ void dasd_generic_remove(struct ccw_device *cdev) | |||
| 2528 | dasd_set_target_state(device, DASD_STATE_NEW); | 2534 | dasd_set_target_state(device, DASD_STATE_NEW); |
| 2529 | /* dasd_delete_device destroys the device reference. */ | 2535 | /* dasd_delete_device destroys the device reference. */ |
| 2530 | block = device->block; | 2536 | block = device->block; |
| 2531 | device->block = NULL; | ||
| 2532 | dasd_delete_device(device); | 2537 | dasd_delete_device(device); |
| 2533 | /* | 2538 | /* |
| 2534 | * life cycle of block is bound to device, so delete it after | 2539 | * life cycle of block is bound to device, so delete it after |
| @@ -2650,7 +2655,6 @@ int dasd_generic_set_offline(struct ccw_device *cdev) | |||
| 2650 | dasd_set_target_stat | ||
