vserver 2.0 rc7
[linux-2.6.git] / drivers / base / transport_class.c
index 3bae11c..6c2b447 100644 (file)
@@ -145,6 +145,20 @@ void transport_setup_device(struct device *dev)
 }
 EXPORT_SYMBOL_GPL(transport_setup_device);
 
+static int transport_add_class_device(struct attribute_container *cont,
+                                     struct device *dev,
+                                     struct class_device *classdev)
+{
+       int error = attribute_container_add_class_device(classdev);
+       struct transport_container *tcont = 
+               attribute_container_to_transport_container(cont);
+
+       if (!error && tcont->statistics)
+               error = sysfs_create_group(&classdev->kobj, tcont->statistics);
+
+       return error;
+}
+
 
 /**
  * transport_add_device - declare a new dev for transport class association
@@ -159,8 +173,7 @@ EXPORT_SYMBOL_GPL(transport_setup_device);
 
 void transport_add_device(struct device *dev)
 {
-       attribute_container_device_trigger(dev,
-                          attribute_container_add_class_device_adapter);
+       attribute_container_device_trigger(dev, transport_add_class_device);
 }
 EXPORT_SYMBOL_GPL(transport_add_device);
 
@@ -197,13 +210,18 @@ static int transport_remove_classdev(struct attribute_container *cont,
                                     struct device *dev,
                                     struct class_device *classdev)
 {
+       struct transport_container *tcont = 
+               attribute_container_to_transport_container(cont);
        struct transport_class *tclass = class_to_transport_class(cont->class);
 
        if (tclass->remove)
                tclass->remove(dev);
 
-       if (tclass->remove != anon_transport_dummy_function)
+       if (tclass->remove != anon_transport_dummy_function) {
+               if (tcont->statistics)
+                       sysfs_remove_group(&classdev->kobj, tcont->statistics);
                attribute_container_class_device_del(classdev);
+       }
 
        return 0;
 }