[CRIU] [PATCH 2/2] files: Fix breaking of fds list ordering by splice
Pavel Begunkov
asml.silence at gmail.com
Fri Jun 30 22:29:08 MSK 2017
fds lists should be sorted in ascending order, splicing of 2 (ordered)
lists violates this invariant.
Signed-off-by: Pavel Begunkov <asml.silence at gmail.com>
---
criu/files.c | 14 +++++---------
1 file changed, 5 insertions(+), 9 deletions(-)
diff --git a/criu/files.c b/criu/files.c
index 4a263c438..a0df8f531 100644
--- a/criu/files.c
+++ b/criu/files.c
@@ -1161,12 +1161,13 @@ static int receive_fd(struct fdinfo_list_entry *fle)
return 0;
}
-static void close_fdinfos(struct list_head *list)
+static void close_fake_fdinfos(struct list_head *list)
{
struct fdinfo_list_entry *fle;
list_for_each_entry(fle, list, ps_list)
- close(fle->fe->fd);
+ if (fle->fake)
+ close(fle->fe->fd);
}
static int open_fdinfos(struct pstree_item *me)
@@ -1174,7 +1175,6 @@ static int open_fdinfos(struct pstree_item *me)
struct list_head *list = &rsti(me)->fds;
struct fdinfo_list_entry *fle, *tmp;
LIST_HEAD(completed);
- LIST_HEAD(fake);
bool progress, again;
int st, ret = 0;
@@ -1197,10 +1197,7 @@ static int open_fdinfos(struct pstree_item *me)
* and reduce number of fles in their checks.
*/
list_del(&fle->ps_list);
- if (!fle->fake)
- list_add_tail(&fle->ps_list, &completed);
- else
- list_add_tail(&fle->ps_list, &fake);
+ list_add_tail(&fle->ps_list, &completed);
}
if (ret == 1)
again = true;
@@ -1214,9 +1211,8 @@ static int open_fdinfos(struct pstree_item *me)
* Fake fles may be used for restore other
* file types, so their closing is delayed.
*/
- close_fdinfos(&fake);
+ close_fake_fdinfos(&completed);
splice:
- list_splice(&fake, list);
list_splice(&completed, list);
return ret;
--
2.11.1
More information about the CRIU
mailing list