Staging: vme: Correct operation of vme_lm_free
authorMartyn Welch <martyn.welch@gefanuc.com>
Thu, 29 Oct 2009 16:35:08 +0000 (16:35 +0000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 11 Dec 2009 20:23:18 +0000 (12:23 -0800)
The vme_lm_free() function is not clearing up the resource created in
vme_lm_request(). In addition vme_lm_free() is void function and is used in
exit/error paths, we should wait for mutex to become free rather than
exiting and not freeing the resource.

Signed-off-by: Martyn Welch <martyn.welch@gefanuc.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/vme/vme.c

index 241929f..a6154f9 100644 (file)
@@ -1191,7 +1191,7 @@ int vme_lm_set(struct vme_resource *resource, unsigned long long lm_base,
 
        /* XXX Check parameters */
 
-       return lm->parent->lm_set(lm, lm_base, aspace, cycle);
+       return bridge->lm_set(lm, lm_base, aspace, cycle);
 }
 EXPORT_SYMBOL(vme_lm_set);
 
@@ -1271,16 +1271,18 @@ void vme_lm_free(struct vme_resource *resource)
 
        lm = list_entry(resource->entry, struct vme_lm_resource, list);
 
-       if (mutex_trylock(&(lm->mtx))) {
-               printk(KERN_ERR "Resource busy, can't free\n");
-               return;
-       }
+       mutex_lock(&(lm->mtx));
 
-       /* XXX Check to see that there aren't any callbacks still attached */
+       /* XXX
+        * Check to see that there aren't any callbacks still attached, if
+        * there are we should probably be detaching them!
+        */
 
        lm->locked = 0;
 
        mutex_unlock(&(lm->mtx));
+
+       kfree(resource);
 }
 EXPORT_SYMBOL(vme_lm_free);