vserver 1.9.5.x5
[linux-2.6.git] / net / irda / irias_object.c
index 058bf54..98c9e15 100644 (file)
@@ -116,7 +116,7 @@ EXPORT_SYMBOL(irias_new_object);
  *    Delete given attribute and deallocate all its memory
  *
  */
-void __irias_delete_attrib(struct ias_attrib *attrib)
+static void __irias_delete_attrib(struct ias_attrib *attrib)
 {
        ASSERT(attrib != NULL, return;);
        ASSERT(attrib->magic == IAS_ATTRIB_MAGIC, return;);
@@ -159,11 +159,14 @@ int irias_delete_object(struct ias_object *obj)
        ASSERT(obj != NULL, return -1;);
        ASSERT(obj->magic == IAS_OBJECT_MAGIC, return -1;);
 
+       /* Remove from list */
        node = hashbin_remove_this(irias_objects, (irda_queue_t *) obj);
        if (!node)
-               return 0; /* Already removed */
+               IRDA_DEBUG( 0, "%s(), object already removed!\n",
+                           __FUNCTION__);
 
-       __irias_delete_object(node);
+       /* Destroy */
+       __irias_delete_object(obj);
 
        return 0;
 }
@@ -176,7 +179,8 @@ EXPORT_SYMBOL(irias_delete_object);
  *    the object, remove the object as well.
  *
  */
-int irias_delete_attrib(struct ias_object *obj, struct ias_attrib *attrib)
+int irias_delete_attrib(struct ias_object *obj, struct ias_attrib *attrib,
+                       int cleanobject)
 {
        struct ias_attrib *node;
 
@@ -192,9 +196,13 @@ int irias_delete_attrib(struct ias_object *obj, struct ias_attrib *attrib)
        /* Deallocate attribute */
        __irias_delete_attrib(node);
 
-       /* Check if object has still some attributes */
+       /* Check if object has still some attributes, destroy it if none.
+        * At first glance, this look dangerous, as the kernel reference
+        * various IAS objects. However, we only use this function on
+        * user attributes, not kernel attributes, so there is no risk
+        * of deleting a kernel object this way. Jean II */
        node = (struct ias_attrib *) hashbin_get_first(obj->attribs);
-       if (!node)
+       if (cleanobject && !node)
                irias_delete_object(obj);
 
        return 0;
@@ -259,8 +267,8 @@ EXPORT_SYMBOL(irias_find_attrib);
  *    Add attribute to object
  *
  */
-void irias_add_attrib( struct ias_object *obj, struct ias_attrib *attrib,
-                      int owner)
+static void irias_add_attrib(struct ias_object *obj, struct ias_attrib *attrib,
+                            int owner)
 {
        ASSERT(obj != NULL, return;);
        ASSERT(obj->magic == IAS_OBJECT_MAGIC, return;);