xen: pcpu: Use static attribute groups for sysfs entry
authorTakashi Iwai <tiwai@suse.de>
Thu, 5 Feb 2015 20:38:58 +0000 (21:38 +0100)
committerDavid Vrabel <david.vrabel@citrix.com>
Mon, 16 Mar 2015 14:49:13 +0000 (14:49 +0000)
Instead of manual calls of device_create_file() and
device_remove_file(), assign the static attribute groups to the device
to register.  The conditional build of sysfs is done in is_visible
callback instead.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
drivers/xen/pcpu.c

index 0aac403d53fd2987045272b34ca8a5a0a17ffa68..49e88f2ce7a1889e43f4bf9767f4502b4909f3ed 100644 (file)
@@ -132,6 +132,33 @@ static ssize_t __ref store_online(struct device *dev,
 }
 static DEVICE_ATTR(online, S_IRUGO | S_IWUSR, show_online, store_online);
 
+static struct attribute *pcpu_dev_attrs[] = {
+       &dev_attr_online.attr,
+       NULL
+};
+
+static umode_t pcpu_dev_is_visible(struct kobject *kobj,
+                                  struct attribute *attr, int idx)
+{
+       struct device *dev = kobj_to_dev(kobj);
+       /*
+        * Xen never offline cpu0 due to several restrictions
+        * and assumptions. This basically doesn't add a sys control
+        * to user, one cannot attempt to offline BSP.
+        */
+       return dev->id ? attr->mode : 0;
+}
+
+static const struct attribute_group pcpu_dev_group = {
+       .attrs = pcpu_dev_attrs,
+       .is_visible = pcpu_dev_is_visible,
+};
+
+static const struct attribute_group *pcpu_dev_groups[] = {
+       &pcpu_dev_group,
+       NULL
+};
+
 static bool xen_pcpu_online(uint32_t flags)
 {
        return !!(flags & XEN_PCPU_FLAGS_ONLINE);
@@ -181,9 +208,6 @@ static void unregister_and_remove_pcpu(struct pcpu *pcpu)
                return;
 
        dev = &pcpu->dev;
-       if (dev->id)
-               device_remove_file(dev, &dev_attr_online);
-
        /* pcpu remove would be implicitly done */
        device_unregister(dev);
 }
@@ -200,6 +224,7 @@ static int register_pcpu(struct pcpu *pcpu)
        dev->bus = &xen_pcpu_subsys;
        dev->id = pcpu->cpu_id;
        dev->release = pcpu_release;
+       dev->groups = pcpu_dev_groups;
 
        err = device_register(dev);
        if (err) {
@@ -207,19 +232,6 @@ static int register_pcpu(struct pcpu *pcpu)
                return err;
        }
 
-       /*
-        * Xen never offline cpu0 due to several restrictions
-        * and assumptions. This basically doesn't add a sys control
-        * to user, one cannot attempt to offline BSP.
-        */
-       if (dev->id) {
-               err = device_create_file(dev, &dev_attr_online);
-               if (err) {
-                       device_unregister(dev);
-                       return err;
-               }
-       }
-
        return 0;
 }