Skip to content

Commit eae1701

Browse files
neilbrownLinus Torvalds
authored andcommitted
[PATCH] md: initial sysfs support for md
Start using kobjects in mddevs, and provide a couple of simple attributes (level and disks). Attributes live in /sys/block/mdX/md/attr-name Signed-off-by: Neil Brown <neilb@suse.de> Cc: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
1 parent 4e5314b commit eae1701

File tree

2 files changed

+87
-1
lines changed

2 files changed

+87
-1
lines changed

drivers/md/md.c

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ static void mddev_put(mddev_t *mddev)
181181
if (!mddev->raid_disks && list_empty(&mddev->disks)) {
182182
list_del(&mddev->all_mddevs);
183183
blk_put_queue(mddev->queue);
184-
kfree(mddev);
184+
kobject_unregister(&mddev->kobj);
185185
}
186186
spin_unlock(&all_mddevs_lock);
187187
}
@@ -1551,6 +1551,85 @@ static void analyze_sbs(mddev_t * mddev)
15511551

15521552
}
15531553

1554+
struct md_sysfs_entry {
1555+
struct attribute attr;
1556+
ssize_t (*show)(mddev_t *, char *);
1557+
ssize_t (*store)(mddev_t *, const char *, size_t);
1558+
};
1559+
1560+
static ssize_t
1561+
md_show_level(mddev_t *mddev, char *page)
1562+
{
1563+
mdk_personality_t *p = mddev->pers;
1564+
if (p == NULL)
1565+
return 0;
1566+
if (mddev->level >= 0)
1567+
return sprintf(page, "RAID-%d\n", mddev->level);
1568+
else
1569+
return sprintf(page, "%s\n", p->name);
1570+
}
1571+
1572+
static struct md_sysfs_entry md_level = {
1573+
.attr = {.name = "level", .mode = S_IRUGO },
1574+
.show = md_show_level,
1575+
};
1576+
1577+
static ssize_t
1578+
md_show_rdisks(mddev_t *mddev, char *page)
1579+
{
1580+
return sprintf(page, "%d\n", mddev->raid_disks);
1581+
}
1582+
1583+
static struct md_sysfs_entry md_raid_disks = {
1584+
.attr = {.name = "raid_disks", .mode = S_IRUGO },
1585+
.show = md_show_rdisks,
1586+
};
1587+
1588+
static struct attribute *md_default_attrs[] = {
1589+
&md_level.attr,
1590+
&md_raid_disks.attr,
1591+
NULL,
1592+
};
1593+
1594+
static ssize_t
1595+
md_attr_show(struct kobject *kobj, struct attribute *attr, char *page)
1596+
{
1597+
struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
1598+
mddev_t *mddev = container_of(kobj, struct mddev_s, kobj);
1599+
1600+
if (!entry->show)
1601+
return -EIO;
1602+
return entry->show(mddev, page);
1603+
}
1604+
1605+
static ssize_t
1606+
md_attr_store(struct kobject *kobj, struct attribute *attr,
1607+
const char *page, size_t length)
1608+
{
1609+
struct md_sysfs_entry *entry = container_of(attr, struct md_sysfs_entry, attr);
1610+
mddev_t *mddev = container_of(kobj, struct mddev_s, kobj);
1611+
1612+
if (!entry->store)
1613+
return -EIO;
1614+
return entry->store(mddev, page, length);
1615+
}
1616+
1617+
static void md_free(struct kobject *ko)
1618+
{
1619+
mddev_t *mddev = container_of(ko, mddev_t, kobj);
1620+
kfree(mddev);
1621+
}
1622+
1623+
static struct sysfs_ops md_sysfs_ops = {
1624+
.show = md_attr_show,
1625+
.store = md_attr_store,
1626+
};
1627+
static struct kobj_type md_ktype = {
1628+
.release = md_free,
1629+
.sysfs_ops = &md_sysfs_ops,
1630+
.default_attrs = md_default_attrs,
1631+
};
1632+
15541633
int mdp_major = 0;
15551634

15561635
static struct kobject *md_probe(dev_t dev, int *part, void *data)
@@ -1592,6 +1671,11 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data)
15921671
add_disk(disk);
15931672
mddev->gendisk = disk;
15941673
up(&disks_sem);
1674+
mddev->kobj.parent = kobject_get(&disk->kobj);
1675+
mddev->kobj.k_name = NULL;
1676+
snprintf(mddev->kobj.name, KOBJ_NAME_LEN, "%s", "md");
1677+
mddev->kobj.ktype = &md_ktype;
1678+
kobject_register(&mddev->kobj);
15951679
return NULL;
15961680
}
15971681

include/linux/raid/md_k.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,8 @@ struct mddev_s
148148

149149
struct gendisk *gendisk;
150150

151+
struct kobject kobj;
152+
151153
/* Superblock information */
152154
int major_version,
153155
minor_version,

0 commit comments

Comments
 (0)