2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-22 09:58:09 +00:00
criu/include/page-read.h
Pavel Emelyanov 45a0cc4234 page-read: Explicitly mark ENOENT with return code
When page-read fails to open the pagemap image it reports error.
One place (stacked page-reads) need to handle the absent images
case gracefully, so fix the return codes to make this check
work.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
2015-03-13 14:42:11 +03:00

91 lines
2.7 KiB
C

#ifndef __CR_PAGE_READ_H__
#define __CR_PAGE_READ_H__
#include "protobuf/pagemap.pb-c.h"
/*
* page_read -- engine, that reads pages from image file(s)
*
* Several page-read's can be arranged in a chain to read
* pages from a series of snapshot.
*
* A task's address space vs pagemaps+page image pairs can
* look like this (taken from comment in page-pipe.h):
*
* task:
*
* 0 0 0 0 1 1 1
* 0 3 6 B 2 7 C
* ---+++-----+++++++-----+++++----
* pm1: ---+++-----++++++-------++++----
* pm2: ---==+-----====+++-----++===----
*
* Here + is present page, - is non prsent, = is present,
* but is not modified from last snapshot.
*
* Thus pagemap.img and pages.img entries are
*
* pm1: 03:3,0B:6,18:4
* pm2: 03:2:P,05:1,0B:4:P,0F:3,17:2,19:3:P
*
* where P means "page is in parent pagemap".
*
* pg1: 03,04,05,0B,0C,0D,0E,0F,10,18,19,1A,1B
* pg2: 05,0F,10,11,17,18
*
* When trying to restore from these 4 files we'd have
* to carefull scan pagemap.img's one by one and read or
* skip pages from pages.img where appropriate.
*
* All this is implemented in read_pagemap_page.
*/
struct page_read {
/*
* gets next vaddr:len pair to work on.
* Pagemap entries should be returned in sorted order.
*/
int (*get_pagemap)(struct page_read *, struct iovec *iov);
/* reads page from current pagemap */
int (*read_page)(struct page_read *, unsigned long vaddr, void *);
/* stop working on current pagemap */
void (*put_pagemap)(struct page_read *);
void (*close)(struct page_read *);
/* Private data of reader */
struct cr_img *pmi;
struct cr_img *pi;
PagemapEntry *pe; /* current pagemap we are on */
struct page_read *parent; /* parent pagemap (if ->in_parent
pagemap is met in image, then
go to this guy for page, see
read_pagemap_page */
unsigned long cvaddr; /* vaddr we are on */
struct iovec bunch; /* record consequent neighbour
iovecs to punch together */
unsigned id; /* for logging */
};
#define PR_SHMEM 0x1
#define PR_TASK 0x2
#define PR_TYPE_MASK 0x3
#define PR_MOD 0x4 /* Will need to modify */
/*
* -1 -- error
* 0 -- no images
* 1 -- opened
*/
extern int open_page_read(int pid, struct page_read *, int pr_flags);
extern int open_page_read_at(int dfd, int pid, struct page_read *pr, int pr_flags);
extern void pagemap2iovec(PagemapEntry *pe, struct iovec *iov);
extern void iovec2pagemap(struct iovec *iov, PagemapEntry *pe);
extern int seek_pagemap_page(struct page_read *pr, unsigned long vaddr, bool warn);
extern int dedup_one_iovec(struct page_read *pr, struct iovec *iov);
extern int punch_hole(struct page_read *pr, unsigned long off, unsigned long len, bool cleanup);
#endif /* __CR_PAGE_READ_H__ */