Index: linux-2.6/mm/filemap_xip.c =================================================================== --- linux-2.6.orig/mm/filemap_xip.c 2007-09-07 17:54:52.000000000 -0700 +++ linux-2.6/mm/filemap_xip.c 2007-09-07 18:05:54.000000000 -0700 @@ -217,15 +217,19 @@ struct inode *inode = mapping->host; struct page *page; pgoff_t size; + pgoff_t pgoff = vmf->pgoff >> mapping_order(mapping); + + vmf->base_page_index = + vmf->pgoff & ((1 << mapping_order(mapping)) -1); /* XXX: are VM_FAULT_ codes OK? */ size = page_cache_next(mapping, i_size_read(inode)); - if (vmf->pgoff >= size) + if (pgoff >= size) return VM_FAULT_SIGBUS; page = mapping->a_ops->get_xip_page(mapping, - vmf->pgoff*(PAGE_SIZE/512), 0); + vmf->pgoff*(page_cache_size(mapping)/512), 0); if (!IS_ERR(page)) goto out; if (PTR_ERR(page) != -ENODATA) @@ -237,7 +241,7 @@ (!(mapping->host->i_sb->s_flags & MS_RDONLY))) { /* maybe shared writable, allocate new block */ page = mapping->a_ops->get_xip_page(mapping, - vmf->pgoff*(PAGE_SIZE/512), 1); + vmf->pgoff*(page_cache_size(mapping)/512), 1); if (IS_ERR(page)) return VM_FAULT_SIGBUS; /* unmap page at pgoff from all other vmas */