On 10:13 05/08, Dave Chinner wrote: > On Fri, Aug 02, 2019 at 05:00:40PM -0500, Goldwyn Rodrigues wrote: > > From: Goldwyn Rodrigues <rgoldwyn@xxxxxxxx> > > > > Set iomap->type to IOMAP_COW and fill up the source map in case > > the I/O is not page aligned. > ..... > > static void btrfs_buffered_page_done(struct inode *inode, loff_t pos, > > unsigned copied, struct page *page, > > struct iomap *iomap) > > @@ -188,6 +217,7 @@ static int btrfs_buffered_iomap_begin(struct inode *inode, loff_t pos, > > int ret; > > size_t write_bytes = length; > > struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb); > > + size_t end; > > size_t sector_offset = pos & (fs_info->sectorsize - 1); > > struct btrfs_iomap *bi; > > > > @@ -255,6 +285,17 @@ static int btrfs_buffered_iomap_begin(struct inode *inode, loff_t pos, > > iomap->private = bi; > > iomap->length = round_up(write_bytes, fs_info->sectorsize); > > iomap->offset = round_down(pos, fs_info->sectorsize); > > + end = pos + write_bytes; > > + /* Set IOMAP_COW if start/end is not page aligned */ > > + if (((pos & (PAGE_SIZE - 1)) || (end & (PAGE_SIZE - 1)))) { > > + iomap->type = IOMAP_COW; > > + ret = get_iomap(inode, pos, length, srcmap); > > + if (ret < 0) > > + goto release; > > I suspect you didn't test this case, because.... > > > + } else { > > + iomap->type = IOMAP_DELALLOC; > > + } > > + > > iomap->addr = IOMAP_NULL_ADDR; > > iomap->type = IOMAP_DELALLOC; > > The iomap->type is overwritten here and so IOMAP_COW will never be > seen by the iomap infrastructure... Yes, thats correct. I will fix this. -- Goldwyn