Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7b61cf54 authored by Tao Ma's avatar Tao Ma
Browse files

ocfs2: Add readahead support for CoW.



Add a new function ocfs2_readahead_for_cow so that
we start readahead before we start our CoW.

Signed-off-by: default avatarTao Ma <tao.ma@oracle.com>
parent 15502712
Loading
Loading
Loading
Loading
+24 −0
Original line number Original line Diff line number Diff line
@@ -3398,6 +3398,28 @@ static int ocfs2_replace_cow(struct ocfs2_cow_context *context)
	return ret;
	return ret;
}
}


static void ocfs2_readahead_for_cow(struct inode *inode,
				    struct file *file,
				    u32 start, u32 len)
{
	struct address_space *mapping;
	pgoff_t index;
	unsigned long num_pages;
	int cs_bits = OCFS2_SB(inode->i_sb)->s_clustersize_bits;

	if (!file)
		return;

	mapping = file->f_mapping;
	num_pages = (len << cs_bits) >> PAGE_CACHE_SHIFT;
	if (!num_pages)
		num_pages = 1;

	index = ((loff_t)start << cs_bits) >> PAGE_CACHE_SHIFT;
	page_cache_sync_readahead(mapping, &file->f_ra, file,
				  index, num_pages);
}

/*
/*
 * Starting at cpos, try to CoW write_len clusters.  Don't CoW
 * Starting at cpos, try to CoW write_len clusters.  Don't CoW
 * past max_cpos.  This will stop when it runs into a hole or an
 * past max_cpos.  This will stop when it runs into a hole or an
@@ -3433,6 +3455,8 @@ static int ocfs2_refcount_cow_hunk(struct inode *inode,


	BUG_ON(cow_len == 0);
	BUG_ON(cow_len == 0);


	ocfs2_readahead_for_cow(inode, file, cow_start, cow_len);

	context = kzalloc(sizeof(struct ocfs2_cow_context), GFP_NOFS);
	context = kzalloc(sizeof(struct ocfs2_cow_context), GFP_NOFS);
	if (!context) {
	if (!context) {
		ret = -ENOMEM;
		ret = -ENOMEM;