diff -u linux-2.5.46-ioe/fs/aio.c linux-2.5.46-ioe/fs/aio.c --- linux-2.5.46-ioe/fs/aio.c Thu Nov 7 09:40:17 2002 +++ linux-2.5.46-ioe/fs/aio.c Thu Nov 7 09:30:49 2002 @@ -149,7 +149,7 @@ dprintk("mmap address: 0x%08lx\n", info->mmap_base); info->nr_pages = get_user_pages(current, ctx->mm, info->mmap_base, nr_pages, - 1, 0, info->ring_pages, NULL); + 1, 0, info->ring_pages); up_write(&ctx->mm->mmap_sem); if (unlikely(info->nr_pages != nr_pages)) { diff -u linux-2.5.46-ioe/include/linux/mm.h linux-2.5.46-ioe/include/linux/mm.h --- linux-2.5.46-ioe/include/linux/mm.h Thu Nov 7 09:40:17 2002 +++ linux-2.5.46-ioe/include/linux/mm.h Thu Nov 7 09:25:28 2002 @@ -413,7 +413,7 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start, int len, int write, int force, - struct page **pages, struct vm_area_struct **vmas); + struct page **pages); int __set_page_dirty_buffers(struct page *page); int __set_page_dirty_nobuffers(struct page *page); diff -u linux-2.5.46-ioe/kernel/ptrace.c linux-2.5.46-ioe/kernel/ptrace.c --- linux-2.5.46-ioe/kernel/ptrace.c Thu Nov 7 09:40:17 2002 +++ linux-2.5.46-ioe/kernel/ptrace.c Thu Nov 7 09:29:07 2002 @@ -146,7 +146,7 @@ /* * Access another process' address space. * Source/target buffer must be kernel space, - * Do not walk the page table directly, use get_user_pages + * Do not walk the page table directly, use get_one_user_page. */ int access_process_vm(struct task_struct *tsk, unsigned long addr, void *buf, int len, int write) diff -u linux-2.5.46-ioe/mm/memory.c linux-2.5.46-ioe/mm/memory.c --- linux-2.5.46-ioe/mm/memory.c Thu Nov 7 09:40:17 2002 +++ linux-2.5.46-ioe/mm/memory.c Thu Nov 7 09:28:02 2002 @@ -567,70 +567,6 @@ return -PTR_ERR(page); } -#define OBSOLETE_PAGE_WALKER -#ifdef OBSOLETE_PAGE_WALKER -/* Obsolete page walk handler adding pages and vmas to a list of them */ -struct gup_add_pv { - unsigned int page_count; - unsigned int max_pages; - struct page **pages; - unsigned int vma_count; - unsigned int max_vmas; - struct vm_area_struct **vmas; -}; - -static inline void gup_pv_cleanup(struct gup_add_pv *gup) -{ - while (gup->page_count--) { - page_cache_release(gup->pages[gup->page_count]); - } -} - -/* Follows custom_page_walker API description */ -static int gup_add_pv(struct vm_area_struct *vma, struct page *page, - unsigned long virt_addr, void *customdata) -{ - - struct gup_add_pv *gup = customdata; - int ret = 0; - - BUG_ON(!customdata); - - if (!IS_ERR(page)) { - if (gup->vmas) { - /* Add vma only, if its a new one. Since we walk them - * uniquely, this simple check is enough. -ioe - */ - if (!gup->vma_count - || gup->vmas[gup->vma_count - 1] != vma) { - gup->vmas[gup->vma_count++] = vma; - - /* Abort scanning, if we cannot hold more */ - if (gup->vma_count == gup->max_vmas) - ret = 1; - } - } - - if (gup->pages) { - gup->pages[gup->page_count++] = page; - flush_dcache_page(page); - if (!PageReserved(page)) - page_cache_get(page); - - /* Abort scanning, if we cannot hold more */ - if (gup->page_count == gup->max_pages) - ret = 1; - } - return ret; - } - - if (!IS_ERR(vma)) - spin_unlock(&vma->vm_mm->page_table_lock); - gup_pv_cleanup(gup); - return -PTR_ERR(page); -} -#endif /* OBSOLETE_PAGE_WALKER */ - /* Try to fault in the page at START. Returns valid page or ERR_PTR(). * * called with mm->page_table_lock held @@ -775,50 +711,33 @@ } -/* Ugly for now, but the defines and the union will go later. -ioe */ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm, unsigned long start, int len, int write, int force, - struct page **pages, struct vm_area_struct **vmas) + struct page **pages) { int ret; custom_page_walker_t walker = gup_add_pages; - union { - struct gup_add_pages pg; -#ifdef OBSOLETE_PAGE_WALKER - struct gup_add_pv pv; -#endif - } gup_u; + struct gup_add_pages gup; - memset(&gup_u, 0, sizeof (gup_u)); + memset(&gup, 0, sizeof (gup)); -#ifdef OBSOLETE_PAGE_WALKER - if (vmas) { - gup_u.pv.vmas = vmas; - gup_u.pv.max_vmas = len; - walker = gup_add_pv; - printk("Obsolete argument \"vmas\" used!" - " Please send this report to linux-mm@vger.kernel.org" - " or fix the caller. Stack trace follows...\n"); - WARN_ON(vmas); - } -#else - /* FIXME: Or should we simply ignore it? -ioe */ - BUG_ON(vmas); -#endif - - /* Warn on non-sense calls, but process them. -ioe */ - WARN_ON(!vmas && !pages); if (pages) { - gup_u.pg.max_pages = len; - gup_u.pg.pages = pages; + gup.max_pages = len; + gup.pages = pages; + } else { + /* Warn on non-sense calls, but process them. + * The user should use a custom page walker for this. + * Look at gup_mk_present() for an example. -ioe + */ + WARN_ON(!pages); } - ret = walk_user_pages(tsk, mm, start, write, force, walker, &gup_u); + ret = walk_user_pages(tsk, mm, start, write, force, walker, &gup); if (ret == 0) { - ret = gup_u.pg.count; + ret = gup.count; } return ret; } diff -u linux-2.5.46-ioe/fs/nfs/direct.c linux-2.5.46-ioe/fs/nfs/direct.c --- linux-2.5.46/fs/nfs/direct.c Sat Oct 19 06:02:29 2002 +++ linux-2.5.46-ioe/fs/nfs/direct.c Thu Nov 7 09:31:31 2002 @@ -69,8 +69,7 @@ if (*pages) { down_read(¤t->mm->mmap_sem); result = get_user_pages(current, current->mm, addr, - page_count, (rw == WRITE), 0, - *pages, NULL); + page_count, (rw == WRITE), 0, *pages); up_read(¤t->mm->mmap_sem); if (result < 0) printk(KERN_ERR "%s: get_user_pages result %d\n", diff -u linux-2.5.46-ioe/fs/direct-io.c linux-2.5.46-ioe/fs/direct-io.c --- linux-2.5.46/fs/direct-io.c Tue Nov 5 21:32:53 2002 +++ linux-2.5.46-ioe/fs/direct-io.c Thu Nov 7 09:32:57 2002 @@ -127,8 +127,7 @@ nr_pages, /* How many pages? */ dio->rw == READ, /* Write to memory? */ 0, /* force (?) */ - &dio->pages[0], - NULL); /* vmas */ + &dio->pages[0]); up_read(¤t->mm->mmap_sem); if (ret < 0 && dio->blocks_available && (dio->rw == WRITE)) { diff -u linux-2.5.46-ioe/fs/bio.c linux-2.5.46-ioe/fs/bio.c --- linux-2.5.46/fs/bio.c Tue Nov 5 21:32:45 2002 +++ linux-2.5.46-ioe/fs/bio.c Thu Nov 7 09:32:23 2002 @@ -485,7 +485,7 @@ down_read(¤t->mm->mmap_sem); ret = get_user_pages(current, current->mm, uaddr, nr_pages, - write_to_vm, 0, pages, NULL); + write_to_vm, 0, pages); up_read(¤t->mm->mmap_sem); if (ret < nr_pages) diff -u linux-2.5.46-ioe/drivers/scsi/st.c linux-2.5.46-ioe/drivers/scsi/st.c --- linux-2.5.46/drivers/scsi/st.c Tue Nov 5 21:32:53 2002 +++ linux-2.5.46-ioe/drivers/scsi/st.c Thu Nov 7 09:35:03 2002 @@ -4030,6 +4030,7 @@ return -ENOMEM; /* Try to fault in all of the necessary pages */ + /* TODO: Use custom page walker for these later. -ioe */ down_read(¤t->mm->mmap_sem); /* rw==READ means read from drive, write into memory area */ res = get_user_pages( @@ -4039,8 +4040,7 @@ nr_pages, rw == READ, 0, /* don't force */ - pages, - NULL); + pages); up_read(¤t->mm->mmap_sem); /* Errors and no page mapped should return here */ diff -u linux-2.5.46-ioe/drivers/scsi/sg.c linux-2.5.46-ioe/drivers/scsi/sg.c --- linux-2.5.46/drivers/scsi/sg.c Tue Nov 5 21:32:53 2002 +++ linux-2.5.46-ioe/drivers/scsi/sg.c Thu Nov 7 09:35:25 2002 @@ -1767,6 +1767,7 @@ return -ENOMEM; /* Try to fault in all of the necessary pages */ + /* TODO: Use custom page walker for these later. -ioe */ down_read(¤t->mm->mmap_sem); /* rw==READ means read from drive, write into memory area */ res = get_user_pages( @@ -1776,8 +1777,7 @@ nr_pages, rw == READ, 0, /* don't force */ - pages, - NULL); + pages); up_read(¤t->mm->mmap_sem); /* Errors and no page mapped should return here */ diff -u linux-2.5.46-ioe/drivers/media/video-buf.c linux-2.5.46-ioe/drivers/media/video-buf.c --- linux-2.5.46/drivers/media/video/video-buf.c Tue Nov 5 21:32:53 2002 +++ linux-2.5.46-ioe/drivers/media/video/video-buf.c Thu Nov 7 09:33:37 2002 @@ -170,7 +170,7 @@ err = get_user_pages(current,current->mm, data & PAGE_MASK, dma->nr_pages, rw == READ, 1, /* force */ - dma->pages, NULL); + dma->pages); up_read(¤t->mm->mmap_sem); if (err != dma->nr_pages) { dma->nr_pages = (err >= 0) ? err : 0;