dm sysfs: introduce ability to add writable attributes
authorMike Snitzer <snitzer@redhat.com>
Fri, 27 Feb 2015 22:58:42 +0000 (17:58 -0500)
committerMike Snitzer <snitzer@redhat.com>
Wed, 15 Apr 2015 16:10:15 +0000 (12:10 -0400)
Add DM_ATTR_RW() macro and establish .store method in dm_sysfs_ops.

Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-sysfs.c

index c62c5ab6aed52018f6018f84f633124f6356e821..1271c31709fd7aa1709faf4ff80ce24df41901ab 100644 (file)
@@ -11,7 +11,7 @@
 struct dm_sysfs_attr {
        struct attribute attr;
        ssize_t (*show)(struct mapped_device *, char *);
-       ssize_t (*store)(struct mapped_device *, char *);
+       ssize_t (*store)(struct mapped_device *, const char *, size_t count);
 };
 
 #define DM_ATTR_RO(_name) \
@@ -39,6 +39,31 @@ static ssize_t dm_attr_show(struct kobject *kobj, struct attribute *attr,
        return ret;
 }
 
+#define DM_ATTR_RW(_name) \
+struct dm_sysfs_attr dm_attr_##_name = \
+       __ATTR(_name, S_IRUGO | S_IWUSR, dm_attr_##_name##_show, dm_attr_##_name##_store)
+
+static ssize_t dm_attr_store(struct kobject *kobj, struct attribute *attr,
+                            const char *page, size_t count)
+{
+       struct dm_sysfs_attr *dm_attr;
+       struct mapped_device *md;
+       ssize_t ret;
+
+       dm_attr = container_of(attr, struct dm_sysfs_attr, attr);
+       if (!dm_attr->store)
+               return -EIO;
+
+       md = dm_get_from_kobject(kobj);
+       if (!md)
+               return -EINVAL;
+
+       ret = dm_attr->store(md, page, count);
+       dm_put(md);
+
+       return ret;
+}
+
 static ssize_t dm_attr_name_show(struct mapped_device *md, char *buf)
 {
        if (dm_copy_name_and_uuid(md, buf, NULL))
@@ -77,12 +102,9 @@ static struct attribute *dm_attrs[] = {
 
 static const struct sysfs_ops dm_sysfs_ops = {
        .show   = dm_attr_show,
+       .store  = dm_attr_store,
 };
 
-/*
- * dm kobject is embedded in mapped_device structure
- * no need to define release function here
- */
 static struct kobj_type dm_ktype = {
        .sysfs_ops      = &dm_sysfs_ops,
        .default_attrs  = dm_attrs,