Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

w1: add attribute groups to struct w1_family_ops

This lets w1 slave drivers declare an attribute group, and not have to
create/destroy sysfs files directly. All w1 slave drivers will be fixed
to use this field up in follow-on patches to this one.

Acked-by: Evgeniy Polyakov <zbr@ioremap.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

+42 -32
+41 -32
drivers/w1/w1.c
··· 124 124 125 125 /* Default family */ 126 126 127 - static ssize_t w1_default_write(struct file *filp, struct kobject *kobj, 128 - struct bin_attribute *bin_attr, 129 - char *buf, loff_t off, size_t count) 127 + static ssize_t rw_write(struct file *filp, struct kobject *kobj, 128 + struct bin_attribute *bin_attr, char *buf, loff_t off, 129 + size_t count) 130 130 { 131 131 struct w1_slave *sl = kobj_to_w1_slave(kobj); 132 132 ··· 143 143 return count; 144 144 } 145 145 146 - static ssize_t w1_default_read(struct file *filp, struct kobject *kobj, 147 - struct bin_attribute *bin_attr, 148 - char *buf, loff_t off, size_t count) 146 + static ssize_t rw_read(struct file *filp, struct kobject *kobj, 147 + struct bin_attribute *bin_attr, char *buf, loff_t off, 148 + size_t count) 149 149 { 150 150 struct w1_slave *sl = kobj_to_w1_slave(kobj); 151 151 ··· 155 155 return count; 156 156 } 157 157 158 - static struct bin_attribute w1_default_attr = { 159 - .attr = { 160 - .name = "rw", 161 - .mode = S_IRUGO | S_IWUSR, 162 - }, 163 - .size = PAGE_SIZE, 164 - .read = w1_default_read, 165 - .write = w1_default_write, 158 + static BIN_ATTR_RW(rw, PAGE_SIZE); 159 + 160 + static struct bin_attribute *w1_slave_bin_attrs[] = { 161 + &bin_attr_rw, 162 + NULL, 166 163 }; 167 164 168 - static int w1_default_add_slave(struct w1_slave *sl) 169 - { 170 - return sysfs_create_bin_file(&sl->dev.kobj, &w1_default_attr); 171 - } 165 + static const struct attribute_group w1_slave_default_group = { 166 + .bin_attrs = w1_slave_bin_attrs, 167 + }; 172 168 173 - static void w1_default_remove_slave(struct w1_slave *sl) 174 - { 175 - sysfs_remove_bin_file(&sl->dev.kobj, &w1_default_attr); 176 - } 169 + static const struct attribute_group *w1_slave_default_groups[] = { 170 + &w1_slave_default_group, 171 + NULL, 172 + }; 177 173 178 174 static struct w1_family_ops w1_default_fops = { 179 - .add_slave = w1_default_add_slave, 180 - .remove_slave = w1_default_remove_slave, 175 + .groups = w1_slave_default_groups, 181 176 }; 182 177 183 178 static struct w1_family w1_default_family = { ··· 595 600 { 596 601 struct device *dev = data; 597 602 struct w1_slave *sl; 603 + struct w1_family_ops *fops; 598 604 int err; 599 605 600 606 /* ··· 607 611 return 0; 608 612 609 613 sl = dev_to_w1_slave(dev); 614 + fops = sl->family->fops; 610 615 611 616 switch (action) { 612 617 case BUS_NOTIFY_ADD_DEVICE: 613 618 /* if the family driver needs to initialize something... */ 614 - if (sl->family->fops && sl->family->fops->add_slave && 615 - ((err = sl->family->fops->add_slave(sl)) < 0)) { 616 - dev_err(&sl->dev, 617 - "sysfs file creation for [%s] failed. err=%d\n", 618 - dev_name(&sl->dev), err); 619 - return err; 619 + if (fops->add_slave) { 620 + err = fops->add_slave(sl); 621 + if (err < 0) { 622 + dev_err(&sl->dev, 623 + "add_slave() call failed. err=%d\n", 624 + err); 625 + return err; 626 + } 627 + } 628 + if (fops->groups) { 629 + err = sysfs_create_groups(&sl->dev.kobj, fops->groups); 630 + if (err) { 631 + dev_err(&sl->dev, 632 + "sysfs group creation failed. err=%d\n", 633 + err); 634 + return err; 635 + } 620 636 } 621 637 622 638 break; 623 639 case BUS_NOTIFY_DEL_DEVICE: 624 - /* Remove our sysfs files */ 625 - if (sl->family->fops && sl->family->fops->remove_slave) 640 + if (fops->remove_slave) 626 641 sl->family->fops->remove_slave(sl); 642 + if (fops->groups) 643 + sysfs_remove_groups(&sl->dev.kobj, fops->groups); 627 644 break; 628 645 } 629 646 return 0;
+1
drivers/w1/w1_family.h
··· 52 52 { 53 53 int (* add_slave)(struct w1_slave *); 54 54 void (* remove_slave)(struct w1_slave *); 55 + const struct attribute_group **groups; 55 56 }; 56 57 57 58 struct w1_family