[CRIU] [PATCH 1/3] mount: Handle deleted bindmounts for regular files

Andrei Vagin avagin at virtuozzo.com
Mon Jan 9 11:31:45 PST 2017


I think you need to dump a content for this file too.

On Wed, Aug 26, 2015 at 05:15:23PM +0300, Cyrill Gorcunov wrote:
> Reported-by: Andrey Wagin <avagin at gmail.com>
> Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
> ---
>  mount.c | 35 ++++++++++++++++++++++++++++++-----
>  1 file changed, 30 insertions(+), 5 deletions(-)
> 
> diff --git a/mount.c b/mount.c
> index 04b99d990bfe..2a2dc7aafc97 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -1970,6 +1970,7 @@ static int do_bind_mount(struct mount_info *mi)
>  {
>  	bool shared = 0;
>  	bool force_private_remount = false;
> +	struct stat st;
>  
>  	if (!mi->need_plugin) {
>  		char *root, *cut_root, rpath[PATH_MAX];
> @@ -1996,9 +1997,26 @@ do_bind:
>  		pr_info("\tBind %s to %s\n", root, mi->mountpoint);
>  
>  		if (unlikely(mi->deleted)) {
> -			if (mkdir(root, 0700)) {
> -				pr_perror("Can't re-create deleted %s\n", root);
> +			if (stat(mi->mountpoint, &st)) {
> +				pr_perror("Can't fetch stat on %s", mi->mountpoint);
>  				return -1;
> +			} else {
> +				if (!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) {
> +					pr_err("Unsupported st_mode 0%o deleted root %s\n",
> +					       (int)st.st_mode, root);
> +					return -1;
> +				}
> +			}
> +			if (S_ISDIR(st.st_mode)) {
> +				if (mkdir(root, 0700)) {
> +					pr_perror("Can't re-create deleted directory %s\n", root);
> +					return -1;
> +				}
> +			} else if (S_ISREG(st.st_mode)) {
> +				if (open(root, O_WRONLY | O_CREAT | O_TRUNC, 0644) < 0) {
> +					pr_perror("Can't re-create deleted file %s\n", root);
> +					return -1;
> +				}
>  			}
>  		}
>  
> @@ -2008,9 +2026,16 @@ do_bind:
>  		}
>  
>  		if (unlikely(mi->deleted)) {
> -			if (rmdir(root)) {
> -				pr_perror("Can't remove deleted %s\n", root);
> -				return -1;
> +			if (S_ISDIR(st.st_mode)) {
> +				if (rmdir(root)) {
> +					pr_perror("Can't remove deleted directory %s\n", root);
> +					return -1;
> +				}
> +			} else if (S_ISREG(st.st_mode)) {
> +				if (unlink(root)) {
> +					pr_perror("Can't unlink deleted file %s\n", root);
> +					return -1;
> +				}
>  			}
>  		}
>  	} else {
> -- 
> 2.4.3
> 


More information about the CRIU mailing list