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

opts: Allo to specify the maximum size of ghost files

For example we hit a case where systemd carries journal
file with 4M in size.

https://jira.sw.ru/browse/PSBM-38571Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 1bdb8298
......@@ -176,6 +176,12 @@ In other words, do not use it until really needed.
*--link-remap*::
Allow one to link unlinked files back when possible (modifies FS till *restore*).
*--ghost-limit* 'size'::
Allow one to specify maximum allowed size of deleted file to be carried
inside image files. By default up to 1M file is allowed. It is done in
a sake to not carry big files inside images. 'size' may be postfixed
with 'K', 'M' or 'G' (which stands for kilo, mega and gigabytes accordingly).
*-j*, *--shell-job*::
Allow one to dump shell jobs. This implies the restored task will inherit session and
process group ID from the criu itself. Also this option allows one to migrate a
......
......@@ -60,6 +60,7 @@ void init_opts(void)
opts.cpu_cap = CPU_CAP_DEFAULT;
opts.manage_cgroups = CG_MODE_DEFAULT;
opts.ps_socket = -1;
opts.ghost_limit = DEFAULT_GHOST_LIMIT;
}
static int parse_ns_string(const char *ptr)
......@@ -175,6 +176,17 @@ Esyntax:
return -1;
}
static size_t parse_size(char *optarg)
{
if (index(optarg, 'K'))
return (size_t)KILO(atol(optarg));
else if (index(optarg, 'M'))
return (size_t)MEGA(atol(optarg));
else if (index(optarg, 'G'))
return (size_t)GIGA(atol(optarg));
return (size_t)atol(optarg);
}
int main(int argc, char *argv[], char *envp[])
{
pid_t pid = 0, tree_id = 0;
......@@ -236,6 +248,7 @@ int main(int argc, char *argv[], char *envp[])
{ "enable-external-sharing", no_argument, 0, 1066 },
{ "enable-external-masters", no_argument, 0, 1067 },
{ "freeze-cgroup", required_argument, 0, 1068 },
{ "ghost-limit", required_argument, 0, 1069 },
{ },
};
......@@ -469,6 +482,9 @@ int main(int argc, char *argv[], char *envp[])
case 1068:
opts.freeze_cgroup = optarg;
break;
case 1069:
opts.ghost_limit = parse_size(optarg);
break;
case 'M':
{
char *aux;
......@@ -693,6 +709,7 @@ usage:
" can optionally append @<bridge-name> to OUT for moving\n"
" the outside veth to the named bridge\n"
" --link-remap allow one to link unlinked files back when possible\n"
" --ghost-limit size specify maximum size of deleted file contents to be carried inside an image file\n"
" --action-script FILE add an external action script\n"
" -j|--" OPT_SHELL_JOB " allow one to dump and restore shell jobs\n"
" -l|--" OPT_FILE_LOCKS " handle file locks, for safety, only used for container\n"
......
......@@ -66,12 +66,6 @@ struct link_remap_rlb {
};
static LIST_HEAD(link_remaps);
/*
* This constant is selected without any calculations. Just do not
* want to pick up too big files with us in the image.
*/
#define MAX_GHOST_FILE_SIZE (1 * 1024 * 1024)
static int create_ghost(struct ghost_file *gf, GhostFileEntry *gfe, char *root, struct cr_img *img)
{
int gfd, ghost_flags, ret = -1;
......@@ -423,8 +417,8 @@ static int dump_ghost_remap(char *path, const struct stat *st,
pr_info("Dumping ghost file for fd %d id %#x\n", lfd, id);
if (st->st_size > MAX_GHOST_FILE_SIZE) {
pr_err("Can't dump ghost file %s of %"PRIu64" size\n",
if (st->st_size > opts.ghost_limit) {
pr_err("Can't dump ghost file %s of %"PRIu64" size, increase limit\n",
path, st->st_size);
return -1;
}
......
......@@ -33,6 +33,11 @@ struct cg_root_opt {
#define CG_MODE_DEFAULT (CG_MODE_SOFT)
/*
* Ghost file size we allow to carry by default.
*/
#define DEFAULT_GHOST_LIMIT (1 << 20)
struct cr_options {
int final_state;
char *show_dump_file;
......@@ -81,6 +86,7 @@ struct cr_options {
bool enable_external_masters;
bool aufs; /* auto-deteced, not via cli */
bool overlayfs;
size_t ghost_limit;
};
extern struct cr_options opts;
......
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