Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fc7b3ff1 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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
parents 019793b7 9ff4cfb3
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -76,7 +76,7 @@ static void prng_seed(int nbytes)


	/* Add the entropy */
	/* Add the entropy */
	while (nbytes >= 8) {
	while (nbytes >= 8) {
		*((__u64 *)parm_block) ^= *((__u64 *)buf+i*8);
		*((__u64 *)parm_block) ^= *((__u64 *)buf+i);
		prng_add_entropy();
		prng_add_entropy();
		i += 8;
		i += 8;
		nbytes -= 8;
		nbytes -= 8;
+2 −2
Original line number Original line Diff line number Diff line
@@ -48,10 +48,10 @@ sie_irq_handler:
	tm	__TI_flags+7(%r2),_TIF_EXIT_SIE
	tm	__TI_flags+7(%r2),_TIF_EXIT_SIE
	jz	0f
	jz	0f
	larl	%r2,sie_exit			# work pending, leave sie
	larl	%r2,sie_exit			# work pending, leave sie
	stg	%r2,__LC_RETURN_PSW+8
	stg	%r2,SPI_PSW+8(0,%r15)
	br	%r14
	br	%r14
0:	larl	%r2,sie_reenter			# re-enter with guest id
0:	larl	%r2,sie_reenter			# re-enter with guest id
	stg	%r2,__LC_RETURN_PSW+8
	stg	%r2,SPI_PSW+8(0,%r15)
1:	br	%r14
1:	br	%r14


/*
/*
+2 −2
Original line number Original line Diff line number Diff line
@@ -558,9 +558,9 @@ static void pfault_interrupt(unsigned int ext_int_code,
	 * Get the token (= address of the task structure of the affected task).
	 * Get the token (= address of the task structure of the affected task).
	 */
	 */
#ifdef CONFIG_64BIT
#ifdef CONFIG_64BIT
	tsk = *(struct task_struct **) param64;
	tsk = (struct task_struct *) param64;
#else
#else
	tsk = *(struct task_struct **) param32;
	tsk = (struct task_struct *) param32;
#endif
#endif


	if (subcode & 0x0080) {
	if (subcode & 0x0080) {
+3 −2
Original line number Original line Diff line number Diff line
@@ -24,12 +24,13 @@ static void change_page_attr(unsigned long addr, int numpages,
			WARN_ON_ONCE(1);
			WARN_ON_ONCE(1);
			continue;
			continue;
		}
		}
		ptep = pte_offset_kernel(pmdp, addr + i * PAGE_SIZE);
		ptep = pte_offset_kernel(pmdp, addr);


		pte = *ptep;
		pte = *ptep;
		pte = set(pte);
		pte = set(pte);
		ptep_invalidate(&init_mm, addr + i * PAGE_SIZE, ptep);
		ptep_invalidate(&init_mm, addr, ptep);
		*ptep = pte;
		*ptep = pte;
		addr += PAGE_SIZE;
	}
	}
}
}


+22 −18
Original line number Original line Diff line number Diff line
@@ -2314,15 +2314,14 @@ static void dasd_flush_request_queue(struct dasd_block *block)


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


	if (!block)
	base = dasd_device_from_gendisk(bdev->bd_disk);
	if (!base)
		return -ENODEV;
		return -ENODEV;


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


	dasd_put_device(base);
	return 0;
	return 0;


out:
out:
	module_put(base->discipline->owner);
	module_put(base->discipline->owner);
unlock:
unlock:
	atomic_dec(&block->open_count);
	atomic_dec(&base->block->open_count);
	dasd_put_device(base);
	return rc;
	return rc;
}
}


static int dasd_release(struct gendisk *disk, fmode_t mode)
static int dasd_release(struct gendisk *disk, fmode_t mode)
{
{
	struct dasd_block *block = disk->private_data;
	struct dasd_device *base;


	atomic_dec(&block->open_count);
	base = dasd_device_from_gendisk(disk);
	module_put(block->base->discipline->owner);
	if (!base)
		return -ENODEV;

	atomic_dec(&base->block->open_count);
	module_put(base->discipline->owner);
	dasd_put_device(base);
	return 0;
	return 0;
}
}


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


	block = bdev->bd_disk->private_data;
	base = dasd_device_from_gendisk(bdev->bd_disk);
	if (!block)
	if (!base)
		return -ENODEV;
		return -ENODEV;
	base = block->base;


	if (!base->discipline ||
	if (!base->discipline ||
	    !base->discipline->fill_geometry)
	    !base->discipline->fill_geometry) {
		dasd_put_device(base);
		return -EINVAL;
		return -EINVAL;

	}
	base->discipline->fill_geometry(block, geo);
	base->discipline->fill_geometry(base->block, geo);
	geo->start = get_start_sect(bdev) >> block->s2b_shift;
	geo->start = get_start_sect(bdev) >> base->block->s2b_shift;
	dasd_put_device(base);
	return 0;
	return 0;
}
}


@@ -2528,7 +2534,6 @@ void dasd_generic_remove(struct ccw_device *cdev)
	dasd_set_target_state(device, DASD_STATE_NEW);
	dasd_set_target_state(device, DASD_STATE_NEW);
	/* dasd_delete_device destroys the device reference. */
	/* dasd_delete_device destroys the device reference. */
	block = device->block;
	block = device->block;
	device->block = NULL;
	dasd_delete_device(device);
	dasd_delete_device(device);
	/*
	/*
	 * life cycle of block is bound to device, so delete it after
	 * 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)
	dasd_set_target_state(device, DASD_STATE_NEW);
	dasd_set_target_state(device, DASD_STATE_NEW);
	/* dasd_delete_device destroys the device reference. */
	/* dasd_delete_device destroys the device reference. */
	block = device->block;
	block = device->block;
	device->block = NULL;
	dasd_delete_device(device);
	dasd_delete_device(device);
	/*
	/*
	 * life cycle of block is bound to device, so delete it after
	 * life cycle of block is bound to device, so delete it after
Loading