[CRIU] [PATCH v4 27/33] tty: Set dependencies between masters, slaves and ctty
Kirill Tkhai
ktkhai at virtuozzo.com
Tue Dec 13 07:08:09 PST 2016
Firstly masters, then slaves and lastly ctty.
v4: New
Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
criu/tty.c | 38 +++++++++++++++++++++++++++++++++++++-
1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/criu/tty.c b/criu/tty.c
index bd6370b..3fc178d 100644
--- a/criu/tty.c
+++ b/criu/tty.c
@@ -1097,6 +1097,38 @@ static int open_ext_tty(struct tty_info *info)
return fd;
}
+static bool tty_deps_restored(struct tty_info *info)
+{
+ struct list_head *list = &rsti(current)->used;
+ struct fdinfo_list_entry *fle;
+ struct tty_info *tmp;
+
+ if (info->driver->type == TTY_TYPE__CTTY) {
+ list_for_each_entry(fle, list, used_list) {
+ if (fle->desc->ops->type != FD_TYPES__TTY || fle->desc == &info->d)
+ continue;
+
+ /* ctty needs all others are restored */
+ if (fle->stage != FLE_RESTORED)
+ return false;
+ }
+ } else if (!tty_is_master(info)) {
+ list_for_each_entry(fle, list, used_list) {
+ if (fle->desc->ops->type != FD_TYPES__TTY || fle->desc == &info->d)
+ continue;
+ tmp = container_of(fle->desc, struct tty_info, d);
+
+ /* slaves wait for masters except ctty */
+ if (tmp->driver->type == TTY_TYPE__CTTY ||
+ !tty_is_master(tmp))
+ continue;
+ if (fle->stage != FLE_RESTORED)
+ return false;
+ }
+ }
+ return true;
+}
+
static int tty_open(struct file_desc *d, int *new_fd)
{
struct tty_info *info = container_of(d, struct tty_info, d);
@@ -1106,7 +1138,11 @@ static int tty_open(struct file_desc *d, int *new_fd)
if (!info->create)
return receive_tty(info, new_fd);
- else if (is_pty(info->driver) && !tty_is_master(info))
+
+ if (!tty_deps_restored(info))
+ return ORV_AGAIN;
+
+ if (is_pty(info->driver) && !tty_is_master(info))
ret = pty_open_unpaired_slave(d, info);
else
ret = info->driver->open(info);
More information about the CRIU
mailing list