Yan Zheng
2007-Sep-19 07:58 UTC
[btrfs-devel][patch]handle special case when compute last page's index
Hello, When i_size is multiples of PAGE_CACHE_SIZE, the last page's index computed by the right-shift is larger than the correct value. Regards YZ diff -r d0921c0349a9 extent_map.c --- a/extent_map.c Fri Sep 14 10:23:29 2007 -0400 +++ b/extent_map.c Wed Sep 19 16:50:16 2007 +0800 @@ -1527,6 +1527,11 @@ int extent_write_full_page(struct extent if (page->index == end_index) { size_t offset = i_size & (PAGE_CACHE_SIZE - 1); + if (!offset) { + clear_extent_dirty(tree, start, page_end, GFP_NOFS); + unlock_page(page); + return 0; + } zero_user_page(page, offset, PAGE_CACHE_SIZE - offset, KM_USER0); } diff -r d0921c0349a9 inode.c --- a/inode.c Fri Sep 14 10:23:29 2007 -0400 +++ b/inode.c Wed Sep 19 17:06:20 2007 +0800 @@ -1922,7 +1923,9 @@ int btrfs_defrag_file(struct file *file) mutex_lock(&inode->i_mutex); last_index = inode->i_size >> PAGE_CACHE_SHIFT; - for (i = 0; i <= last_index; i++) { + if (inode->i_size & (PAGE_CACHE_SIZE - 1)) + last_index++; + for (i = 0; i < last_index; i++) { if (i == ra_index) { ra_index = force_ra(inode->i_mapping, &file->f_ra, file, ra_index, last_index);