in parallel. Reuse of the virtual address is prevented by
           leaving it in the global lists until we're done with it.
           cpa takes care of the direct mappings. */
-       read_lock(&vmlist_lock);
-       for (p = vmlist; p; p = p->next) {
-               if (p->addr == addr)
-                       break;
-       }
-       read_unlock(&vmlist_lock);
+       p = find_vm_area((void *)addr);
 
        if (!p) {
                pr_err("iounmap: bad address %p\n", addr);
 
 void __uc32_iounmap(volatile void __iomem *io_addr)
 {
        void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr);
-       struct vm_struct **p, *tmp;
+       struct vm_struct *vm;
 
        /*
         * If this is a section based mapping we need to handle it
         * all the mappings before the area can be reclaimed
         * by someone else.
         */
-       write_lock(&vmlist_lock);
-       for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
-               if ((tmp->flags & VM_IOREMAP) && (tmp->addr == addr)) {
-                       if (tmp->flags & VM_UNICORE_SECTION_MAPPING) {
-                               unmap_area_sections((unsigned long)tmp->addr,
-                                                   tmp->size);
-                       }
-                       break;
-               }
-       }
-       write_unlock(&vmlist_lock);
+       vm = find_vm_area(addr);
+       if (vm && (vm->flags & VM_IOREMAP) &&
+               (vm->flags & VM_UNICORE_SECTION_MAPPING))
+               unmap_area_sections((unsigned long)vm->addr, vm->size);
 
        vunmap(addr);
 }
 
           in parallel. Reuse of the virtual address is prevented by
           leaving it in the global lists until we're done with it.
           cpa takes care of the direct mappings. */
-       read_lock(&vmlist_lock);
-       for (p = vmlist; p; p = p->next) {
-               if (p->addr == (void __force *)addr)
-                       break;
-       }
-       read_unlock(&vmlist_lock);
+       p = find_vm_area((void __force *)addr);
 
        if (!p) {
                printk(KERN_ERR "iounmap: bad address %p\n", addr);