[CRIU] [PATCH v3 22/26] eventpoll: Make post_open stage may fail

Kirill Tkhai ktkhai at virtuozzo.com
Mon Dec 5 06:11:05 PST 2016


Currently, it's just an additional check. But later this will be used.

v2: Use generic FLE_OPEN and FLE_RESTORED to determ if a fle is ready

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 criu/eventpoll.c |   27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/criu/eventpoll.c b/criu/eventpoll.c
index 88076db..a65098d 100644
--- a/criu/eventpoll.c
+++ b/criu/eventpoll.c
@@ -21,6 +21,7 @@
 #include "image.h"
 #include "util.h"
 #include "log.h"
+#include "pstree.h"
 
 #include "protobuf.h"
 #include "images/eventpoll.pb-c.h"
@@ -140,6 +141,24 @@ static int eventpoll_open(struct file_desc *d)
 	close(tmp);
 	return -1;
 }
+
+static int epoll_not_ready_tfd(EventpollTfdEntry *tdefe)
+{
+	struct fdinfo_list_entry *fle;
+
+	list_for_each_entry(fle, &rsti(current)->used, used_list) {
+		if (tdefe->tfd != fle->fe->fd)
+			continue;
+
+		if (fle->desc->ops->type == FD_TYPES__EVENTPOLL)
+			return (fle->stage != FLE_OPEN);
+		else
+			return (fle->stage != FLE_RESTORED);
+	}
+	BUG();
+	return 0;
+}
+
 static int eventpoll_retore_tfd(int fd, int id, EventpollTfdEntry *tdefe)
 {
 	struct epoll_event event;
@@ -165,11 +184,19 @@ static int eventpoll_post_open(struct file_desc *d, int fd)
 	info = container_of(d, struct eventpoll_file_info, d);
 
 	for (i = 0; i < info->efe->n_tfd; i++) {
+		if (epoll_not_ready_tfd(info->efe->tfd[i]))
+			return ORV_AGAIN;
+	}
+	for (i = 0; i < info->efe->n_tfd; i++) {
 		if (eventpoll_retore_tfd(fd, info->efe->id, info->efe->tfd[i]))
 			return -1;
 	}
 
 	list_for_each_entry(td_info, &eventpoll_tfds, list) {
+		if (epoll_not_ready_tfd(td_info->tdefe))
+			return ORV_AGAIN;
+	}
+	list_for_each_entry(td_info, &eventpoll_tfds, list) {
 		if (td_info->tdefe->id != info->efe->id)
 			continue;
 



More information about the CRIU mailing list