[CRIU] [PATCH 7/9] mounts: if a mount can't be mounted, it is queued in postpone list

Andrew Vagin avagin at parallels.com
Mon Jul 15 03:25:50 EDT 2013


On Tue, Jul 09, 2013 at 08:44:07PM +0400, Pavel Emelyanov wrote:
> On 07/09/2013 03:05 PM, Andrey Vagin wrote:
> > Try to restore mounts while a postpone list isn't empty and check
> > that each iteration has some progress, otherwice it will fails for
> > preventing infinite loops
> > 
> > Signed-off-by: Andrey Vagin <avagin at openvz.org>
> > ---
> >  include/proc_parse.h |  2 ++
> >  mount.c              | 40 ++++++++++++++++++++++++++++++++++++----
> >  2 files changed, 38 insertions(+), 4 deletions(-)
> > 
> > diff --git a/include/proc_parse.h b/include/proc_parse.h
> > index 1325424..85bde36 100644
> > --- a/include/proc_parse.h
> > +++ b/include/proc_parse.h
> > @@ -123,6 +123,8 @@ struct mount_info {
> >  	struct list_head mnt_slave_list;/* list of slave mounts */
> >  	struct list_head mnt_slave;	/* slave list entry */
> >  	struct mount_info *mnt_master;	/* slave is on master->mnt_slave_list */
> > +
> > +	struct list_head postpone;
> >  };
> >  
> >  struct proc_posix_timer {
> > diff --git a/mount.c b/mount.c
> > index 0609ded..fae9513 100644
> > --- a/mount.c
> > +++ b/mount.c
> > @@ -533,12 +533,25 @@ int dump_mnt_ns(int ns_pid, struct cr_fdset *fdset)
> >  	return 0;
> >  }
> >  
> > -#define MNT_TREE_WALK(_r, _el, _fn_f, _fn_r) do {				\
> > +static int mount_progress;
> > +
> > +#define MNT_TREE_WALK(_r, _el, _fn_f, _fn_r, _plist) do {			\
> >  		struct mount_info *_mi = _r;					\
> >  										\
> >  		while (1) {							\
> > -			if (_fn_f(_mi))						\
> > +			int ret;						\
> > +										\
> > +			ret = _fn_f(_mi);					\
> > +			if (ret < 0)						\
> >  				return -1;					\
> > +			else if (ret > 0) {					\
> > +				list_add_tail(&_mi->postpone, _plist);		\
> 
> _plist can be NULL here, can't it?

No, it can't.

For example clean_mnt_ns sets _plist = NULL, but _fn_f always returns 0
in this case.

> 


More information about the CRIU mailing list