The patch titled Driver core: add driver_create_group has been added to the -mm tree. Its filename is driver-core-add-driver_create_group.patch *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: Driver core: add driver_create_group From: Greg KH <greg@xxxxxxxxx> Add function for drivers to be able to create and remove sysfs attribute groups without having to fall back to the "raw" sysfs calls. Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxx> Cc: Arthur Jones <arthur.jones@xxxxxxxxxx> Cc: Roland Dreier <rdreier@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- drivers/base/driver.c | 37 ++++++++++++++++++++ drivers/infiniband/hw/ipath/ipath_sysfs.c | 15 +------- include/linux/device.h | 5 ++ 3 files changed, 44 insertions(+), 13 deletions(-) diff -puN drivers/base/driver.c~driver-core-add-driver_create_group drivers/base/driver.c --- a/drivers/base/driver.c~driver-core-add-driver_create_group +++ a/drivers/base/driver.c @@ -123,6 +123,43 @@ void driver_remove_file(struct device_dr } } +/** + * driver_create_group - create group of sysfs files for a driver. + * @drv: driver. + * @group: pointer to a group of attributes to add + * + * Adds a group of sysfs attributes to the specified driver. + */ +int driver_create_group(struct device_driver *drv, + struct attribute_group *group) +{ + int error; + if (get_driver(drv)) { + error = sysfs_create_group(&drv->p->kobj, group); + put_driver(drv); + } else + error = -EINVAL; + return error; +} +EXPORT_SYMBOL_GPL(driver_create_group); + +/** + * driver_remove_file - remove group of sysfs files for a driver. + * @drv: driver. + * @group: pointer to a group of attributes to add. + * + * Removes a group of sysfs attributes that was previously created with a + * call to driver_create_group(). + */ +void driver_remove_group(struct device_driver *drv, + struct attribute_group *group) +{ + if (get_driver(drv)) { + sysfs_remove_group(&drv->p->kobj, group); + put_driver(drv); + } +} +EXPORT_SYMBOL_GPL(driver_remove_group); /** * get_driver - increment driver reference count. diff -puN drivers/infiniband/hw/ipath/ipath_sysfs.c~driver-core-add-driver_create_group drivers/infiniband/hw/ipath/ipath_sysfs.c --- a/drivers/infiniband/hw/ipath/ipath_sysfs.c~driver-core-add-driver_create_group +++ a/drivers/infiniband/hw/ipath/ipath_sysfs.c @@ -757,20 +757,19 @@ int ipath_driver_create_group(struct dev { int ret; - ret = sysfs_create_group(&drv->kobj, &driver_attr_group); + ret = driver_create_group(drv, &driver_attr_group); return ret; } void ipath_driver_remove_group(struct device_driver *drv) { - sysfs_remove_group(&drv->kobj, &driver_attr_group); + driver_remove_group(drv, &driver_attr_group); } int ipath_device_create_group(struct device *dev, struct ipath_devdata *dd) { int ret; - char unit[5]; ret = sysfs_create_group(&dev->kobj, &dev_attr_group); if (ret) @@ -780,11 +779,6 @@ int ipath_device_create_group(struct dev if (ret) goto bail_attrs; - snprintf(unit, sizeof(unit), "%02d", dd->ipath_unit); - ret = sysfs_create_link(&dev->driver->kobj, &dev->kobj, unit); - if (ret == 0) - goto bail; - sysfs_remove_group(&dev->kobj, &dev_counter_attr_group); bail_attrs: sysfs_remove_group(&dev->kobj, &dev_attr_group); @@ -794,11 +788,6 @@ bail: void ipath_device_remove_group(struct device *dev, struct ipath_devdata *dd) { - char unit[5]; - - snprintf(unit, sizeof(unit), "%02d", dd->ipath_unit); - sysfs_remove_link(&dev->driver->kobj, unit); - sysfs_remove_group(&dev->kobj, &dev_counter_attr_group); sysfs_remove_group(&dev->kobj, &dev_attr_group); diff -puN include/linux/device.h~driver-core-add-driver_create_group include/linux/device.h --- a/include/linux/device.h~driver-core-add-driver_create_group +++ a/include/linux/device.h @@ -152,6 +152,11 @@ struct driver_attribute driver_attr_##_n extern int __must_check driver_create_file(struct device_driver *, struct driver_attribute *); extern void driver_remove_file(struct device_driver *, struct driver_attribute *); +extern int __must_check driver_create_group(struct device_driver *, + struct attribute_group *); +extern void driver_remove_group(struct device_driver *, + struct attribute_group *); + extern int __must_check driver_for_each_device(struct device_driver * drv, struct device *start, void *data, _ Patches currently in -mm which might be from greg@xxxxxxxxx are driver-core-add-driver_create_group.patch driver-tree-broke-infiniband.patch gregkh-driver-kset-convert-to-kobj_sysfs_ops-vs-git-acpi.patch unbork-gregkh-driver-kset-convert-sys-devices-to-use-kset_create-vioc.patch quirk-enable-msi-mapping-on-ht1000.patch add-accessors-for-segment_boundary_mask-in.patch pci-add-dma-segment-boundary-support.patch swiotlb-respect-the-segment-boundary-limits.patch call-dma_set_seg_boundary-in-__scsi_alloc_queue.patch belkin_sa-clean-up-for-new-style-termios-and-speed.patch keyspan_pda-clean-up-speed-handling.patch mct232-speed-new-termios-and-compliance-cleanups.patch mct232-speed-new-termios-and-compliance-cleanups-fix.patch ohci-hcdcohci_irq-locking-fix.patch usb-testing-driver-dont-free-a-locked-mutex.patch usb-mon-nopage.patch git-x86.patch dca-convert-struct-class_device-to-struct-device.patch dont-touch-fs_struct-in-usermodehelper.patch usb-net2280-cant-have-a-function-called-show_registers.patch make-sure-nobodys-leaking-resources.patch workaround-for-a-pci-restoring-bug.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html