Commit ca08ad53 authored by Cyrill Gorcunov's avatar Cyrill Gorcunov Committed by Pavel Emelyanov

protobuf: Convert mnt_entry to PB engine

Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 5fd0ace2
...@@ -184,18 +184,6 @@ struct ipc_sem_entry { ...@@ -184,18 +184,6 @@ struct ipc_sem_entry {
u8 pad[6]; u8 pad[6];
} __packed; } __packed;
struct mnt_entry {
u32 fstype;
u32 mnt_id;
u32 root_dev;
u32 root_dentry_len;
u32 parent_mnt_id;
u32 mountpoint_path_len;
u32 flags;
u32 source_len;
u32 options_len;
} __packed;
#define VMA_AREA_NONE (0 << 0) #define VMA_AREA_NONE (0 << 0)
#define VMA_AREA_REGULAR (1 << 0) /* Dumpable area */ #define VMA_AREA_REGULAR (1 << 0) /* Dumpable area */
#define VMA_AREA_STACK (1 << 1) #define VMA_AREA_STACK (1 << 1)
......
...@@ -18,6 +18,9 @@ ...@@ -18,6 +18,9 @@
#include "proc_parse.h" #include "proc_parse.h"
#include "image.h" #include "image.h"
#include "protobuf.h"
#include "protobuf/mnt.pb-c.h"
static struct mount_info *mntinfo; static struct mount_info *mntinfo;
int open_mount(unsigned int s_dev) int open_mount(unsigned int s_dev)
...@@ -222,35 +225,27 @@ static inline int is_root_mount(struct mount_info *mi) ...@@ -222,35 +225,27 @@ static inline int is_root_mount(struct mount_info *mi)
static int dump_one_mountpoint(struct mount_info *pm, int fd) static int dump_one_mountpoint(struct mount_info *pm, int fd)
{ {
struct mnt_entry me; MntEntry me = MNT_ENTRY__INIT;
pr_info("\t%d: %x:%s @ %s\n", pm->mnt_id, pm->s_dev, pr_info("\t%d: %x:%s @ %s\n", pm->mnt_id, pm->s_dev,
pm->root, pm->mountpoint); pm->root, pm->mountpoint);
me.mnt_id = pm->mnt_id; me.fstype = encode_fstype(pm->fstype);
me.root_dev = pm->s_dev; me.mnt_id = pm->mnt_id;
me.root_dentry_len = strlen(pm->root); me.root_dev = pm->s_dev;
me.parent_mnt_id = pm->parent_mnt_id; me.parent_mnt_id = pm->parent_mnt_id;
me.mountpoint_path_len = strlen(pm->mountpoint); me.flags = pm->flags;
me.fstype = encode_fstype(pm->fstype); me.root = pm->root;
me.mountpoint = pm->mountpoint;
me.source = pm->source;
me.options = pm->options;
if (!me.fstype && !is_root_mount(pm)) { if (!me.fstype && !is_root_mount(pm)) {
pr_err("FS %s unsupported\n", pm->fstype); pr_err("FS %s unsupported\n", pm->fstype);
return -1; return -1;
} }
me.flags = pm->flags; if (pb_write(fd, &me, mnt_entry))
me.source_len = strlen(pm->source);
me.options_len = strlen(pm->options);
if (write_img(fd, &me))
return -1;
if (write_img_buf(fd, pm->root, me.root_dentry_len))
return -1;
if (write_img_buf(fd, pm->mountpoint, me.mountpoint_path_len))
return -1;
if (write_img_buf(fd, pm->source, me.source_len))
return -1;
if (write_img_buf(fd, pm->options, me.options_len))
return -1; return -1;
return 0; return 0;
...@@ -410,6 +405,7 @@ static int clean_mnt_ns(void) ...@@ -410,6 +405,7 @@ static int clean_mnt_ns(void)
static int populate_mnt_ns(int ns_pid) static int populate_mnt_ns(int ns_pid)
{ {
MntEntry *me = NULL;
int img, ret; int img, ret;
struct mount_info *pms = NULL; struct mount_info *pms = NULL;
...@@ -422,10 +418,9 @@ static int populate_mnt_ns(int ns_pid) ...@@ -422,10 +418,9 @@ static int populate_mnt_ns(int ns_pid)
pr_debug("Reading mountpoint images\n"); pr_debug("Reading mountpoint images\n");
while (1) { while (1) {
struct mnt_entry me;
struct mount_info *pm; struct mount_info *pm;
ret = read_img_eof(img, &me); ret = pb_read_eof(img, &me, mnt_entry);
if (ret <= 0) if (ret <= 0)
break; break;
...@@ -436,33 +431,42 @@ static int populate_mnt_ns(int ns_pid) ...@@ -436,33 +431,42 @@ static int populate_mnt_ns(int ns_pid)
mnt_entry_init(pm); mnt_entry_init(pm);
pm->mnt_id = me.mnt_id; pm->mnt_id = me->mnt_id;
pm->parent_mnt_id = me.parent_mnt_id; pm->parent_mnt_id = me->parent_mnt_id;
pm->s_dev = me.root_dev; pm->s_dev = me->root_dev;
pm->flags = me.flags; pm->flags = me->flags;
pm->fstype = decode_fstype(me.fstype); /* FIXME: abort unsupported early */
/* FIXME: abort unsupported early */
pm->fstype = decode_fstype(me->fstype);
pr_debug("\t\tGetting root for %d\n", pm->mnt_id); pr_debug("\t\tGetting root for %d\n", pm->mnt_id);
if (read_img_str(img, &pm->root, me.root_dentry_len) < 0) pm->root = xstrdup(me->root);
break; if (!pm->root)
return -1;
pr_debug("\t\tGetting mpt for %d\n", pm->mnt_id); pr_debug("\t\tGetting mpt for %d\n", pm->mnt_id);
if (read_img_str(img, &pm->mountpoint, me.mountpoint_path_len) < 0) pm->mountpoint = xstrdup(me->mountpoint);
break; if (!pm->mountpoint)
return -1;
pr_debug("\t\tGetting source for %d\n", pm->mnt_id); pr_debug("\t\tGetting source for %d\n", pm->mnt_id);
if (read_img_str(img, &pm->source, me.source_len) < 0) pm->source = xstrdup(me->source);
break; if (!pm->source)
return -1;
pr_debug("\t\tGetting opts for %d\n", pm->mnt_id); pr_debug("\t\tGetting opts for %d\n", pm->mnt_id);
if (read_img_str(img, &pm->options, me.options_len) < 0) pm->options = xstrdup(me->options);
break; if (!pm->options)
return -1;
pr_debug("\tRead %d mp @ %s\n", pm->mnt_id, pm->mountpoint); pr_debug("\tRead %d mp @ %s\n", pm->mnt_id, pm->mountpoint);
pm->next = pms; pm->next = pms;
pms = pm; pms = pm;
} }
if (me)
mnt_entry__free_unpacked(me, NULL);
close(img); close(img);
pms = mnt_build_tree(pms); pms = mnt_build_tree(pms);
...@@ -493,51 +497,26 @@ int prepare_mnt_ns(int ns_pid) ...@@ -493,51 +497,26 @@ int prepare_mnt_ns(int ns_pid)
void show_mountpoints(int fd, struct cr_options *o) void show_mountpoints(int fd, struct cr_options *o)
{ {
struct mnt_entry me;
char buf[PATH_MAX];
pr_img_head(CR_FD_MOUNTPOINTS); pr_img_head(CR_FD_MOUNTPOINTS);
while (1) { while (1) {
MntEntry *me;
int ret; int ret;
ret = read_img_eof(fd, &me); ret = pb_read_eof(fd, &me, mnt_entry);
if (ret <= 0) if (ret <= 0)
break; break;
pr_msg("%d:%d [%s] ", me.mnt_id, me.parent_mnt_id, pr_msg("%d:%d [%s] ", me->mnt_id, me->parent_mnt_id,
decode_fstype(me.fstype)); decode_fstype(me->fstype));
pr_msg("%d:%d %s ", kdev_major(me->root_dev),
ret = read_img_buf(fd, buf, me.root_dentry_len); kdev_minor(me->root_dev), me->root);
if (ret < 0) pr_msg("@ %s ", me->mountpoint);
break; pr_msg("flags %08x ", me->flags);
pr_msg("dev %s ", me->source);
buf[me.root_dentry_len] = '\0'; pr_msg("options %s\n", me->options);
pr_msg("%d:%d %s ", kdev_major(me.root_dev),
kdev_minor(me.root_dev), buf);
ret = read_img_buf(fd, buf, me.mountpoint_path_len);
if (ret < 0)
break;
buf[me.mountpoint_path_len] = '\0';
pr_msg("@ %s ", buf);
pr_msg("flags %08x ", me.flags);
ret = read_img_buf(fd, buf, me.source_len);
if (ret < 0)
break;
buf[me.source_len] = '\0';
pr_msg("dev %s ", buf);
ret = read_img_buf(fd, buf, me.options_len);
if (ret < 0)
break;
buf[me.options_len] = '\0'; mnt_entry__free_unpacked(me, NULL);
pr_msg("options %s\n", buf);
} }
pr_img_tail(CR_FD_MOUNTPOINTS); pr_img_tail(CR_FD_MOUNTPOINTS);
......
...@@ -34,6 +34,7 @@ PROTO_FILES += pstree.proto ...@@ -34,6 +34,7 @@ PROTO_FILES += pstree.proto
PROTO_FILES += pipe.proto PROTO_FILES += pipe.proto
PROTO_FILES += tcp-stream.proto PROTO_FILES += tcp-stream.proto
PROTO_FILES += sk-packet.proto PROTO_FILES += sk-packet.proto
PROTO_FILES += mnt.proto
HDRS := $(patsubst %.proto,%.pb-c.h,$(PROTO_FILES)) HDRS := $(patsubst %.proto,%.pb-c.h,$(PROTO_FILES))
SRCS := $(patsubst %.proto,%.pb-c.c,$(PROTO_FILES)) SRCS := $(patsubst %.proto,%.pb-c.c,$(PROTO_FILES))
......
message mnt_entry {
required uint32 fstype = 1;
required uint32 mnt_id = 2;
required uint32 root_dev = 3;
required uint32 parent_mnt_id = 4;
required uint32 flags = 5;
required string root = 6;
required string mountpoint = 7;
required string source = 8;
required string options = 9;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment