2020-03-24 17:17:03

by Srinivas Kandagatla

[permalink] [raw]
Subject: [PATCH 0/3] nvmem: use is_bin_visible callback

Hi Greg,

As suggested I managed to use is_bin_visible for the existing code and
one cleanup for using device_register/unregister directly instead of splitting.

Note: this does not add any new functionality, its just a cleanup

Thanks,
srini

Srinivas Kandagatla (3):
nvmem: core: use device_register and device_unregister
nvmem: core: add root_only member to nvmem device struct
nvmem: core: use is_bin_visible for permissions

drivers/nvmem/core.c | 8 ++--
drivers/nvmem/nvmem-sysfs.c | 74 +++++++++----------------------------
drivers/nvmem/nvmem.h | 1 +
3 files changed, 22 insertions(+), 61 deletions(-)

--
2.21.0


2020-03-24 17:17:26

by Srinivas Kandagatla

[permalink] [raw]
Subject: [PATCH 3/3] nvmem: core: use is_bin_visible for permissions

By using is_bin_visible callback to set permissions will remove a large list
of attribute groups. These group permissions can be dynamically derived in
the callback.

Suggested-by: Greg KH <[email protected]>
Signed-off-by: Srinivas Kandagatla <[email protected]>
---
drivers/nvmem/nvmem-sysfs.c | 74 +++++++++----------------------------
1 file changed, 18 insertions(+), 56 deletions(-)

diff --git a/drivers/nvmem/nvmem-sysfs.c b/drivers/nvmem/nvmem-sysfs.c
index 8759c4470012..1ff1801048f6 100644
--- a/drivers/nvmem/nvmem-sysfs.c
+++ b/drivers/nvmem/nvmem-sysfs.c
@@ -103,6 +103,17 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj,

return count;
}
+static umode_t nvmem_bin_attr_is_visible(struct kobject *kobj,
+ struct bin_attribute *attr, int i)
+{
+ struct device *dev = container_of(kobj, struct device, kobj);
+ struct nvmem_device *nvmem = to_nvmem_device(dev);
+
+ if (nvmem->root_only)
+ return nvmem->read_only ? 0400 : 0600;
+
+ return nvmem->read_only ? 0444 : 0644;
+}

/* default read/write permissions */
static struct bin_attribute bin_attr_rw_nvmem = {
@@ -114,18 +125,19 @@ static struct bin_attribute bin_attr_rw_nvmem = {
.write = bin_attr_nvmem_write,
};

-static struct bin_attribute *nvmem_bin_rw_attributes[] = {
+static struct bin_attribute *nvmem_bin_attributes[] = {
&bin_attr_rw_nvmem,
NULL,
};

-static const struct attribute_group nvmem_bin_rw_group = {
- .bin_attrs = nvmem_bin_rw_attributes,
+static const struct attribute_group nvmem_bin_group = {
+ .bin_attrs = nvmem_bin_attributes,
.attrs = nvmem_attrs,
+ .is_bin_visible = nvmem_bin_attr_is_visible,
};

-static const struct attribute_group *nvmem_rw_dev_groups[] = {
- &nvmem_bin_rw_group,
+static const struct attribute_group *nvmem_dev_groups[] = {
+ &nvmem_bin_group,
NULL,
};

@@ -138,21 +150,6 @@ static struct bin_attribute bin_attr_ro_nvmem = {
.read = bin_attr_nvmem_read,
};

-static struct bin_attribute *nvmem_bin_ro_attributes[] = {
- &bin_attr_ro_nvmem,
- NULL,
-};
-
-static const struct attribute_group nvmem_bin_ro_group = {
- .bin_attrs = nvmem_bin_ro_attributes,
- .attrs = nvmem_attrs,
-};
-
-static const struct attribute_group *nvmem_ro_dev_groups[] = {
- &nvmem_bin_ro_group,
- NULL,
-};
-
/* default read/write permissions, root only */
static struct bin_attribute bin_attr_rw_root_nvmem = {
.attr = {
@@ -163,21 +160,6 @@ static struct bin_attribute bin_attr_rw_root_nvmem = {
.write = bin_attr_nvmem_write,
};

-static struct bin_attribute *nvmem_bin_rw_root_attributes[] = {
- &bin_attr_rw_root_nvmem,
- NULL,
-};
-
-static const struct attribute_group nvmem_bin_rw_root_group = {
- .bin_attrs = nvmem_bin_rw_root_attributes,
- .attrs = nvmem_attrs,
-};
-
-static const struct attribute_group *nvmem_rw_root_dev_groups[] = {
- &nvmem_bin_rw_root_group,
- NULL,
-};
-
/* read only permission, root only */
static struct bin_attribute bin_attr_ro_root_nvmem = {
.attr = {
@@ -187,31 +169,11 @@ static struct bin_attribute bin_attr_ro_root_nvmem = {
.read = bin_attr_nvmem_read,
};

-static struct bin_attribute *nvmem_bin_ro_root_attributes[] = {
- &bin_attr_ro_root_nvmem,
- NULL,
-};
-
-static const struct attribute_group nvmem_bin_ro_root_group = {
- .bin_attrs = nvmem_bin_ro_root_attributes,
- .attrs = nvmem_attrs,
-};
-
-static const struct attribute_group *nvmem_ro_root_dev_groups[] = {
- &nvmem_bin_ro_root_group,
- NULL,
-};
-
const struct attribute_group **nvmem_sysfs_get_groups(
struct nvmem_device *nvmem,
const struct nvmem_config *config)
{
- if (config->root_only)
- return nvmem->read_only ?
- nvmem_ro_root_dev_groups :
- nvmem_rw_root_dev_groups;
-
- return nvmem->read_only ? nvmem_ro_dev_groups : nvmem_rw_dev_groups;
+ return nvmem_dev_groups;
}

/*
--
2.21.0

2020-03-24 17:18:53

by Srinivas Kandagatla

[permalink] [raw]
Subject: [PATCH 2/3] nvmem: core: add root_only member to nvmem device struct

As we are planning to move to use sysfs is_bin_visible callback,
having root_only as part of nvmem_device will help decide correct
permissions.

Signed-off-by: Srinivas Kandagatla <[email protected]>
---
drivers/nvmem/core.c | 1 +
drivers/nvmem/nvmem.h | 1 +
2 files changed, 2 insertions(+)

diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
index e8f7bea93abf..7d28e1cca4e0 100644
--- a/drivers/nvmem/core.c
+++ b/drivers/nvmem/core.c
@@ -377,6 +377,7 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config)
nvmem->dev.type = &nvmem_provider_type;
nvmem->dev.bus = &nvmem_bus_type;
nvmem->dev.parent = config->dev;
+ nvmem->root_only = config->root_only;
nvmem->priv = config->priv;
nvmem->type = config->type;
nvmem->reg_read = config->reg_read;
diff --git a/drivers/nvmem/nvmem.h b/drivers/nvmem/nvmem.h
index be0d66d75c8a..16c0d3ad6679 100644
--- a/drivers/nvmem/nvmem.h
+++ b/drivers/nvmem/nvmem.h
@@ -20,6 +20,7 @@ struct nvmem_device {
struct kref refcnt;
size_t size;
bool read_only;
+ bool root_only;
int flags;
enum nvmem_type type;
struct bin_attribute eeprom;
--
2.21.0

2020-03-24 17:48:28

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH 3/3] nvmem: core: use is_bin_visible for permissions

On Tue, Mar 24, 2020 at 05:16:00PM +0000, Srinivas Kandagatla wrote:
> By using is_bin_visible callback to set permissions will remove a large list
> of attribute groups. These group permissions can be dynamically derived in
> the callback.
>
> Suggested-by: Greg KH <[email protected]>
> Signed-off-by: Srinivas Kandagatla <[email protected]>
> ---
> drivers/nvmem/nvmem-sysfs.c | 74 +++++++++----------------------------
> 1 file changed, 18 insertions(+), 56 deletions(-)
>
> diff --git a/drivers/nvmem/nvmem-sysfs.c b/drivers/nvmem/nvmem-sysfs.c
> index 8759c4470012..1ff1801048f6 100644
> --- a/drivers/nvmem/nvmem-sysfs.c
> +++ b/drivers/nvmem/nvmem-sysfs.c
> @@ -103,6 +103,17 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj,
>
> return count;
> }
> +static umode_t nvmem_bin_attr_is_visible(struct kobject *kobj,
> + struct bin_attribute *attr, int i)
> +{
> + struct device *dev = container_of(kobj, struct device, kobj);
> + struct nvmem_device *nvmem = to_nvmem_device(dev);
> +
> + if (nvmem->root_only)
> + return nvmem->read_only ? 0400 : 0600;
> +
> + return nvmem->read_only ? 0444 : 0644;
> +}

I don't know why this is so hard for me to read, but how about this
instead:

static umode_t nvmem_bin_attr_is_visible(struct kobject *kobj,
struct bin_attribute *attr, int i)
{
struct device *dev = container_of(kobj, struct device, kobj);
struct nvmem_device *nvmem = to_nvmem_device(dev);
umode_t mode = 0400;

if (!nvmem->root_only)
mode |= 0044;

if (!nvmem->read_only)
mode |= 0200;

return mode;
}

Did I get the logic corect?

thanks,

greg k-h

2020-03-24 17:59:08

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH 0/3] nvmem: use is_bin_visible callback

On Tue, Mar 24, 2020 at 05:15:57PM +0000, Srinivas Kandagatla wrote:
> Hi Greg,
>
> As suggested I managed to use is_bin_visible for the existing code and
> one cleanup for using device_register/unregister directly instead of splitting.
>
> Note: this does not add any new functionality, its just a cleanup

I took patch 1 of this series already, as it was "obvious" :)

thanks,

greg k-h

2020-03-24 23:07:54

by Nicholas Johnson

[permalink] [raw]
Subject: Re: [PATCH 3/3] nvmem: core: use is_bin_visible for permissions

On Tue, Mar 24, 2020 at 05:16:00PM +0000, Srinivas Kandagatla wrote:
> By using is_bin_visible callback to set permissions will remove a large list
> of attribute groups. These group permissions can be dynamically derived in
> the callback.
>
> Suggested-by: Greg KH <[email protected]>
> Signed-off-by: Srinivas Kandagatla <[email protected]>
> ---
> drivers/nvmem/nvmem-sysfs.c | 74 +++++++++----------------------------
> 1 file changed, 18 insertions(+), 56 deletions(-)
>
> diff --git a/drivers/nvmem/nvmem-sysfs.c b/drivers/nvmem/nvmem-sysfs.c
> index 8759c4470012..1ff1801048f6 100644
> --- a/drivers/nvmem/nvmem-sysfs.c
> +++ b/drivers/nvmem/nvmem-sysfs.c
> @@ -103,6 +103,17 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj,
>
> return count;
> }
> +static umode_t nvmem_bin_attr_is_visible(struct kobject *kobj,
> + struct bin_attribute *attr, int i)
> +{
> + struct device *dev = container_of(kobj, struct device, kobj);
> + struct nvmem_device *nvmem = to_nvmem_device(dev);
> +
> + if (nvmem->root_only)
> + return nvmem->read_only ? 0400 : 0600;
> +
> + return nvmem->read_only ? 0444 : 0644;
> +}
Looks like I did a pretty good job as I arrived at a similar result
independently. Even added root_only to nvmem_device. You beat me to it.
:)

> const struct attribute_group **nvmem_sysfs_get_groups(
> struct nvmem_device *nvmem,
> const struct nvmem_config *config)
> {
> - if (config->root_only)
> - return nvmem->read_only ?
> - nvmem_ro_root_dev_groups :
> - nvmem_rw_root_dev_groups;
> -
> - return nvmem->read_only ? nvmem_ro_dev_groups : nvmem_rw_dev_groups;
> + return nvmem_dev_groups;
> }
I was wondering if we can export nvmem_dev_group instead of this
nvmem_sysfs_get_groups() to fetch it.

Also, we need some logic in nvmem_register() to abort if bad combination
is given (i.e. root_only set but no reg_read), as returning 0 in
is_bin_visible callback does not abort. I can do that in my patch if you
want.

Regards,
Nicholas
>
> /*
> --
> 2.21.0
>

2020-03-25 07:37:32

by Greg Kroah-Hartman

[permalink] [raw]
Subject: Re: [PATCH 3/3] nvmem: core: use is_bin_visible for permissions

On Tue, Mar 24, 2020 at 11:05:07PM +0000, Nicholas Johnson wrote:
> On Tue, Mar 24, 2020 at 05:16:00PM +0000, Srinivas Kandagatla wrote:
> > By using is_bin_visible callback to set permissions will remove a large list
> > of attribute groups. These group permissions can be dynamically derived in
> > the callback.
> >
> > Suggested-by: Greg KH <[email protected]>
> > Signed-off-by: Srinivas Kandagatla <[email protected]>
> > ---
> > drivers/nvmem/nvmem-sysfs.c | 74 +++++++++----------------------------
> > 1 file changed, 18 insertions(+), 56 deletions(-)
> >
> > diff --git a/drivers/nvmem/nvmem-sysfs.c b/drivers/nvmem/nvmem-sysfs.c
> > index 8759c4470012..1ff1801048f6 100644
> > --- a/drivers/nvmem/nvmem-sysfs.c
> > +++ b/drivers/nvmem/nvmem-sysfs.c
> > @@ -103,6 +103,17 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj,
> >
> > return count;
> > }
> > +static umode_t nvmem_bin_attr_is_visible(struct kobject *kobj,
> > + struct bin_attribute *attr, int i)
> > +{
> > + struct device *dev = container_of(kobj, struct device, kobj);
> > + struct nvmem_device *nvmem = to_nvmem_device(dev);
> > +
> > + if (nvmem->root_only)
> > + return nvmem->read_only ? 0400 : 0600;
> > +
> > + return nvmem->read_only ? 0444 : 0644;
> > +}
> Looks like I did a pretty good job as I arrived at a similar result
> independently. Even added root_only to nvmem_device. You beat me to it.
> :)
>
> > const struct attribute_group **nvmem_sysfs_get_groups(
> > struct nvmem_device *nvmem,
> > const struct nvmem_config *config)
> > {
> > - if (config->root_only)
> > - return nvmem->read_only ?
> > - nvmem_ro_root_dev_groups :
> > - nvmem_rw_root_dev_groups;
> > -
> > - return nvmem->read_only ? nvmem_ro_dev_groups : nvmem_rw_dev_groups;
> > + return nvmem_dev_groups;
> > }
> I was wondering if we can export nvmem_dev_group instead of this
> nvmem_sysfs_get_groups() to fetch it.
>
> Also, we need some logic in nvmem_register() to abort if bad combination
> is given (i.e. root_only set but no reg_read), as returning 0 in
> is_bin_visible callback does not abort. I can do that in my patch if you
> want.

Returning 0 will cause the file to not be created at all, which is
probably what you want, right?

thanks,

greg k-h

2020-03-25 09:17:27

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH 3/3] nvmem: core: use is_bin_visible for permissions



On 24/03/2020 17:46, Greg KH wrote:
> On Tue, Mar 24, 2020 at 05:16:00PM +0000, Srinivas Kandagatla wrote:
>> By using is_bin_visible callback to set permissions will remove a large list
>> of attribute groups. These group permissions can be dynamically derived in
>> the callback.
>>
>> Suggested-by: Greg KH <[email protected]>
>> Signed-off-by: Srinivas Kandagatla <[email protected]>
>> ---
>> drivers/nvmem/nvmem-sysfs.c | 74 +++++++++----------------------------
>> 1 file changed, 18 insertions(+), 56 deletions(-)
>>
>> diff --git a/drivers/nvmem/nvmem-sysfs.c b/drivers/nvmem/nvmem-sysfs.c
>> index 8759c4470012..1ff1801048f6 100644
>> --- a/drivers/nvmem/nvmem-sysfs.c
>> +++ b/drivers/nvmem/nvmem-sysfs.c
>> @@ -103,6 +103,17 @@ static ssize_t bin_attr_nvmem_write(struct file *filp, struct kobject *kobj,
>>
>> return count;
>> }
>> +static umode_t nvmem_bin_attr_is_visible(struct kobject *kobj,
>> + struct bin_attribute *attr, int i)
>> +{
>> + struct device *dev = container_of(kobj, struct device, kobj);
>> + struct nvmem_device *nvmem = to_nvmem_device(dev);
>> +
>> + if (nvmem->root_only)
>> + return nvmem->read_only ? 0400 : 0600;
>> +
>> + return nvmem->read_only ? 0444 : 0644;
>> +}
>
> I don't know why this is so hard for me to read, but how about this
> instead:
>
> static umode_t nvmem_bin_attr_is_visible(struct kobject *kobj,
> struct bin_attribute *attr, int i)
> {
> struct device *dev = container_of(kobj, struct device, kobj);
> struct nvmem_device *nvmem = to_nvmem_device(dev);
> umode_t mode = 0400;
>
> if (!nvmem->root_only)
> mode |= 0044;
>
> if (!nvmem->read_only)
> mode |= 0200;
>
> return mode;
> }
>
> Did I get the logic corect?

That looks perfect and matches what is in upstream!
Thanks for suggesting this cleanup!

I will send v2 with this change!

--srini
>
> thanks,
>
> greg k-h
>

2020-03-25 09:37:11

by Srinivas Kandagatla

[permalink] [raw]
Subject: Re: [PATCH 3/3] nvmem: core: use is_bin_visible for permissions



On 24/03/2020 23:05, Nicholas Johnson wrote:
> I was wondering if we can export nvmem_dev_group instead of this
> nvmem_sysfs_get_groups() to fetch it.

Nope, nvmem_sysfs_get_groups() has a dummy stub for not selecting
CONFIG_NVMEM_SYSFS.

--srini