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; }
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; }
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; }