lkml.org 
[lkml]   [2016]   [May]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [RFC 6/7] iio: Refuse to register triggers with duplicate names
From
Date
On 23/05/16 19:40, Crestez Dan Leonard wrote:
> The trigger name is documented as unique but drivers are currently
> allowed to register triggers with duplicate names. This should be
> considered a bug since it makes the 'current_trigger' interface
> unusable.
>
> Signed-off-by: Crestez Dan Leonard <leonard.crestez@intel.com>
This feels like the right approach to my mind (and should have been there
all along - oops).

However, we do need to avoid breaking userspace. It's ugly but for those 3 drivers
can we assume that using more than one on a board was impossible before this series
and as such play a slight game in which we don't change the trigger name they
are exporting, unless that name is already in use?

It's ugly but it gets us the nicest solution for all drivers for a bit of ugly in
3 of them...

Jonathan
> ---
> drivers/iio/industrialio-trigger.c | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/drivers/iio/industrialio-trigger.c b/drivers/iio/industrialio-trigger.c
> index e79c64c..e77503c 100644
> --- a/drivers/iio/industrialio-trigger.c
> +++ b/drivers/iio/industrialio-trigger.c
> @@ -64,6 +64,8 @@ static struct attribute *iio_trig_dev_attrs[] = {
> };
> ATTRIBUTE_GROUPS(iio_trig_dev);
>
> +static struct iio_trigger *__iio_trigger_find_by_name(const char *name);
> +
> int iio_trigger_register(struct iio_trigger *trig_info)
> {
> int ret;
> @@ -82,11 +84,18 @@ int iio_trigger_register(struct iio_trigger *trig_info)
>
> /* Add to list of available triggers held by the IIO core */
> mutex_lock(&iio_trigger_list_lock);
> + if (__iio_trigger_find_by_name(trig_info->name)) {
> + pr_err("Duplicate trigger name '%s'\n", trig_info->name);
> + ret = -EEXIST;
> + goto error_device_del;
> + }
> list_add_tail(&trig_info->list, &iio_trigger_list);
> mutex_unlock(&iio_trigger_list_lock);
>
> return 0;
>
> +error_device_del:
> + device_del(&trig_info->dev);
> error_unregister_id:
> ida_simple_remove(&iio_trigger_ida, trig_info->id);
> return ret;
> @@ -105,6 +114,18 @@ void iio_trigger_unregister(struct iio_trigger *trig_info)
> }
> EXPORT_SYMBOL(iio_trigger_unregister);
>
> +/* Search for trigger by name, assuming iio_trigger_list_lock held */
> +static struct iio_trigger *__iio_trigger_find_by_name(const char *name)
> +{
> + struct iio_trigger *iter;
> +
> + list_for_each_entry(iter, &iio_trigger_list, list)
> + if (!strcmp(iter->name, name))
> + return iter;
> +
> + return NULL;
> +}
> +
> static struct iio_trigger *iio_trigger_find_by_name(const char *name,
> size_t len)
> {
>

\
 
 \ /
  Last update: 2016-05-29 22:21    [W:0.069 / U:0.128 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site