[CRIU] [PATCH 3/4] mount: add support for external block devices (v3)
Pavel Emelyanov
xemul at virtuozzo.com
Fri Apr 22 09:01:22 PDT 2016
On 04/22/2016 06:48 PM, Andrew Vagin wrote:
> On Fri, Apr 22, 2016 at 04:49:48PM +0300, Pavel Emelyanov wrote:
>> On 04/22/2016 09:12 AM, Andrey Vagin wrote:
>>> From: Andrew Vagin <avagin at virtuozzo.com>
>>>
>>> The idea is to allow to dump and restore mounts of
>>> a specified block device.
>>>
>>> Options:
>>> dump: --ext-mount-map dev[MAJOR:MINOR]:VAL
>>
>> Why dev[MAJOR:MINOR]? Isn't just path (which is a mountpoint) enough?
>
> We don't know where this device is mounted, we know that this device
> may be mounted somewhere in a container.
OK, then this is not the case for --ext-mount-map option :(
Let's step back a little. Which error do we hit when dumping this mount option?
> In OpenVZ we can grant permissions to mount a block device in a
> container. And a user of CT decides where to mount this device.
>
>>
>>> restore: --ext-mount-map VAL:DEVPATH
>>>
>>> If we find a mount with a specified block device, we
>>> set its type into FSTYPE__AUTO and write VAL into
>>> the "source" field.
>>>
>>> VAL is replaced on DEVPATH on restore.
>>>
>>> https://jira.sw.ru/browse/PSBM-39381
>>>
>>> v2: use --ext-mount-map instead of --external on dump
>>> v3: clean up
>>>
>>> Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
>>> ---
>>> Documentation/criu.txt | 6 +++---
>>> criu/mount.c | 35 +++++++++++++++++++++++++++++------
>>> 2 files changed, 32 insertions(+), 9 deletions(-)
>>>
>>> diff --git a/Documentation/criu.txt b/Documentation/criu.txt
>>> index 1982f5d..07da757 100644
>>> --- a/Documentation/criu.txt
>>> +++ b/Documentation/criu.txt
>>> @@ -176,9 +176,9 @@ In other words, do not use it until really needed.
>>> where locks are not holed by someone outside of it.
>>>
>>> *-M*, *--ext-mount-map* '<KEY>'*:*'<VAL>'::
>>> - Setup mapping for external mounts. '<KEY>' is a mountpoint inside container
>>> - and corresponding '<VAL>' is a string that will be written into the image
>>> - as mountpoint\'s root value.
>>> + Setup mapping for external mounts. '<KEY>' is a mountpoint or a device
>>> + (dev[maj:min]]) inside container and corresponding '<VAL>' is a string
>>> + that will be written into the image as mountpoint\'s root or source value.
>>>
>>> *--link-remap*::
>>> Allow one to link unlinked files back when possible (modifies FS till *restore*).
>>> diff --git a/criu/mount.c b/criu/mount.c
>>> index f57b10c..f8d0cc2 100644
>>> --- a/criu/mount.c
>>> +++ b/criu/mount.c
>>> @@ -40,6 +40,8 @@
>>> #undef LOG_PREFIX
>>> #define LOG_PREFIX "mnt: "
>>>
>>> +static struct fstype fstypes[];
>>> +
>>> int ext_mount_add(char *key, char *val)
>>> {
>>> struct ext_mount *em;
>>> @@ -487,15 +489,31 @@ static void mnt_tree_show(struct mount_info *tree, int off)
>>> static int try_resolve_ext_mount(struct mount_info *info)
>>> {
>>> struct ext_mount *em;
>>> + char devstr[64];
>>>
>>> em = ext_mount_lookup(info->mountpoint + 1 /* trim the . */);
>>> - if (em == NULL)
>>> - return -ENOTSUP;
>>> + if (em) {
>>> + pr_info("Found %s mapping for %s mountpoint\n",
>>> + em->val, info->mountpoint);
>>> + info->external = em;
>>> + return 0;
>>> + }
>>>
>>> - pr_info("Found %s mapping for %s mountpoint\n",
>>> - em->val, info->mountpoint);
>>> - info->external = em;
>>> - return 0;
>>> + snprintf(devstr, sizeof(devstr), "dev[%d/%d]",
>>> + kdev_major(info->s_dev), kdev_minor(info->s_dev));
>>> +
>>> + if (info->fstype->code == FSTYPE__UNSUPPORTED) {
>>> + em = ext_mount_lookup(devstr);
>>> + if (em) {
>>> + info->fstype = &fstypes[1];
>>> + BUG_ON(info->fstype->code != FSTYPE__AUTO);
>>> + xfree(info->source);
>>> + info->source = xstrdup(em->val);
>>> + return 0;
>>> + }
>>> + }
>>> +
>>> + return -ENOTSUP;
>>> }
>>>
>>> static struct mount_info *find_widest_shared(struct mount_info *m)
>>> @@ -2091,6 +2109,11 @@ static char *resolve_source(struct mount_info *mi)
>>>
>>> if (mi->fstype->code == FSTYPE__AUTO) {
>>> struct stat st;
>>> + struct ext_mount *key;
>>> +
>>> + key = ext_mount_lookup(mi->source);
>>> + if (key)
>>> + return key->val;
>>>
>>> if (!stat(mi->source, &st) && S_ISBLK(st.st_mode) &&
>>> major(st.st_rdev) == kdev_major(mi->s_dev) &&
>>>
>>
> .
>
More information about the CRIU
mailing list