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

Commit f4e6b498 authored by Fengguang Wu's avatar Fengguang Wu Committed by Linus Torvalds
Browse files

readahead: combine file_ra_state.prev_index/prev_offset into prev_pos



Combine the file_ra_state members
				unsigned long prev_index
				unsigned int prev_offset
into
				loff_t prev_pos

It is more consistent and better supports huge files.

Thanks to Peter for the nice proposal!

[akpm@linux-foundation.org: fix shift overflow]
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: default avatarFengguang Wu <wfg@mail.ustc.edu.cn>
Cc: Rusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 0bb7ba6b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -143,7 +143,7 @@ static int ext3_readdir(struct file * filp,
					sb->s_bdev->bd_inode->i_mapping,
					&filp->f_ra, filp,
					index, 1);
			filp->f_ra.prev_index = index;
			filp->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT;
			bh = ext3_bread(NULL, inode, blk, 0, &err);
		}

+1 −1
Original line number Diff line number Diff line
@@ -142,7 +142,7 @@ static int ext4_readdir(struct file * filp,
					sb->s_bdev->bd_inode->i_mapping,
					&filp->f_ra, filp,
					index, 1);
			filp->f_ra.prev_index = index;
			filp->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT;
			bh = ext4_bread(NULL, inode, blk, 0, &err);
		}

+1 −1
Original line number Diff line number Diff line
@@ -447,7 +447,7 @@ fill_it:
	 */
	while (page_nr < nr_pages)
		page_cache_release(pages[page_nr++]);
	in->f_ra.prev_index = index;
	in->f_ra.prev_pos = (loff_t)index << PAGE_CACHE_SHIFT;

	if (spd.nr_pages)
		return splice_to_pipe(pipe, &spd);
+1 −2
Original line number Diff line number Diff line
@@ -704,8 +704,7 @@ struct file_ra_state {

	unsigned int ra_pages;		/* Maximum readahead window */
	int mmap_miss;			/* Cache miss stat for mmap accesses */
	unsigned long prev_index;	/* Cache last read() position */
	unsigned int prev_offset;	/* Offset where last read() ended in a page */
	loff_t prev_pos;		/* Cache last read() position */
};

/*
+7 −6
Original line number Diff line number Diff line
@@ -879,8 +879,8 @@ void do_generic_mapping_read(struct address_space *mapping,
	cached_page = NULL;
	index = *ppos >> PAGE_CACHE_SHIFT;
	next_index = index;
	prev_index = ra.prev_index;
	prev_offset = ra.prev_offset;
	prev_index = ra.prev_pos >> PAGE_CACHE_SHIFT;
	prev_offset = ra.prev_pos & (PAGE_CACHE_SIZE-1);
	last_index = (*ppos + desc->count + PAGE_CACHE_SIZE-1) >> PAGE_CACHE_SHIFT;
	offset = *ppos & ~PAGE_CACHE_MASK;

@@ -966,7 +966,6 @@ page_ok:
		index += offset >> PAGE_CACHE_SHIFT;
		offset &= ~PAGE_CACHE_MASK;
		prev_offset = offset;
		ra.prev_offset = offset;

		page_cache_release(page);
		if (ret == nr && desc->count)
@@ -1056,7 +1055,9 @@ no_cached_page:

out:
	*_ra = ra;
	_ra->prev_index = prev_index;
	_ra->prev_pos = prev_index;
	_ra->prev_pos <<= PAGE_CACHE_SHIFT;
	_ra->prev_pos |= prev_offset;

	*ppos = ((loff_t)index << PAGE_CACHE_SHIFT) + offset;
	if (cached_page)
@@ -1396,7 +1397,7 @@ retry_find:
	 * Found the page and have a reference on it.
	 */
	mark_page_accessed(page);
	ra->prev_index = page->index;
	ra->prev_pos = (loff_t)page->index << PAGE_CACHE_SHIFT;
	vmf->page = page;
	return ret | VM_FAULT_LOCKED;

Loading