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

Commit b241f7bc authored by Frank Munzert's avatar Frank Munzert Committed by Martin Schwidefsky
Browse files

[S390] pm: vmur driver power management callbacks

parent 524dbcda
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@
 * Linux driver for System z and s390 unit record devices
 * (z/VM virtual punch, reader, printer)
 *
 * Copyright IBM Corp. 2001, 2007
 * Copyright IBM Corp. 2001, 2009
 * Authors: Malcolm Beattie <beattiem@uk.ibm.com>
 *	    Michael Holzheu <holzheu@de.ibm.com>
 *	    Frank Munzert <munzert@de.ibm.com>
@@ -60,6 +60,7 @@ static int ur_probe(struct ccw_device *cdev);
static void ur_remove(struct ccw_device *cdev);
static int ur_set_online(struct ccw_device *cdev);
static int ur_set_offline(struct ccw_device *cdev);
static int ur_pm_suspend(struct ccw_device *cdev);

static struct ccw_driver ur_driver = {
	.name		= "vmur",
@@ -69,6 +70,7 @@ static struct ccw_driver ur_driver = {
	.remove		= ur_remove,
	.set_online	= ur_set_online,
	.set_offline	= ur_set_offline,
	.freeze		= ur_pm_suspend,
};

static DEFINE_MUTEX(vmur_mutex);
@@ -157,6 +159,28 @@ static void urdev_put(struct urdev *urd)
		urdev_free(urd);
}

/*
 * State and contents of ur devices can be changed by class D users issuing
 * CP commands such as PURGE or TRANSFER, while the Linux guest is suspended.
 * Also the Linux guest might be logged off, which causes all active spool
 * files to be closed.
 * So we cannot guarantee that spool files are still the same when the Linux
 * guest is resumed. In order to avoid unpredictable results at resume time
 * we simply refuse to suspend if a ur device node is open.
 */
static int ur_pm_suspend(struct ccw_device *cdev)
{
	struct urdev *urd = cdev->dev.driver_data;

	TRACE("ur_pm_suspend: cdev=%p\n", cdev);
	if (urd->open_flag) {
		pr_err("Unit record device %s is busy, %s refusing to "
		       "suspend.\n", dev_name(&cdev->dev), ur_banner);
		return -EBUSY;
	}
	return 0;
}

/*
 * Low-level functions to do I/O to a ur device.
 *     alloc_chan_prog