• Pavel Tikhomirov's avatar
    mount: remount ro mounts writable before ghost-file restore · fd0a3cd9
    Pavel Tikhomirov authored
    We can have ghost-files on readonly mounts, for them we will need to
    recreate the file on restore, and we can't do that if mount is readonly,
    so the idea is to remount the mount we want to operate on to be writable,
    and later after all ghost-files restored return mounts to their proper
    state if needed.
    
    There are three exceptions, where we don't remount:
    a) Overmounted mounts can't be easily remounted writable, as their
    mountpoints are invisible for us.
    b) If the mount has readonly superblock - there can be no ghost-files on
    such a mount.
    c) When we are in host mntns, we should not remount mounts in it, else
    if we face errors in between we'll forget to remount back.
    
    We have 3 places where we need to add these remount:
    1) create_ghost()
    2) clean_one_remap()
    3) rfi_remap()
    
    For (1) and (2) we can just remount the mount writable without
    remounting it back as they are called in service mntns (the one we save
    in mnt_ns_fd), which will be destroyed with all it's mounts at the end.
    We mark such mounts as remounted in service mntns - REMOUNTED_RW_SERVICE.
    
    For (3) we need to remount these mounts back to readonly so we mark them
    with REMOUNTED_RW and later in remount_readonly_mounts all such mounts
    are re-remounted back.
    
    For (3) we also need to enter proper mntns of tmi before remounting.
    
    These solution v3 is better than v2 as for v2 we added additional
    remount for all bind-readonly mounts, now we do remounts only for
    those having ghost-files restore operations on them. These should be
    quiet a rare thing, so ~3 remounts added for each suitable mount is a
    relatively small price.
    
    note: Also I thought and tried to implement the complete remove of the
    step of remounting back to readonly, but it requires quiet a tricky
    playing with usernsd and only removes one remount (of ~3) for already a
    rare case so I don't thing it worth the effort.
    
    v2: minor commit message cleanup and remove warn
    v4: don't delay, only remount the mounts we explicitly want to write to
    just before operating, rename patch accordingly, reuse
    do_restore_task_mnt_ns, optimize inefficient ns_remount_readonly_mounts,
    and also add another exception.
    v5: simplify child status check, fix log messages and brackets, do not
    drop all flags but only the readonly flag
    Signed-off-by: 's avatarPavel Tikhomirov <ptikhomirov@virtuozzo.com>
    Signed-off-by: 's avatarAndrei Vagin <avagin@gmail.com>
    fd0a3cd9
mount.c 87.7 KB