Commit c0adf8c3 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Carlos Maiolino
Browse files

iomap: factor out a iomap_last_written_block helper



Split out a pice of logic from iomap_file_buffered_write_punch_delalloc
that is useful for all iomap_end implementations.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarCarlos Maiolino <cem@kernel.org>
parent 0fb823f1
Loading
Loading
Loading
Loading
+2 −11
Original line number Diff line number Diff line
@@ -1280,7 +1280,6 @@ void iomap_file_buffered_write_punch_delalloc(struct inode *inode,
{
	loff_t			start_byte;
	loff_t			end_byte;
	unsigned int		blocksize = i_blocksize(inode);

	if (iomap->type != IOMAP_DELALLOC)
		return;
@@ -1289,16 +1288,8 @@ void iomap_file_buffered_write_punch_delalloc(struct inode *inode,
	if (!(iomap->flags & IOMAP_F_NEW))
		return;

	/*
	 * start_byte refers to the first unused block after a short write. If
	 * nothing was written, round offset down to point at the first block in
	 * the range.
	 */
	if (unlikely(!written))
		start_byte = round_down(pos, blocksize);
	else
		start_byte = round_up(pos + written, blocksize);
	end_byte = round_up(pos + length, blocksize);
	start_byte = iomap_last_written_block(inode, pos, written);
	end_byte = round_up(pos + length, i_blocksize(inode));

	/* Nothing to do if we've written the entire delalloc extent */
	if (start_byte >= end_byte)
+14 −0
Original line number Diff line number Diff line
@@ -256,6 +256,20 @@ static inline const struct iomap *iomap_iter_srcmap(const struct iomap_iter *i)
	return &i->iomap;
}

/*
 * Return the file offset for the first unchanged block after a short write.
 *
 * If nothing was written, round @pos down to point at the first block in
 * the range, else round up to include the partially written block.
 */
static inline loff_t iomap_last_written_block(struct inode *inode, loff_t pos,
		ssize_t written)
{
	if (unlikely(!written))
		return round_down(pos, i_blocksize(inode));
	return round_up(pos + written, i_blocksize(inode));
}

ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *from,
		const struct iomap_ops *ops, void *private);
int iomap_read_folio(struct folio *folio, const struct iomap_ops *ops);