bitkeeper revision 1.1159.258.22 (422c6612riGtD5GGqVTNqhuli2WrwQ)
authorvh249@airwolf.cl.cam.ac.uk <vh249@airwolf.cl.cam.ac.uk>
Mon, 7 Mar 2005 14:32:50 +0000 (14:32 +0000)
committervh249@airwolf.cl.cam.ac.uk <vh249@airwolf.cl.cam.ac.uk>
Mon, 7 Mar 2005 14:32:50 +0000 (14:32 +0000)
fix spinlock still held while leaving function in case of error

Signed-off-by: Vincent Hanquez <vincent@xensource.com>
BitKeeper/etc/logging_ok
linux-2.6.10-xen-sparse/arch/xen/i386/mm/ioremap.c

index d1c20d6e5f0e9b1e62449fcdee828ad46e2c0f27..935727fd0bc4bfc5044afcac99e7db8179df3895 100644 (file)
@@ -63,4 +63,5 @@ tlh20@elite.cl.cam.ac.uk
 tlh20@labyrinth.cl.cam.ac.uk
 tw275@labyrinth.cl.cam.ac.uk
 tw275@striker.cl.cam.ac.uk
+vh249@airwolf.cl.cam.ac.uk
 xenbk@gandalf.hpl.hp.com
index efd4663bcc46b293390f7f973961cb85ffe4a9cf..6d675b449a2cd87f5451d4ede79a8d2365ab4538 100644 (file)
@@ -354,22 +354,25 @@ int __direct_remap_area_pages(struct mm_struct *mm,
 {
        pgd_t * dir;
        unsigned long end = address + size;
+       int error;
 
        dir = pgd_offset(mm, address);
        if (address >= end)
                BUG();
        spin_lock(&mm->page_table_lock);
        do {
+               error = -ENOMEM;
                pmd_t *pmd = pmd_alloc(mm, dir, address);
                if (!pmd)
-                       return -ENOMEM;
+                       break;
+               error = 0;
                direct_remap_area_pmd(mm, pmd, address, end - address, &v);
                address = (address + PGDIR_SIZE) & PGDIR_MASK;
                dir++;
 
        } while (address && (address < end));
        spin_unlock(&mm->page_table_lock);
-       return 0;
+       return error;
 }