* [PATCH 1/2] firewire: core: check for missing struct update at build time, not run time [not found] ` <ac3eb2510905220423h23e7aca1u3bc7c204db551eb0@mail.gmail.com> @ 2009-05-22 21:16 ` Stefan Richter 2009-05-22 21:17 ` [PATCH 2/2] firewire: core: add sysfs attribute for easier udev rules Stefan Richter 0 siblings, 1 reply; 5+ messages in thread From: Stefan Richter @ 2009-05-22 21:16 UTC (permalink / raw) To: linux1394-devel; +Cc: linux-hotplug, linux-kernel, Kay Sievers struct fw_attribute_group.attrs.[] must have enough room for all attributes. This can and should be checked at build time. Our previous check at run time was a little late and not reliable since most of the time less than the available attributes are populated. Furthermore, omit an increment of an index at its last usage. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> --- drivers/firewire/fw-device.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) Index: linux/drivers/firewire/fw-device.c =================================================================== --- linux.orig/drivers/firewire/fw-device.c +++ linux/drivers/firewire/fw-device.c @@ -289,14 +289,13 @@ static void init_fw_attribute_group(stru attr = &config_rom_attributes[i].attr; if (attr->show(dev, attr, NULL) < 0) continue; group->attrs[j++] = &attr->attr; } - BUG_ON(j >= ARRAY_SIZE(group->attrs)); - group->attrs[j++] = NULL; + group->attrs[j] = NULL; group->groups[0] = &group->group; group->groups[1] = NULL; group->group.attrs = group->attrs; dev->groups = group->groups; } @@ -570,9 +569,13 @@ static void create_units(struct fw_devic unit->device.parent = &device->device; dev_set_name(&unit->device, "%s.%d", dev_name(&device->device), i++); + BUILD_BUG_ON(ARRAY_SIZE(unit->attribute_group.attrs) < + ARRAY_SIZE(fw_unit_attributes) + + ARRAY_SIZE(config_rom_attributes)); init_fw_attribute_group(&unit->device, fw_unit_attributes, &unit->attribute_group); + if (device_register(&unit->device) < 0) goto skip_unit; @@ -849,9 +852,13 @@ static void fw_device_init(struct work_s device->device.devt = MKDEV(fw_cdev_major, minor); dev_set_name(&device->device, "fw%d", minor); + BUILD_BUG_ON(ARRAY_SIZE(device->attribute_group.attrs) < + ARRAY_SIZE(fw_device_attributes) + + ARRAY_SIZE(config_rom_attributes)); init_fw_attribute_group(&device->device, fw_device_attributes, &device->attribute_group); + if (device_add(&device->device)) { fw_error("Failed to add device.\n"); goto error_with_cdev; -- Stefan Richter -=====-==--= -=-= =-==- http://arcgraph.de/sr/ ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 2/2] firewire: core: add sysfs attribute for easier udev rules 2009-05-22 21:16 ` [PATCH 1/2] firewire: core: check for missing struct update at build time, not run time Stefan Richter @ 2009-05-22 21:17 ` Stefan Richter 2009-05-22 22:03 ` Stefan Richter 2009-05-23 0:35 ` Kay Sievers 0 siblings, 2 replies; 5+ messages in thread From: Stefan Richter @ 2009-05-22 21:17 UTC (permalink / raw) To: linux1394-devel; +Cc: linux-hotplug, linux-kernel, Kay Sievers This adds the attribute /sys/bus/firewire/devices/fw[0-9]+/units. It can be used in udev rules like the following ones: # IIDC devices: industrial cameras and some webcams SUBSYSTEM=="firewire", ATTR{units}=="*0x00a02d:0x00010?*", GROUP="video" # AV/C devices: camcorders, set-top boxes, TV sets, audio devices, ... SUBSYSTEM=="firewire", ATTR{units}=="*0x00a02d:0x010001*", GROUP="video" Background: firewire-core manages two device types: - fw_device is a FireWire node. A character device file is associated with it. - fw_unit is a unit directory on a node. Each fw_device may have 0..n children of type fw_unit. The units tell us what kinds of protocols a node implements. We want to set ownership or ACLs or permissions of the character device file of an fw_device, or/and create symlinks to it, based on available protocols. Until now udev rules had to look at the fw_unit devices and then modify their parent's character device file accordingly. This is problematic for two reasons: 1) It happens sometime after the creation of the fw_device, 2) an access policy may require that information from all children is evaluated before a decision about the parent is made. Problem 1) can ultimately not be avoided since this is the nature of FireWire nodes: They may add or remove unit directories at any point in time. However, we can still help userland a lot by providing the protocol type information of all units in a summary sysfs attribute directly at the fw_device. This way, - the information is immediately available at the affected device when userspace goes about to handle an ADD or CHANGE event of the fw_device, - with most policies, it won't be necessary anymore to dig through child attributes. The new attribute is called "units". It contains space-separated tuples of specifier_id and version of each present unit. The delimiter within tuples is a colon. Specifier_id and version are printed as 0x%06x. Here is an example of a node which implements an IPv4 unit and an IPv6 unit: $ cat /sys/bus/firewire/devices/fw2/units 0x00005e:0x000001 0x00005e:0x000002 Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> --- drivers/firewire/fw-device.c | 49 +++++++++++++++++++++++++++++++++++++++++++ drivers/firewire/fw-device.h | 2 - 2 files changed, 50 insertions(+), 1 deletion(-) Index: linux/drivers/firewire/fw-device.c =================================================================== --- linux.orig/drivers/firewire/fw-device.c +++ linux/drivers/firewire/fw-device.c @@ -355,9 +355,55 @@ static ssize_t guid_show(struct device * return ret; } +static int units_sprintf(char *buf, u32 *directory) +{ + struct fw_csr_iterator ci; + int key, value; + int specifier_id = 0; + int version = 0; + + fw_csr_iterator_init(&ci, directory); + while (fw_csr_iterator_next(&ci, &key, &value)) { + switch (key) { + case CSR_SPECIFIER_ID: + specifier_id = value; + break; + case CSR_VERSION: + version = value; + break; + } + } + + return sprintf(buf, "0x%06x:0x%06x ", specifier_id, version); +} + +static ssize_t units_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct fw_device *device = fw_device(dev); + struct fw_csr_iterator ci; + int key, value, i = 0; + + down_read(&fw_device_rwsem); + fw_csr_iterator_init(&ci, &device->config_rom[5]); + while (fw_csr_iterator_next(&ci, &key, &value)) { + if (key != (CSR_UNIT | CSR_DIRECTORY)) + continue; + i += units_sprintf(&buf[i], ci.p + value - 1); + if (i >= PAGE_SIZE - (8 + 1 + 8 + 1)) + break; + } + up_read(&fw_device_rwsem); + + sprintf(&buf[i ? i - 1 : 0], "\n"); + + return i; +} + static struct device_attribute fw_device_attributes[] = { __ATTR_RO(config_rom), __ATTR_RO(guid), + __ATTR_RO(units), __ATTR_NULL, }; @@ -1000,6 +1046,9 @@ static void fw_device_refresh(struct wor create_units(device); + /* Userspace may want to re-read attributes. */ + kobject_uevent(&device->device.kobj, KOBJ_CHANGE); + if (atomic_cmpxchg(&device->state, FW_DEVICE_INITIALIZING, FW_DEVICE_RUNNING) == FW_DEVICE_GONE) Index: linux/drivers/firewire/fw-device.h =================================================================== --- linux.orig/drivers/firewire/fw-device.h +++ linux/drivers/firewire/fw-device.h @@ -42,7 +42,7 @@ enum fw_device_state { struct fw_attribute_group { struct attribute_group *groups[2]; struct attribute_group group; - struct attribute *attrs[11]; + struct attribute *attrs[12]; }; struct fw_node; -- Stefan Richter -=====-==--= -=-= =-==- http://arcgraph.de/sr/ ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] firewire: core: add sysfs attribute for easier udev rules 2009-05-22 21:17 ` [PATCH 2/2] firewire: core: add sysfs attribute for easier udev rules Stefan Richter @ 2009-05-22 22:03 ` Stefan Richter 2009-05-23 0:35 ` Kay Sievers 1 sibling, 0 replies; 5+ messages in thread From: Stefan Richter @ 2009-05-22 22:03 UTC (permalink / raw) To: linux1394-devel; +Cc: linux-hotplug, linux-kernel, Kay Sievers Stefan Richter wrote: > + while (fw_csr_iterator_next(&ci, &key, &value)) { > + if (key != (CSR_UNIT | CSR_DIRECTORY)) > + continue; > + i += units_sprintf(&buf[i], ci.p + value - 1); > + if (i >= PAGE_SIZE - (8 + 1 + 8 + 1)) > + break; > + } > + up_read(&fw_device_rwsem); > + > + sprintf(&buf[i ? i - 1 : 0], "\n"); Rather: if (i) buf[i - 1] = '\n'; > + > + return i; > +} -- Stefan Richter -=====-==--= -=-= =-=== http://arcgraph.de/sr/ ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] firewire: core: add sysfs attribute for easier udev rules 2009-05-22 21:17 ` [PATCH 2/2] firewire: core: add sysfs attribute for easier udev rules Stefan Richter 2009-05-22 22:03 ` Stefan Richter @ 2009-05-23 0:35 ` Kay Sievers 2009-05-24 12:09 ` Stefan Richter 1 sibling, 1 reply; 5+ messages in thread From: Kay Sievers @ 2009-05-23 0:35 UTC (permalink / raw) To: Stefan Richter; +Cc: linux1394-devel, linux-hotplug, linux-kernel On Fri, May 22, 2009 at 23:17, Stefan Richter <stefanr@s5r6.in-berlin.de> wrote: > This adds the attribute /sys/bus/firewire/devices/fw[0-9]+/units. It > can be used in udev rules like the following ones: > > # IIDC devices: industrial cameras and some webcams > SUBSYSTEM=="firewire", ATTR{units}=="*0x00a02d:0x00010?*", GROUP="video" > > # AV/C devices: camcorders, set-top boxes, TV sets, audio devices, ... > SUBSYSTEM=="firewire", ATTR{units}=="*0x00a02d:0x010001*", GROUP="video" > Here is an example of a node which implements an IPv4 unit and an IPv6 > unit: $ cat /sys/bus/firewire/devices/fw2/units > 0x00005e:0x000001 0x00005e:0x000002 Looks great. Let me know when you are merging this, so we can put the rules in the udev tree. Thanks, Kay ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH 2/2] firewire: core: add sysfs attribute for easier udev rules 2009-05-23 0:35 ` Kay Sievers @ 2009-05-24 12:09 ` Stefan Richter 0 siblings, 0 replies; 5+ messages in thread From: Stefan Richter @ 2009-05-24 12:09 UTC (permalink / raw) To: Kay Sievers; +Cc: linux1394-devel, linux-hotplug, linux-kernel Kay Sievers wrote: > Looks great. Let me know when you are merging this, so we can put the > rules in the udev tree. Yes, will do. Thanks for the guidance. -- Stefan Richter -=====-==--= -=-= =-=== http://arcgraph.de/sr/ ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2009-05-24 12:09 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <tkrat.d86e749d664670a9@s5r6.in-berlin.de>
[not found] ` <ac3eb2510905211001m77eda9e4gb73001d504fd5376@mail.gmail.com>
[not found] ` <4A159899.20506@s5r6.in-berlin.de>
[not found] ` <4A165CED.8030601@s5r6.in-berlin.de>
[not found] ` <ac3eb2510905220423h23e7aca1u3bc7c204db551eb0@mail.gmail.com>
2009-05-22 21:16 ` [PATCH 1/2] firewire: core: check for missing struct update at build time, not run time Stefan Richter
2009-05-22 21:17 ` [PATCH 2/2] firewire: core: add sysfs attribute for easier udev rules Stefan Richter
2009-05-22 22:03 ` Stefan Richter
2009-05-23 0:35 ` Kay Sievers
2009-05-24 12:09 ` Stefan Richter
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox