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);

_______________________________________________
Btrfs-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/btrfs-devel

Reply via email to