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
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
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
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
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
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
>
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
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
>
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