[CRIU] [PATCH 2/7] files: Add fill_fdlink helper

Cyrill Gorcunov gorcunov at openvz.org
Thu May 9 15:21:43 EDT 2013


On Thu, May 09, 2013 at 11:15:51PM +0400, Pavel Emelyanov wrote:
> On 05/09/2013 10:49 PM, Cyrill Gorcunov wrote:
> > On Thu, May 09, 2013 at 09:51:51PM +0400, Pavel Emelyanov wrote:
> >>>  
> >>> -	if (S_ISREG(p.stat.st_mode) || S_ISDIR(p.stat.st_mode))
> >>> +	if (S_ISREG(p.stat.st_mode) || S_ISDIR(p.stat.st_mode)) {
> >>> +		char path[PATH_MAX + 1];
> >>> +
> >>> +		p.nmlink = path;
> >>> +		p.nmsize = sizeof(path);
> >>> +
> >>> +		if (fill_fdlink(lfd, &p)) {
> >>> +			pr_err("Can't fill fdlink params\n");
> >>> +			return -1;
> >>> +		}
> >>> +
> >>>  		return dump_reg_file(&p, lfd, fdinfo);
> >>
> >> dump_reg_file will end up calling dump_one_reg_file, which in turn, will
> >> call read_fd_link, so why calling one here via a wrapper?
> > 
> > This read_fd_link will be called in dump_one_reg_file only if the caller
> > is not here (we call dump_one_reg_file for mm_exe and other special files).
> > So to not call read_fd_link twice this optimisation is done.
> 
> Why not call it _only_ in the deepest function, i.e. dump_one_reg_file?

Because I'll need to analyze the name first and call the appropriate dupmer
later. I guess it's not clean from patch itself. Letme show the final code

	if (S_ISREG(p.stat.st_mode) || S_ISDIR(p.stat.st_mode)) {
		struct ns_proc_entry found;
		char path[PATH_MAX + 1];

		p.nmlink = path;
		p.nmsize = sizeof(path);

		if (fill_fdlink(lfd, &p)) {
			pr_err("Can't fill fdlink params\n");
			return -1;
		}

Here we read link first, because the name will be needed in two
places

		/*
		 * Regular file might be a reference to proc namespace
		 * entry thus choose which strategy to dump it with.
		 */
		if (parse_ns_proc(&p.nmlink[1], p.nmsize - 1, &found) == 0) {
			p.arg = &found;
			return dump_ns_file(&p, lfd, fdinfo);
		}

If the name was found to be ns reference, we pass it to dump_ns_file

		return dump_reg_file(&p, lfd, fdinfo);

Otherwise we pass it to dump_reg_file. Thus we read the link only once
at top level.
	}



More information about the CRIU mailing list