25-akpm/lib/kobject.c | 19 +++++++++++++------ 1 files changed, 13 insertions(+), 6 deletions(-) diff -puN lib/kobject.c~kobj_lock-fix lib/kobject.c --- 25/lib/kobject.c~kobj_lock-fix Tue Apr 15 16:31:28 2003 +++ 25-akpm/lib/kobject.c Tue Apr 15 16:34:33 2003 @@ -336,12 +336,14 @@ void kobject_unregister(struct kobject * struct kobject * kobject_get(struct kobject * kobj) { struct kobject * ret = kobj; - spin_lock(&kobj_lock); + unsigned long flags; + + spin_lock_irqsave(&kobj_lock, flags); if (kobj && atomic_read(&kobj->refcount) > 0) atomic_inc(&kobj->refcount); else ret = NULL; - spin_unlock(&kobj_lock); + spin_unlock_irqrestore(&kobj_lock, flags); return ret; } @@ -371,10 +373,15 @@ void kobject_cleanup(struct kobject * ko void kobject_put(struct kobject * kobj) { - if (!atomic_dec_and_lock(&kobj->refcount, &kobj_lock)) - return; - spin_unlock(&kobj_lock); - kobject_cleanup(kobj); + unsigned long flags; + + local_irq_save(flags); + if (atomic_dec_and_lock(&kobj->refcount, &kobj_lock)) { + spin_unlock_irqrestore(&kobj_lock, flags); + kobject_cleanup(kobj); + } else { + local_irq_restore(flags); + } } _