static int mon_close(struct inode *inode, struct file *filp)
{
	int rc, i;
	struct mon_private *monpriv = filp->private_data;

	/*
	 * Close IUCV connection and unregister
	 */
	if (monpriv->path) {
		rc = iucv_path_sever(monpriv->path, user_data_sever);
		if (rc)
			pr_warning("Disconnecting the z/VM *MONITOR system "
				   "service failed with rc=%i\n", rc);
		iucv_path_free(monpriv->path);
	}

	atomic_set(&monpriv->iucv_severed, 0);
	atomic_set(&monpriv->iucv_connected, 0);
	atomic_set(&monpriv->read_ready, 0);
	atomic_set(&monpriv->msglim_count, 0);
	monpriv->write_index  = 0;
	monpriv->read_index   = 0;
	dev_set_drvdata(monreader_device, NULL);

	for (i = 0; i < MON_MSGLIM; i++)
		kfree(monpriv->msg_array[i]);
	kfree(monpriv);
	clear_bit(MON_IN_USE, &mon_in_use);
	return 0;
}
示例#2
0
文件: monreader.c 项目: 274914765/C
static int mon_close(struct inode *inode, struct file *filp)
{
    int rc, i;
    struct mon_private *monpriv = filp->private_data;

    /*
     * Close IUCV connection and unregister
     */
    rc = iucv_path_sever(monpriv->path, user_data_sever);
    if (rc)
        P_ERROR("close, iucv_sever failed with rc = %i\n", rc);
    else
        P_INFO("close, terminated connection to *MONITOR service\n");

    atomic_set(&monpriv->iucv_severed, 0);
    atomic_set(&monpriv->iucv_connected, 0);
    atomic_set(&monpriv->read_ready, 0);
    atomic_set(&monpriv->msglim_count, 0);
    monpriv->write_index  = 0;
    monpriv->read_index   = 0;

    for (i = 0; i < MON_MSGLIM; i++)
        kfree(monpriv->msg_array[i]);
    kfree(monpriv);
    clear_bit(MON_IN_USE, &mon_in_use);
    return 0;
}
示例#3
0
文件: monreader.c 项目: 274914765/C
static void mon_iucv_path_severed(struct iucv_path *path, u8 ipuser[16])
{
    struct mon_private *monpriv = path->private;

    P_ERROR("IUCV connection severed with rc = 0x%X\n", ipuser[0]);
    iucv_path_sever(path, NULL);
    atomic_set(&monpriv->iucv_severed, 1);
    wake_up(&mon_conn_wait_queue);
    wake_up_interruptible(&mon_read_wait_queue);
}
static void mon_iucv_path_severed(struct iucv_path *path, u8 ipuser[16])
{
	struct mon_private *monpriv = path->private;

	pr_err("z/VM *MONITOR system service disconnected with rc=%i\n",
	       ipuser[0]);
	iucv_path_sever(path, NULL);
	atomic_set(&monpriv->iucv_severed, 1);
	wake_up(&mon_conn_wait_queue);
	wake_up_interruptible(&mon_read_wait_queue);
}
/******************************************************************************
 *				suspend / resume			      *
 *****************************************************************************/
static int monreader_freeze(struct device *dev)
{
	struct mon_private *monpriv = dev_get_drvdata(dev);
	int rc;

	if (!monpriv)
		return 0;
	if (monpriv->path) {
		rc = iucv_path_sever(monpriv->path, user_data_sever);
		if (rc)
			pr_warning("Disconnecting the z/VM *MONITOR system "
				   "service failed with rc=%i\n", rc);
		iucv_path_free(monpriv->path);
	}
	atomic_set(&monpriv->iucv_severed, 0);
	atomic_set(&monpriv->iucv_connected, 0);
	atomic_set(&monpriv->read_ready, 0);
	atomic_set(&monpriv->msglim_count, 0);
	monpriv->write_index  = 0;
	monpriv->read_index   = 0;
	monpriv->path = NULL;
	return 0;
}