mirror of
https://github.com/checkpoint-restore/criu.git
synced 2026-07-20 01:54:28 +00:00
This is here only to support the Linux Kernel between versions 3.18 and 4.2. After that, this workaround is not needed anymore, but it will work properly on both a kernel with and without the bug. The bug is that when a process has a file open in an OverlayFS directory, the information in /proc/<pid>/fd/<fd> and /proc/<pid>/fdinfo/<fd> is wrong, so we grab that information from the mountinfo table instead. This is done every time fill_fdlink is called. We first check to see if the mnt_id and st_dev numbers currently match some entry in the mountinfo table. If so, we already have the correct mnt_id and no fixup is needed. Then we proceed to see if there are any overlayFS mounted directories in the mountinfo table. If so, we concatenate the mountpoint with the name of the file, and stat the resulting path to check if we found the correct device id and node number. If that is the case, we update the mount id and link variables with the correct values. Signed-off-by: Gabriel Guimaraes <gabriellimaguimaraes@gmail.com> Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
43 lines
1.3 KiB
C
43 lines
1.3 KiB
C
#ifndef __CR_MOUNT_H__
|
|
#define __CR_MOUNT_H__
|
|
|
|
extern struct mount_info *mntinfo;
|
|
|
|
struct ns_id;
|
|
extern int __mntns_get_root_fd(pid_t pid);
|
|
extern int mntns_get_root_fd(struct ns_id *ns);
|
|
extern int mntns_get_root_by_mnt_id(int mnt_id);
|
|
extern struct ns_id *lookup_nsid_by_mnt_id(int mnt_id);
|
|
|
|
struct proc_mountinfo;
|
|
|
|
extern int open_mount(unsigned int s_dev);
|
|
extern struct fstype *find_fstype_by_name(char *fst);
|
|
extern bool add_fsname_auto(const char *names);
|
|
|
|
struct cr_imgset;
|
|
extern struct mount_info * collect_mntinfo(struct ns_id *ns, bool for_dump);
|
|
extern int prepare_mnt_ns(void);
|
|
|
|
extern int pivot_root(const char *new_root, const char *put_old);
|
|
|
|
struct mount_info;
|
|
struct mount_info *lookup_overlayfs(char *rpath, unsigned int s_dev,
|
|
unsigned int st_ino, unsigned int mnt_id);
|
|
extern struct mount_info *lookup_mnt_id(unsigned int id);
|
|
extern struct mount_info *lookup_mnt_sdev(unsigned int s_dev);
|
|
|
|
extern struct ns_desc mnt_ns_desc;
|
|
|
|
extern dev_t phys_stat_resolve_dev(struct ns_id *, dev_t st_dev, const char *path);
|
|
extern bool phys_stat_dev_match(dev_t st_dev, dev_t phys_dev,
|
|
struct ns_id *, const char *path);
|
|
|
|
struct pstree_item;
|
|
extern int restore_task_mnt_ns(struct pstree_item *);
|
|
extern int fini_mnt_ns(void);
|
|
|
|
char *rst_get_mnt_root(int mnt_id);
|
|
int ext_mount_add(char *key, char *val);
|
|
|
|
#endif /* __CR_MOUNT_H__ */
|