Commit a8a666d6 authored by Zhang Yi's avatar Zhang Yi
Browse files

iomap: add iomap_is_fully_dirty()

hulk inclusion
category: perf
bugzilla: https://gitee.com/openeuler/kernel/issues/IACNS4


CVE: NA

--------------------------------

Add a new helper iomap_is_fully_dirty() to check if all blocks which
correspond to the specified part of a folio are dirty.

Signed-off-by: default avatarZhang Yi <yi.zhang@huawei.com>
parent 0b4d2d8f
Loading
Loading
Loading
Loading
+31 −0
Original line number Diff line number Diff line
@@ -180,6 +180,37 @@ static void iomap_set_range_dirty(struct folio *folio, size_t off, size_t len)
		ifs_set_range_dirty(folio, ifs, off, len);
}

/*
 * iomap_is_fully_dirty checks whether blocks within a folio are
 * dirty or not.
 *
 * Returns true if all blocks which correspond to the specified part
 * of the folio are dirty.
 */
bool iomap_is_fully_dirty(struct folio *folio, size_t from, size_t count)
{
	struct iomap_folio_state *ifs = folio->private;
	struct inode *inode = folio->mapping->host;
	unsigned first, last, i;

	if (!ifs)
		return folio_test_dirty(folio);

	/* Caller's range may extend past the end of this folio */
	count = min(folio_size(folio) - from, count);

	/* First and last blocks in range within folio */
	first = from >> inode->i_blkbits;
	last = (from + count - 1) >> inode->i_blkbits;

	for (i = first; i <= last; i++)
		if (!ifs_block_is_dirty(folio, ifs, i))
			return false;

	return true;
}
EXPORT_SYMBOL_GPL(iomap_is_fully_dirty);

static struct iomap_folio_state *ifs_alloc(struct inode *inode,
		struct folio *folio, unsigned int flags)
{
+1 −0
Original line number Diff line number Diff line
@@ -269,6 +269,7 @@ int iomap_file_buffered_write_punch_delalloc(struct inode *inode,
int iomap_read_folio(struct folio *folio, const struct iomap_ops *ops);
void iomap_readahead(struct readahead_control *, const struct iomap_ops *ops);
bool iomap_is_partially_uptodate(struct folio *, size_t from, size_t count);
bool iomap_is_fully_dirty(struct folio *folio, size_t from, size_t count);
struct folio *iomap_get_folio(struct iomap_iter *iter, loff_t pos, size_t len);
bool iomap_release_folio(struct folio *folio, gfp_t gfp_flags);
void iomap_invalidate_folio(struct folio *folio, size_t offset, size_t len);