[CRIU] [PATCH 1/2] proc: Helper for opening vma's file
Pavel Emelyanov
xemul at parallels.com
Fri Jan 31 05:30:07 PST 2014
Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
---
proc_parse.c | 70 ++++++++++++++++++++++++++++++++++--------------------------
1 file changed, 40 insertions(+), 30 deletions(-)
diff --git a/proc_parse.c b/proc_parse.c
index 6c04f00..bd19f2f 100644
--- a/proc_parse.c
+++ b/proc_parse.c
@@ -142,6 +142,43 @@ static inline int is_anon_shmem_map(dev_t dev)
return kerndat_shmem_dev == dev;
}
+static int vma_get_mapfile(struct vma_area *vma, DIR *mfd)
+{
+ char path[32];
+
+ if (!mfd)
+ return 0;
+
+ /* Figure out if it's file mapping */
+ snprintf(path, sizeof(path), "%lx-%lx", vma->vma.start, vma->vma.end);
+
+ /*
+ * Note that we "open" it in dumper process space
+ * so later we might refer to it via /proc/self/fd/vm_file_fd
+ * if needed.
+ */
+ vma->vm_file_fd = openat(dirfd(mfd), path, O_RDONLY);
+ if (vma->vm_file_fd < 0) {
+ if (errno == ENXIO) {
+ struct stat buf;
+
+ if (fstatat(dirfd(mfd), path, &buf, 0))
+ return -1;
+
+ if (!S_ISSOCK(buf.st_mode))
+ return -1;
+
+ pr_info("Found socket %"PRIu64" mapping @%lx\n",
+ buf.st_ino, vma->vma.start);
+ vma->vma.status |= VMA_AREA_SOCKET | VMA_AREA_REGULAR;
+ vma->vm_socket_id = buf.st_ino;
+ } else if (errno != ENOENT)
+ return -1;
+ }
+
+ return 0;
+}
+
int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_files)
{
struct vma_area *vma_area = NULL;
@@ -230,41 +267,14 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
goto err;
}
- if (map_files_dir) {
- char path[32];
-
- /* Figure out if it's file mapping */
- snprintf(path, sizeof(path), "%lx-%lx", start, end);
-
- /*
- * Note that we "open" it in dumper process space
- * so later we might refer to it via /proc/self/fd/vm_file_fd
- * if needed.
- */
- vma_area->vm_file_fd = openat(dirfd(map_files_dir), path, O_RDONLY);
- if (vma_area->vm_file_fd < 0) {
- if (errno == ENXIO) {
- struct stat buf;
-
- if (fstatat(dirfd(map_files_dir), path, &buf, 0))
- goto err_bogus_mapfile;
-
- if (!S_ISSOCK(buf.st_mode))
- goto err_bogus_mapfile;
-
- pr_info("Found socket %"PRIu64" mapping @%lx\n", buf.st_ino, start);
- vma_area->vma.status |= VMA_AREA_SOCKET | VMA_AREA_REGULAR;
- vma_area->vm_socket_id = buf.st_ino;
- } else if (errno != ENOENT)
- goto err_bogus_mapfile;
- }
- }
-
vma_area->vma.start = start;
vma_area->vma.end = end;
vma_area->vma.pgoff = pgoff;
vma_area->vma.prot = PROT_NONE;
+ if (vma_get_mapfile(vma_area, map_files_dir))
+ goto err_bogus_mapfile;
+
if (r == 'r')
vma_area->vma.prot |= PROT_READ;
if (w == 'w')
--
1.8.4.2
More information about the CRIU
mailing list