*/
 void of_attach_node(struct device_node *np)
 {
-       write_lock(&devtree_lock);
+       unsigned long flags;
+
+       write_lock_irqsave(&devtree_lock, flags);
        np->sibling = np->parent->child;
        np->allnext = allnodes;
        np->parent->child = np;
        allnodes = np;
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 }
 
 /*
 void of_detach_node(struct device_node *np)
 {
        struct device_node *parent;
+       unsigned long flags;
 
-       write_lock(&devtree_lock);
+       write_lock_irqsave(&devtree_lock, flags);
 
        parent = np->parent;
        if (!parent)
        of_node_set_flag(np, OF_DETACHED);
 
 out_unlock:
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 }
 
 #ifdef CONFIG_PPC_PSERIES
 int prom_add_property(struct device_node* np, struct property* prop)
 {
        struct property **next;
+       unsigned long flags;
 
        prop->next = NULL;      
-       write_lock(&devtree_lock);
+       write_lock_irqsave(&devtree_lock, flags);
        next = &np->properties;
        while (*next) {
                if (strcmp(prop->name, (*next)->name) == 0) {
                        /* duplicate ! don't insert it */
-                       write_unlock(&devtree_lock);
+                       write_unlock_irqrestore(&devtree_lock, flags);
                        return -1;
                }
                next = &(*next)->next;
        }
        *next = prop;
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 
 #ifdef CONFIG_PROC_DEVICETREE
        /* try to add to proc as well if it was initialized */
 int prom_remove_property(struct device_node *np, struct property *prop)
 {
        struct property **next;
+       unsigned long flags;
        int found = 0;
 
-       write_lock(&devtree_lock);
+       write_lock_irqsave(&devtree_lock, flags);
        next = &np->properties;
        while (*next) {
                if (*next == prop) {
                }
                next = &(*next)->next;
        }
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 
        if (!found)
                return -ENODEV;
                         struct property *oldprop)
 {
        struct property **next;
+       unsigned long flags;
        int found = 0;
 
-       write_lock(&devtree_lock);
+       write_lock_irqsave(&devtree_lock, flags);
        next = &np->properties;
        while (*next) {
                if (*next == oldprop) {
                }
                next = &(*next)->next;
        }
-       write_unlock(&devtree_lock);
+       write_unlock_irqrestore(&devtree_lock, flags);
 
        if (!found)
                return -ENODEV;