On Wed 26-07-17 13:55:36, Jeff Layton wrote:
> +int file_write_and_wait(struct file *file)
> +{
> +     int err = 0, err2;
> +     struct address_space *mapping = file->f_mapping;
> +
> +     if ((!dax_mapping(mapping) && mapping->nrpages) ||
> +         (dax_mapping(mapping) && mapping->nrexceptional)) {
> +             err = filemap_fdatawrite(mapping);
> +             /* See comment of filemap_write_and_wait() */
> +             if (err != -EIO) {
> +                     loff_t i_size = i_size_read(mapping->host);
> +
> +                     if (i_size != 0)
> +                             __filemap_fdatawait_range(mapping, 0,
> +                                                       i_size - 1);
> +             }
> +     }

Err, what's the i_size check doing here? I'd just pass ~0 as the end of the
range and ignore i_size. It is much easier than trying to wrap your head
around possible races with file operations modifying i_size.

                                                                Honza
-- 
Jan Kara <j...@suse.com>
SUSE Labs, CR

Reply via email to