[CRIU] [PATCH 3/3] fsnotify: inotify -- Add flushing of criu generated events

Cyrill Gorcunov gorcunov at gmail.com
Wed Sep 3 01:15:17 PDT 2014


On Wed, Sep 03, 2014 at 11:56:12AM +0400, Andrew Vagin wrote:
> On Tue, Sep 02, 2014 at 11:27:21PM +0400, Cyrill Gorcunov wrote:
> > When we restore inotify events we generate own events. So flush them before
> > restored application get control back, otherwise the application may get
> > confused because these events has nothing to do with original application
> > logic.
> > 
> > Note at the moment we call the inotify_flush_events without testing
> > if the descriptor is created with O_NONBLOCK, that's because we know
> > that we're generating events.
> 
> but you call read() in a look, so you will block or I don't understand smth

No, you are correct, we can block, but as a first iteration (you remember that
we've a few more issues in fsnotify code) this version will work for our test
cases. As I said in first email, I'll send fixes on top, once the rest of
issues are resolved. If it cause concerns -- lets drop this patch for a while.

...
> > +static int inotify_flush_events(int inotify_fd, struct fsnotify_file_info *info)
> > +{
> > +	struct inotify_event *event;
> > +	char buf[sizeof(*event) * 8];
> > +	int ret, off;
> > +
> > +	/*
> > +	 * NOTE: It's up to a caller to make @inotify_fd being
> > +	 * created with O_NONBLOCK if needed.
> 
> I don't understand this comment. I think we need to say why we can't
> block here.

The comments says exactly the opposite -- we _might_ block here, thus it's
up to a caller to the function to make sure we won't block.

> 
> > +	 */
> > +	while (1) {
> > +		ret = read(inotify_fd, buf, sizeof(buf));
> 
> You will block here, if inotify_fd isn't in non-block state.
> 
> > +		if (ret < 0) {
> > +			if (errno != EAGAIN) {
> > +				pr_perror("Can't read inotify queue for 0x%08x",
> > +					  info->ife->id);
> > +				return -1;
> > +			} else
> > +				return 0;
> > +		} else if (ret <= 0)
> > +			break;
> 
> if (ret < 0)
> 	pr_perror(...);

It's already here, if errno != EAGAIN.

> >  static int restore_one_inotify(int inotify_fd, struct fsnotify_mark_info *info)
> >  {
> >  	InotifyWdEntry *iwe = info->iwe;
> > @@ -539,6 +619,14 @@ static int open_inotify_fd(struct file_desc *d)
> >  	if (restore_fown(tmp, info->ife->fown))
> >  		close_safe(&tmp);
> >  
> > +	if (tmp >= 0) {
> 
> I don't like this game with close_safe(&tmp). Can we add a error label
> and use goto on error paths?

Sure.


More information about the CRIU mailing list