Skip to content

Commit fc7b3ff

Browse files
committed
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
2 parents 019793b + 9ff4cfb commit fc7b3ff

File tree

11 files changed

+166
-74
lines changed

11 files changed

+166
-74
lines changed

arch/s390/crypto/prng.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ static void prng_seed(int nbytes)
7676

7777
/* Add the entropy */
7878
while (nbytes >= 8) {
79-
*((__u64 *)parm_block) ^= *((__u64 *)buf+i*8);
79+
*((__u64 *)parm_block) ^= *((__u64 *)buf+i);
8080
prng_add_entropy();
8181
i += 8;
8282
nbytes -= 8;

arch/s390/kvm/sie64a.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ sie_irq_handler:
4848
tm __TI_flags+7(%r2),_TIF_EXIT_SIE
4949
jz 0f
5050
larl %r2,sie_exit # work pending, leave sie
51-
stg %r2,__LC_RETURN_PSW+8
51+
stg %r2,SPI_PSW+8(0,%r15)
5252
br %r14
5353
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)
5555
1: br %r14
5656

5757
/*

arch/s390/mm/fault.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -558,9 +558,9 @@ static void pfault_interrupt(unsigned int ext_int_code,
558558
* Get the token (= address of the task structure of the affected task).
559559
*/
560560
#ifdef CONFIG_64BIT
561-
tsk = *(struct task_struct **) param64;
561+
tsk = (struct task_struct *) param64;
562562
#else
563-
tsk = *(struct task_struct **) param32;
563+
tsk = (struct task_struct *) param32;
564564
#endif
565565

566566
if (subcode & 0x0080) {

arch/s390/mm/pageattr.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ static void change_page_attr(unsigned long addr, int numpages,
2424
WARN_ON_ONCE(1);
2525
continue;
2626
}
27-
ptep = pte_offset_kernel(pmdp, addr + i * PAGE_SIZE);
27+
ptep = pte_offset_kernel(pmdp, addr);
2828

2929
pte = *ptep;
3030
pte = set(pte);
31-
ptep_invalidate(&init_mm, addr + i * PAGE_SIZE, ptep);
31+
ptep_invalidate(&init_mm, addr, ptep);
3232
*ptep = pte;
33+
addr += PAGE_SIZE;
3334
}
3435
}
3536

drivers/s390/block/dasd.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2314,15 +2314,14 @@ static void dasd_flush_request_queue(struct dasd_block *block)
23142314

23152315
static int dasd_open(struct block_device *bdev, fmode_t mode)
23162316
{
2317-
struct dasd_block *block = bdev->bd_disk->private_data;
23182317
struct dasd_device *base;
23192318
int rc;
23202319

2321-
if (!block)
2320+
base = dasd_device_from_gendisk(bdev->bd_disk);
2321+
if (!base)
23222322
return -ENODEV;
23232323

2324-
base = block->base;
2325-
atomic_inc(&block->open_count);
2324+
atomic_inc(&base->block->open_count);
23262325
if (test_bit(DASD_FLAG_OFFLINE, &base->flags)) {
23272326
rc = -ENODEV;
23282327
goto unlock;
@@ -2355,21 +2354,28 @@ static int dasd_open(struct block_device *bdev, fmode_t mode)
23552354
goto out;
23562355
}
23572356

2357+
dasd_put_device(base);
23582358
return 0;
23592359

23602360
out:
23612361
module_put(base->discipline->owner);
23622362
unlock:
2363-
atomic_dec(&block->open_count);
2363+
atomic_dec(&base->block->open_count);
2364+
dasd_put_device(base);
23642365
return rc;
23652366
}
23662367

23672368
static int dasd_release(struct gendisk *disk, fmode_t mode)
23682369
{
2369-
struct dasd_block *block = disk->private_data;
2370+
struct dasd_device *base;
23702371

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);
23732379
return 0;
23742380
}
23752381

@@ -2378,20 +2384,20 @@ static int dasd_release(struct gendisk *disk, fmode_t mode)
23782384
*/
23792385
static int dasd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
23802386
{
2381-
struct dasd_block *block;
23822387
struct dasd_device *base;
23832388

2384-
block = bdev->bd_disk->private_data;
2385-
if (!block)
2389+
base = dasd_device_from_gendisk(bdev->bd_disk);
2390+
if (!base)
23862391
return -ENODEV;
2387-
base = block->base;
23882392

23892393
if (!base->discipline ||
2390-
!base->discipline->fill_geometry)
2394+
!base->discipline->fill_geometry) {
2395+
dasd_put_device(base);
23912396
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);
23952401
return 0;
23962402
}
23972403

@@ -2528,7 +2534,6 @@ void dasd_generic_remove(struct ccw_device *cdev)
25282534
dasd_set_target_state(device, DASD_STATE_NEW);
25292535
/* dasd_delete_device destroys the device reference. */
25302536
block = device->block;
2531-
device->block = NULL;
25322537
dasd_delete_device(device);
25332538
/*
25342539
* 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)
26502655
dasd_set_target_state(device, DASD_STATE_NEW);
26512656
/* dasd_delete_device destroys the device reference. */
26522657
block = device->block;
2653-
device->block = NULL;
26542658
dasd_delete_device(device);
26552659
/*
26562660
* life cycle of block is bound to device, so delete it after

drivers/s390/block/dasd_devmap.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,36 @@ dasd_device_from_cdev(struct ccw_device *cdev)
674674
return device;
675675
}
676676

677+
void dasd_add_link_to_gendisk(struct gendisk *gdp, struct dasd_device *device)
678+
{
679+
struct dasd_devmap *devmap;
680+
681+
devmap = dasd_find_busid(dev_name(&device->cdev->dev));
682+
if (IS_ERR(devmap))
683+
return;
684+
spin_lock(&dasd_devmap_lock);
685+
gdp->private_data = devmap;
686+
spin_unlock(&dasd_devmap_lock);
687+
}
688+
689+
struct dasd_device *dasd_device_from_gendisk(struct gendisk *gdp)
690+
{
691+
struct dasd_device *device;
692+
struct dasd_devmap *devmap;
693+
694+
if (!gdp->private_data)
695+
return NULL;
696+
device = NULL;
697+
spin_lock(&dasd_devmap_lock);
698+
devmap = gdp->private_data;
699+
if (devmap && devmap->device) {
700+
device = devmap->device;
701+
dasd_get_device(device);
702+
}
703+
spin_unlock(&dasd_devmap_lock);
704+
return device;
705+
}
706+
677707
/*
678708
* SECTION: files in sysfs
679709
*/

drivers/s390/block/dasd_eckd.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,7 +2037,7 @@ static void dasd_eckd_check_for_device_change(struct dasd_device *device,
20372037
return;
20382038

20392039
/* summary unit check */
2040-
if ((sense[7] == 0x0D) &&
2040+
if ((sense[27] & DASD_SENSE_BIT_0) && (sense[7] == 0x0D) &&
20412041
(scsw_dstat(&irb->scsw) & DEV_STAT_UNIT_CHECK)) {
20422042
dasd_alias_handle_summary_unit_check(device, irb);
20432043
return;
@@ -2053,7 +2053,8 @@ static void dasd_eckd_check_for_device_change(struct dasd_device *device,
20532053
/* loss of device reservation is handled via base devices only
20542054
* as alias devices may be used with several bases
20552055
*/
2056-
if (device->block && (sense[7] == 0x3F) &&
2056+
if (device->block && (sense[27] & DASD_SENSE_BIT_0) &&
2057+
(sense[7] == 0x3F) &&
20572058
(scsw_dstat(&irb->scsw) & DEV_STAT_UNIT_CHECK) &&
20582059
test_bit(DASD_FLAG_IS_RESERVED, &device->flags)) {
20592060
if (device->features & DASD_FEATURE_FAILONSLCK)

drivers/s390/block/dasd_genhd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ int dasd_gendisk_alloc(struct dasd_block *block)
7373
if (base->features & DASD_FEATURE_READONLY ||
7474
test_bit(DASD_FLAG_DEVICE_RO, &base->flags))
7575
set_disk_ro(gdp, 1);
76-
gdp->private_data = block;
76+
dasd_add_link_to_gendisk(gdp, base);
7777
gdp->queue = block->request_queue;
7878
block->gdp = gdp;
7979
set_capacity(block->gdp, 0);

drivers/s390/block/dasd_int.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,9 @@ struct dasd_device *dasd_device_from_cdev(struct ccw_device *);
686686
struct dasd_device *dasd_device_from_cdev_locked(struct ccw_device *);
687687
struct dasd_device *dasd_device_from_devindex(int);
688688

689+
void dasd_add_link_to_gendisk(struct gendisk *, struct dasd_device *);
690+
struct dasd_device *dasd_device_from_gendisk(struct gendisk *);
691+
689692
int dasd_parse(void);
690693
int dasd_busid_known(const char *);
691694

0 commit comments

Comments
 (0)