On Thu, Sep 05, 2019 at 10:06:37AM -0500, Goldwyn Rodrigues wrote:
> -     else if (iomap->flags & IOMAP_F_BUFFER_HEAD)
> +     } else if (iomap->flags & IOMAP_F_COW) {
> +             if (WARN_ON_ONCE(iomap->flags & IOMAP_F_BUFFER_HEAD)) {
> +                     status = -EIO;
> +                     goto out_no_page;
> +             }
> +             if (WARN_ON_ONCE(srcmap->type == IOMAP_HOLE &&
> +                              srcmap->addr != IOMAP_NULL_ADDR)) {

Well, we want HOLES to have IOMAP_NULL_ADDR everywhere, so not sure
why the assert is just here.

> +                     status = -EIO;
> +                     goto out_no_page;
> +             }
> +             status = __iomap_write_begin(inode, pos, len, page, srcmap);
> +     } else if (iomap->flags & IOMAP_F_BUFFER_HEAD) {
>               status = __block_write_begin_int(page, pos, len, NULL, iomap);
> -     else
> +     } else {
>               status = __iomap_write_begin(inode, pos, len, page, iomap);
> +     }

Maybe a good way to structure this is:

        if (iomap->flags & IOMAP_F_BUFFER_HEAD) {
                if (WARN_ON_ONCE(iomap->flags & IOMAP_F_COW)) {
                        status = -EIO;
                        goto out_no_page;
                }
                status = __block_write_begin_int(page, pos, len, NULL, iomap);
        } else {
                status = __iomap_write_begin(inode, pos, len, page,
                                (iomap->flags & IOMAP_F_COW) ?  srcmap : iomap);
        }

Reply via email to