[CRIU] [PATCH] pipe: don't reopen pipes via /proc, if it's not required
Andrew Vagin
avagin at parallels.com
Mon Mar 18 15:49:51 EDT 2013
On Mon, Mar 18, 2013 at 10:37:06PM +0400, Pavel Emelyanov wrote:
> > @@ -129,6 +131,15 @@ void mark_pipe_master(void)
> >
> > fle = file_master(&pi->d);
> > p = pi;
> > + if (!(pi->pe->flags & O_LARGEFILE)) {
>
> You rely on O_LARGEFILE presence to determine whether or not to reopen a pipe?
A point is reopend for unsharing a file descriptor. So here are two
types of points. One is returned by pipe() and all other ones are
got via opening /proc/PID/fd.
Currently I know only one difference between these types, it's
O_LARGEFILE.
>
> > + if (pi->pe->flags & O_WRONLY) {
> > + if (pw == NULL)
> > + pw = pi;
> > + } else {
> > + if (pr == NULL)
> > + pr = pi;
> > + }
> > + }
> >
> > list_for_each_entry(pic, &pi->pipe_list, pipe_list) {
> > struct fdinfo_list_entry *f;
>
> > @@ -302,6 +339,9 @@ static int open_pipe(struct file_desc *d)
> > close(pfd[!(pi->pe->flags & O_WRONLY)]);
> > tmp = pfd[pi->pe->flags & O_WRONLY];
> >
> > + if (pi->reopen)
> > + tmp = reopen_pipe(tmp, pi->pe->flags, pi);
>
> tmp can be -1 and it's not checked.
Thanks, I will fix.
>
> > +
> > if (rst_file_params(tmp, pi->pe->fown, pi->pe->flags))
> > return -1;
> >
More information about the CRIU
mailing list