IB/core: Fix unable to change lifespan entry for hw_counters
authorParav Pandit <parav@mellanox.com>
Mon, 16 Oct 2017 05:45:14 +0000 (08:45 +0300)
committerDoug Ledford <dledford@redhat.com>
Wed, 18 Oct 2017 16:10:36 +0000 (12:10 -0400)
This patch fixes the case where 'lifespan' entry of the hw_counters
is not writable. Currently write callback is not exposed for for
the hw_counters sysfs operation. Due to this, modifying lifespan
value results into permission denied error in below example.

echo 10 > /sys/class/infiniband/mlx5_0/ports/1/hw_counters/lifespan
-bash: /sys/class/infiniband/mlx5_0/ports/1/hw_counters/lifespan:
Permission denied

This patch adds the hook to modify any attribute which implements
store() operation.

Fixes: b40f4757daa1 ("IB/core: Make device counter infrastructure dynamic")
Signed-off-by: Parav Pandit <parav@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/sysfs.c

index abc5ab5..e30d86f 100644 (file)
@@ -108,8 +108,22 @@ static ssize_t port_attr_show(struct kobject *kobj,
        return port_attr->show(p, port_attr, buf);
 }
 
+static ssize_t port_attr_store(struct kobject *kobj,
+                              struct attribute *attr,
+                              const char *buf, size_t count)
+{
+       struct port_attribute *port_attr =
+               container_of(attr, struct port_attribute, attr);
+       struct ib_port *p = container_of(kobj, struct ib_port, kobj);
+
+       if (!port_attr->store)
+               return -EIO;
+       return port_attr->store(p, port_attr, buf, count);
+}
+
 static const struct sysfs_ops port_sysfs_ops = {
-       .show = port_attr_show
+       .show   = port_attr_show,
+       .store  = port_attr_store
 };
 
 static ssize_t gid_attr_show(struct kobject *kobj,