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