diff options
author | davem <davem> | 2000-11-10 04:49:55 +0000 |
---|---|---|
committer | davem <davem> | 2000-11-10 04:49:55 +0000 |
commit | bcd3d5bc9fed440baa7c78cd364854217a65f076 (patch) | |
tree | c5338036d216eb32ad557566d6f9bc2b1e548afe /mm | |
parent | 1ad3821307f26493d13aa70673ea98e8be1f9a29 (diff) | |
download | netdev-vger-cvs-bcd3d5bc9fed440baa7c78cd364854217a65f076.tar.gz |
Merge mainline to test11-pre2.
Diffstat (limited to 'mm')
-rw-r--r-- | mm/filemap.c | 9 | ||||
-rw-r--r-- | mm/highmem.c | 21 | ||||
-rw-r--r-- | mm/vmalloc.c | 22 |
3 files changed, 31 insertions, 21 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 96fa0710a..55d3fcfe3 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -1095,14 +1095,14 @@ no_cached_page: static int file_read_actor(read_descriptor_t * desc, struct page *page, unsigned long offset, unsigned long size) { - unsigned long kaddr; + char *kaddr; unsigned long left, count = desc->count; if (size > count) size = count; kaddr = kmap(page); - left = __copy_to_user(desc->buf, (void *)(kaddr + offset), size); + left = __copy_to_user(desc->buf, kaddr + offset, size); kunmap(page); if (left) { @@ -1146,7 +1146,7 @@ ssize_t generic_file_read(struct file * filp, char * buf, size_t count, loff_t * static int file_send_actor(read_descriptor_t * desc, struct page *page, unsigned long offset , unsigned long size) { - unsigned long kaddr; + char *kaddr; ssize_t written; unsigned long count = desc->count; struct file *file = (struct file *) desc->buf; @@ -1158,8 +1158,7 @@ static int file_send_actor(read_descriptor_t * desc, struct page *page, unsigned set_fs(KERNEL_DS); kaddr = kmap(page); - written = file->f_op->write(file, (char *)kaddr + offset, - size, &file->f_pos); + written = file->f_op->write(file, kaddr + offset, size, &file->f_pos); kunmap(page); set_fs(old_fs); if (written < 0) { diff --git a/mm/highmem.c b/mm/highmem.c index d83d9bb87..08f20755e 100644 --- a/mm/highmem.c +++ b/mm/highmem.c @@ -29,7 +29,7 @@ struct page * prepare_highmem_swapout(struct page * page) { struct page *new_page; unsigned long regular_page; - unsigned long vaddr; + /* * If this is a highmem page so it can't be swapped out directly * otherwise the b_data buffer addresses will break @@ -50,8 +50,7 @@ struct page * prepare_highmem_swapout(struct page * page) if (!regular_page) return NULL; - vaddr = kmap(page); - copy_page((void *)regular_page, (void *)vaddr); + copy_page((void *)regular_page, kmap(page)); kunmap(page); /* @@ -67,7 +66,6 @@ struct page * prepare_highmem_swapout(struct page * page) struct page * replace_with_highmem(struct page * page) { struct page *highpage; - unsigned long vaddr; if (PageHighMem(page) || !nr_free_highpages()) return page; @@ -80,8 +78,7 @@ struct page * replace_with_highmem(struct page * page) return page; } - vaddr = kmap(highpage); - copy_page((void *)vaddr, page_address(page)); + copy_page(kmap(highpage), page_address(page)); kunmap(highpage); if (page->mapping) @@ -188,7 +185,7 @@ start: return vaddr; } -unsigned long kmap_high(struct page *page) +void *kmap_high(struct page *page) { unsigned long vaddr; @@ -206,7 +203,7 @@ unsigned long kmap_high(struct page *page) if (pkmap_count[PKMAP_NR(vaddr)] < 2) BUG(); spin_unlock(&kmap_lock); - return vaddr; + return (void*) vaddr; } void kunmap_high(struct page *page) @@ -242,7 +239,7 @@ static inline void copy_from_high_bh (struct buffer_head *to, struct buffer_head *from) { struct page *p_from; - unsigned long vfrom; + char *vfrom; unsigned long flags; p_from = from->b_page; @@ -254,7 +251,7 @@ static inline void copy_from_high_bh (struct buffer_head *to, __save_flags(flags); __cli(); vfrom = kmap_atomic(p_from, KM_BOUNCE_WRITE); - memcpy(to->b_data, (char *)vfrom + bh_offset(from), to->b_size); + memcpy(to->b_data, vfrom + bh_offset(from), to->b_size); kunmap_atomic(vfrom, KM_BOUNCE_WRITE); __restore_flags(flags); } @@ -263,14 +260,14 @@ static inline void copy_to_high_bh_irq (struct buffer_head *to, struct buffer_head *from) { struct page *p_to; - unsigned long vto; + char *vto; unsigned long flags; p_to = to->b_page; __save_flags(flags); __cli(); vto = kmap_atomic(p_to, KM_BOUNCE_READ); - memcpy((char *)vto + bh_offset(to), from->b_data, to->b_size); + memcpy(vto + bh_offset(to), from->b_data, to->b_size); kunmap_atomic(vto, KM_BOUNCE_READ); __restore_flags(flags); } diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 15261612e..339cffb5b 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -9,6 +9,7 @@ #include <linux/malloc.h> #include <linux/vmalloc.h> #include <linux/spinlock.h> +#include <linux/smp_lock.h> #include <asm/uaccess.h> #include <asm/pgalloc.h> @@ -137,24 +138,31 @@ inline int vmalloc_area_pages (unsigned long address, unsigned long size, { pgd_t * dir; unsigned long end = address + size; + int ret; dir = pgd_offset_k(address); flush_cache_all(); + lock_kernel(); do { pmd_t *pmd; pmd = pmd_alloc_kernel(dir, address); + ret = -ENOMEM; if (!pmd) - return -ENOMEM; + break; + ret = -ENOMEM; if (alloc_area_pmd(pmd, address, end - address, gfp_mask, prot)) - return -ENOMEM; + break; address = (address + PGDIR_SIZE) & PGDIR_MASK; dir++; + + ret = 0; } while (address && (address < end)); + unlock_kernel(); flush_tlb_all(); - return 0; + return ret; } struct vm_struct * get_vm_area(unsigned long size, unsigned long flags) @@ -165,9 +173,15 @@ struct vm_struct * get_vm_area(unsigned long size, unsigned long flags) area = (struct vm_struct *) kmalloc(sizeof(*area), GFP_KERNEL); if (!area) return NULL; + size += PAGE_SIZE; addr = VMALLOC_START; write_lock(&vmlist_lock); for (p = &vmlist; (tmp = *p) ; p = &tmp->next) { + if ((size + addr) < addr) { + write_unlock(&vmlist_lock); + kfree(area); + return NULL; + } if (size + addr < (unsigned long) tmp->addr) break; addr = tmp->size + (unsigned long) tmp->addr; @@ -179,7 +193,7 @@ struct vm_struct * get_vm_area(unsigned long size, unsigned long flags) } area->flags = flags; area->addr = (void *)addr; - area->size = size + PAGE_SIZE; + area->size = size; area->next = *p; *p = area; write_unlock(&vmlist_lock); |