Messages in this thread Patch in this message | | | Date | Tue, 4 Dec 2007 14:00:50 +0100 | From | Nick Piggin <> | Subject | [patch] mm: fix XIP file writes |
| |
On Tue, Dec 04, 2007 at 12:35:49PM +0100, Nick Piggin wrote: > On Tue, Dec 04, 2007 at 03:26:20AM -0800, Andrew Morton wrote: > > On Tue, 4 Dec 2007 12:21:00 +0100 Nick Piggin <npiggin@suse.de> wrote: > > > > > + * > > > + * Cannot support XIP and highmem, because our ->direct_access > > > + * routine for XIP must return memory that is always addressable. > > > + * If XIP was reworked to use pfns and kmap throughout, this > > > + * restriction might be able to be lifted. > > > */ > > > + gfp_flags = GFP_NOIO | __GFP_ZERO; > > > +#ifndef CONFIG_BLK_DEV_XIP > > > + gfp_flags |= __GFP_HIGHMEM; > > > +#endif > > > > A dubious tradeoff? > > On big highmem machines certainly. It may be somewhat useful on small > memory systems... but having the config option there is nice for a VM > developer without an s390 easily available ;) > > But don't apply these XIP patches yet -- after a bit more testing I'm > seeing some data corruption, so I'll have to work out what's going > wrong with that first.
Here we go. See, brd already found a bug ;)
Can you apply the ext2 XIP patch too? And I'll resend the brd XIP patch.
---
Writing to XIP files at a non-page-aligned offset results in data corruption because the writes were always sent to the start of the page.
Signed-off-by: Nick Piggin <npiggin@suse.de> --- Index: linux-2.6/mm/filemap_xip.c =================================================================== --- linux-2.6.orig/mm/filemap_xip.c +++ linux-2.6/mm/filemap_xip.c @@ -314,7 +314,7 @@ __xip_file_write(struct file *filp, cons fault_in_pages_readable(buf, bytes); kaddr = kmap_atomic(page, KM_USER0); copied = bytes - - __copy_from_user_inatomic_nocache(kaddr, buf, bytes); + __copy_from_user_inatomic_nocache(kaddr + offset, buf, bytes); kunmap_atomic(kaddr, KM_USER0); flush_dcache_page(page);
| |