mirror of
https://git.proxmox.com/git/mirror_lxc
synced 2025-08-16 12:45:10 +00:00
lvm: Updates lvcreate to wipe signatures if supported, fallbacks to old command if not.
Signed-off-by: tomponline <tomp@tomp.uk>
This commit is contained in:
parent
ae6497d0c0
commit
99a8edfc3a
@ -55,6 +55,7 @@ struct lvcreate_args {
|
|||||||
const char *lv;
|
const char *lv;
|
||||||
const char *thinpool;
|
const char *thinpool;
|
||||||
const char *fstype;
|
const char *fstype;
|
||||||
|
bool sigwipe;
|
||||||
|
|
||||||
/* snapshot specific arguments */
|
/* snapshot specific arguments */
|
||||||
const char *source_lv;
|
const char *source_lv;
|
||||||
@ -76,12 +77,19 @@ static int lvm_create_exec_wrapper(void *data)
|
|||||||
|
|
||||||
(void)setenv("LVM_SUPPRESS_FD_WARNINGS", "1", 1);
|
(void)setenv("LVM_SUPPRESS_FD_WARNINGS", "1", 1);
|
||||||
if (args->thinpool)
|
if (args->thinpool)
|
||||||
execlp("lvcreate", "lvcreate", "-qq", "--thinpool", args->thinpool,
|
if(args->sigwipe)
|
||||||
"-V", args->size, args->vg, "-n", args->lv,
|
execlp("lvcreate", "lvcreate", "-Wy", "--yes", "--thinpool", args->thinpool,
|
||||||
(char *)NULL);
|
"-V", args->size, args->vg, "-n", args->lv, (char *)NULL);
|
||||||
|
else
|
||||||
|
execlp("lvcreate", "lvcreate", "-qq", "--thinpool", args->thinpool,
|
||||||
|
"-V", args->size, args->vg, "-n", args->lv, (char *)NULL);
|
||||||
else
|
else
|
||||||
execlp("lvcreate", "lvcreate", "-qq", "-L", args->size, args->vg, "-n",
|
if(args->sigwipe)
|
||||||
args->lv, (char *)NULL);
|
execlp("lvcreate", "lvcreate", "-Wy", "--yes", "-L", args->size, args->vg, "-n",
|
||||||
|
args->lv, (char *)NULL);
|
||||||
|
else
|
||||||
|
execlp("lvcreate", "lvcreate", "-qq", "-L", args->size, args->vg, "-n",
|
||||||
|
args->lv, (char *)NULL);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -177,11 +185,22 @@ static int do_lvm_create(const char *path, uint64_t size, const char *thinpool)
|
|||||||
cmd_args.vg = vg;
|
cmd_args.vg = vg;
|
||||||
cmd_args.lv = lv;
|
cmd_args.lv = lv;
|
||||||
cmd_args.size = sz;
|
cmd_args.size = sz;
|
||||||
|
cmd_args.sigwipe = true;
|
||||||
TRACE("Creating new lvm storage volume \"%s\" on volume group \"%s\" "
|
TRACE("Creating new lvm storage volume \"%s\" on volume group \"%s\" "
|
||||||
"of size \"%s\"", lv, vg, sz);
|
"of size \"%s\"", lv, vg, sz);
|
||||||
ret = run_command(cmd_output, sizeof(cmd_output),
|
ret = run_command_status(cmd_output, sizeof(cmd_output),
|
||||||
lvm_create_exec_wrapper, (void *)&cmd_args);
|
lvm_create_exec_wrapper, (void *)&cmd_args);
|
||||||
if (ret < 0) {
|
|
||||||
|
/* If lvcreate is old and doesn't support signature wiping, try again without it.
|
||||||
|
* Test for exit code EINVALID_CMD_LINE(3) of lvcreate command.
|
||||||
|
*/
|
||||||
|
if (WIFEXITED(ret) && WEXITSTATUS(ret) == 3) {
|
||||||
|
cmd_args.sigwipe = false;
|
||||||
|
ret = run_command(cmd_output, sizeof(cmd_output),
|
||||||
|
lvm_create_exec_wrapper, (void *)&cmd_args);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
ERROR("Failed to create logical volume \"%s\": %s", lv,
|
ERROR("Failed to create logical volume \"%s\": %s", lv,
|
||||||
cmd_output);
|
cmd_output);
|
||||||
free(pathdup);
|
free(pathdup);
|
||||||
|
@ -1594,7 +1594,7 @@ pop_stack:
|
|||||||
return umounts;
|
return umounts;
|
||||||
}
|
}
|
||||||
|
|
||||||
int run_command(char *buf, size_t buf_size, int (*child_fn)(void *), void *args)
|
int run_command_internal(char *buf, size_t buf_size, int (*child_fn)(void *), void *args, bool wait_status)
|
||||||
{
|
{
|
||||||
pid_t child;
|
pid_t child;
|
||||||
int ret, fret, pipefd[2];
|
int ret, fret, pipefd[2];
|
||||||
@ -1651,13 +1651,27 @@ int run_command(char *buf, size_t buf_size, int (*child_fn)(void *), void *args)
|
|||||||
buf[bytes - 1] = '\0';
|
buf[bytes - 1] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
fret = wait_for_pid(child);
|
if (wait_status)
|
||||||
|
fret = lxc_wait_for_pid_status(child);
|
||||||
|
else
|
||||||
|
fret = wait_for_pid(child);
|
||||||
|
|
||||||
/* close the read-end of the pipe */
|
/* close the read-end of the pipe */
|
||||||
close(pipefd[0]);
|
close(pipefd[0]);
|
||||||
|
|
||||||
return fret;
|
return fret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int run_command(char *buf, size_t buf_size, int (*child_fn)(void *), void *args)
|
||||||
|
{
|
||||||
|
return run_command_internal(buf, buf_size, child_fn, args, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
int run_command_status(char *buf, size_t buf_size, int (*child_fn)(void *), void *args)
|
||||||
|
{
|
||||||
|
return run_command_internal(buf, buf_size, child_fn, args, true);
|
||||||
|
}
|
||||||
|
|
||||||
bool lxc_nic_exists(char *nic)
|
bool lxc_nic_exists(char *nic)
|
||||||
{
|
{
|
||||||
#define __LXC_SYS_CLASS_NET_LEN 15 + IFNAMSIZ + 1
|
#define __LXC_SYS_CLASS_NET_LEN 15 + IFNAMSIZ + 1
|
||||||
|
@ -201,6 +201,21 @@ extern int lxc_unstack_mountpoint(const char *path, bool lazy);
|
|||||||
extern int run_command(char *buf, size_t buf_size, int (*child_fn)(void *),
|
extern int run_command(char *buf, size_t buf_size, int (*child_fn)(void *),
|
||||||
void *args);
|
void *args);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* run_command runs a command and collect it's std{err,out} output in buf, returns exit status.
|
||||||
|
*
|
||||||
|
* @param[out] buf The buffer where the commands std{err,out] output will be
|
||||||
|
* read into. If no output was produced, buf will be memset
|
||||||
|
* to 0.
|
||||||
|
* @param[in] buf_size The size of buf. This function will reserve one byte for
|
||||||
|
* \0-termination.
|
||||||
|
* @param[in] child_fn The function to be run in the child process. This
|
||||||
|
* function must exec.
|
||||||
|
* @param[in] args Arguments to be passed to child_fn.
|
||||||
|
*/
|
||||||
|
extern int run_command_status(char *buf, size_t buf_size, int (*child_fn)(void *),
|
||||||
|
void *args);
|
||||||
|
|
||||||
/* Concatenate all passed-in strings into one path. Do not fail. If any piece
|
/* Concatenate all passed-in strings into one path. Do not fail. If any piece
|
||||||
* is not prefixed with '/', add a '/'.
|
* is not prefixed with '/', add a '/'.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user