[CRIU] [PATCH 2/3] files-reg: Create ghost files in root directory of a mount

Pavel Emelyanov xemul at parallels.com
Mon Dec 21 02:49:30 PST 2015


>>> @@ -163,6 +175,12 @@ static inline void ghost_path(char *path, int plen,
>>>  		struct reg_file_info *rfi, RemapFilePathEntry *rfe)
>>>  {
>>>  	snprintf(path, plen, "%s.cr.%x.ghost", rfi->path, rfe->remap_id);
>>> +	/*
>>> +	 * We create ghost files in root of mount, to avoid (possible)
>>> +	 * removed intemediate parent directories.
>>> +	 */
>>> +	while ((path = strchr(path, '/')) != NULL)
>>> +		*path = '_';
>>
>> This hunk doesn't turn path into a file in the 'root of the mount', it turns 
>> path into a file in the root of the whole tree.
> 
> Is it OK for you if I replace the comment with "this function replaces '/' with '_'"?
> 
> ghost_file() is used for gf->remap.rpath, which is a relative path in some mount, is
> there exception from this rule?

It's relative path in mount _namespace_, not mount. Thus you create a file
in / of mount namespace and subsequent linkat-s may (should) fail.

>>>  }
>>>  
>>>  static int open_remap_ghost(struct reg_file_info *rfi,
>>> @@ -414,17 +432,18 @@ int prepare_remaps(void)
>>>  	return ret;
>>>  }
>>>  
>>> -static void try_clean_ghost(struct remap_info *ri)
>>> +static void try_clean_ghost(struct ghost_file *gf)
>>>  {
>>>  	char path[PATH_MAX];
>>>  	int mnt_id, ret;
>>>  
>>> -	mnt_id = ri->rfi->rfe->mnt_id; /* rirfirfe %) */
>>> +	mnt_id = gf->remap.rmnt_id;
>>>  	ret = rst_get_mnt_root(mnt_id, path, sizeof(path));
>>>  	if (ret < 0)
>>>  		return;
>>>  
>>> -	ghost_path(path + ret, sizeof(path) - 1, ri->rfi, ri->rfe);
>>> +	sprintf(path + ret, "/%s", gf->remap.rpath);
>>> +
>>>  	if (!unlink(path)) {
>>>  		pr_info(" `- X [%s] ghost\n", path);
>>>  		return;
>>> @@ -437,7 +456,6 @@ static void try_clean_ghost(struct remap_info *ri)
>>>  	 */
>>>  
>>>  	if ((errno == EISDIR)) {
>>> -		strncpy(path + ret, ri->rfi->path, sizeof(path) - 1);
>>>  		if (!rmdir(path)) {
>>>  			pr_info(" `- Xd [%s] ghost\n", path);
>>>  			return;
>>> @@ -449,7 +467,7 @@ static void try_clean_ghost(struct remap_info *ri)
>>>  
>>>  void try_clean_remaps(int ns_fd)
>>>  {
>>> -	struct remap_info *ri;
>>> +	struct ghost_file *gf;
>>>  	int old_ns = -1;
>>>  	int cwd_fd = -1;
>>>  
>>> @@ -479,9 +497,8 @@ void try_clean_remaps(int ns_fd)
>>>  		}
>>>  	}
>>>  
>>> -	list_for_each_entry(ri, &remaps, list)
>>> -		if (ri->rfe->remap_type == REMAP_TYPE__GHOST)
>>> -			try_clean_ghost(ri);
>>> +	list_for_each_entry(gf, &ghost_files, list)
>>> +		try_clean_ghost(gf);
>>
>> How do you avoid calling this on link and pid remaps?
> 
> Could you please explain what you mean? We add a file to &ghost_files list only
> in open_remap_ghost(), which is called for REMAP_TYPE__GHOST only, don't we?

Oops, that's me misreading the patch. You've replaces remaps with ghost_files,
so it's OK.

-- Pavel



More information about the CRIU mailing list