1784aae73SMilan Broz /* 2784aae73SMilan Broz * Copyright (C) 2008 Red Hat, Inc. All rights reserved. 3784aae73SMilan Broz * 4784aae73SMilan Broz * This file is released under the GPL. 5784aae73SMilan Broz */ 6784aae73SMilan Broz 7784aae73SMilan Broz #include <linux/sysfs.h> 8784aae73SMilan Broz #include <linux/dm-ioctl.h> 9784aae73SMilan Broz #include "dm.h" 10784aae73SMilan Broz 11784aae73SMilan Broz struct dm_sysfs_attr { 12784aae73SMilan Broz struct attribute attr; 13784aae73SMilan Broz ssize_t (*show)(struct mapped_device *, char *); 14784aae73SMilan Broz ssize_t (*store)(struct mapped_device *, char *); 15784aae73SMilan Broz }; 16784aae73SMilan Broz 17784aae73SMilan Broz #define DM_ATTR_RO(_name) \ 18784aae73SMilan Broz struct dm_sysfs_attr dm_attr_##_name = \ 19784aae73SMilan Broz __ATTR(_name, S_IRUGO, dm_attr_##_name##_show, NULL) 20784aae73SMilan Broz 21784aae73SMilan Broz static ssize_t dm_attr_show(struct kobject *kobj, struct attribute *attr, 22784aae73SMilan Broz char *page) 23784aae73SMilan Broz { 24784aae73SMilan Broz struct dm_sysfs_attr *dm_attr; 25784aae73SMilan Broz struct mapped_device *md; 26784aae73SMilan Broz ssize_t ret; 27784aae73SMilan Broz 28784aae73SMilan Broz dm_attr = container_of(attr, struct dm_sysfs_attr, attr); 29784aae73SMilan Broz if (!dm_attr->show) 30784aae73SMilan Broz return -EIO; 31784aae73SMilan Broz 32784aae73SMilan Broz md = dm_get_from_kobject(kobj); 33784aae73SMilan Broz if (!md) 34784aae73SMilan Broz return -EINVAL; 35784aae73SMilan Broz 36784aae73SMilan Broz ret = dm_attr->show(md, page); 37784aae73SMilan Broz dm_put(md); 38784aae73SMilan Broz 39784aae73SMilan Broz return ret; 40784aae73SMilan Broz } 41784aae73SMilan Broz 42784aae73SMilan Broz static ssize_t dm_attr_name_show(struct mapped_device *md, char *buf) 43784aae73SMilan Broz { 44784aae73SMilan Broz if (dm_copy_name_and_uuid(md, buf, NULL)) 45784aae73SMilan Broz return -EIO; 46784aae73SMilan Broz 47784aae73SMilan Broz strcat(buf, "\n"); 48784aae73SMilan Broz return strlen(buf); 49784aae73SMilan Broz } 50784aae73SMilan Broz 51784aae73SMilan Broz static ssize_t dm_attr_uuid_show(struct mapped_device *md, char *buf) 52784aae73SMilan Broz { 53784aae73SMilan Broz if (dm_copy_name_and_uuid(md, NULL, buf)) 54784aae73SMilan Broz return -EIO; 55784aae73SMilan Broz 56784aae73SMilan Broz strcat(buf, "\n"); 57784aae73SMilan Broz return strlen(buf); 58784aae73SMilan Broz } 59784aae73SMilan Broz 60486d220fSPeter Rajnoha static ssize_t dm_attr_suspended_show(struct mapped_device *md, char *buf) 61486d220fSPeter Rajnoha { 62486d220fSPeter Rajnoha sprintf(buf, "%d\n", dm_suspended(md)); 63486d220fSPeter Rajnoha 64486d220fSPeter Rajnoha return strlen(buf); 65486d220fSPeter Rajnoha } 66486d220fSPeter Rajnoha 67784aae73SMilan Broz static DM_ATTR_RO(name); 68784aae73SMilan Broz static DM_ATTR_RO(uuid); 69486d220fSPeter Rajnoha static DM_ATTR_RO(suspended); 70784aae73SMilan Broz 71784aae73SMilan Broz static struct attribute *dm_attrs[] = { 72784aae73SMilan Broz &dm_attr_name.attr, 73784aae73SMilan Broz &dm_attr_uuid.attr, 74486d220fSPeter Rajnoha &dm_attr_suspended.attr, 75784aae73SMilan Broz NULL, 76784aae73SMilan Broz }; 77784aae73SMilan Broz 78784aae73SMilan Broz static struct sysfs_ops dm_sysfs_ops = { 79784aae73SMilan Broz .show = dm_attr_show, 80784aae73SMilan Broz }; 81784aae73SMilan Broz 82784aae73SMilan Broz /* 83784aae73SMilan Broz * dm kobject is embedded in mapped_device structure 84784aae73SMilan Broz * no need to define release function here 85784aae73SMilan Broz */ 86784aae73SMilan Broz static struct kobj_type dm_ktype = { 87784aae73SMilan Broz .sysfs_ops = &dm_sysfs_ops, 88784aae73SMilan Broz .default_attrs = dm_attrs, 89784aae73SMilan Broz }; 90784aae73SMilan Broz 91784aae73SMilan Broz /* 92784aae73SMilan Broz * Initialize kobj 93784aae73SMilan Broz * because nobody using md yet, no need to call explicit dm_get/put 94784aae73SMilan Broz */ 95784aae73SMilan Broz int dm_sysfs_init(struct mapped_device *md) 96784aae73SMilan Broz { 97784aae73SMilan Broz return kobject_init_and_add(dm_kobject(md), &dm_ktype, 98784aae73SMilan Broz &disk_to_dev(dm_disk(md))->kobj, 99784aae73SMilan Broz "%s", "dm"); 100784aae73SMilan Broz } 101784aae73SMilan Broz 102784aae73SMilan Broz /* 103784aae73SMilan Broz * Remove kobj, called after all references removed 104784aae73SMilan Broz */ 105784aae73SMilan Broz void dm_sysfs_exit(struct mapped_device *md) 106784aae73SMilan Broz { 107784aae73SMilan Broz kobject_put(dm_kobject(md)); 108784aae73SMilan Broz } 109