blob: 861404f75bbd224006a6f3df1c34b9295b556f81 [file] [log] [blame]
From pjones@redhat.com Sat Jun 25 09:19:56 2005
Subject: /sys/block/hda/sample.sh
From: Peter Jones <pjones@redhat.com>
To: gregkh@suse.de
Date: Sat, 25 Jun 2005 11:57:46 -0400
Message-Id: <1119715067.22239.1.camel@localhost.localdomain>
Greg, here's a patch. I'm thinking maybe the selinux context should be
a config option or a sysctl, but if distros care it's easy to patch it
to the right thing or just replace it at runtime.
From: Peter Jones <pjones@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
block/genhd.c | 13 +++++++++++++
drivers/base/class.c | 22 ++++++++++++++++++++++
fs/partitions/check.c | 14 ++++++++++++++
include/linux/device.h | 1 +
4 files changed, 50 insertions(+)
--- gregkh-2.6.orig/block/genhd.c
+++ gregkh-2.6/block/genhd.c
@@ -401,6 +401,14 @@ static ssize_t disk_stats_read(struct ge
jiffies_to_msecs(disk_stat_read(disk, io_ticks)),
jiffies_to_msecs(disk_stat_read(disk, time_in_queue)));
}
+static ssize_t disk_sample_read(struct gendisk *disk, char *page)
+{
+ char buf[BDEVNAME_SIZE];
+
+ return sprintf(page, "#!/bin/sh\nmknod /dev/%s b %d %d\n",
+ disk_name(disk, 0, buf),
+ disk->major, disk->first_minor);
+}
static struct disk_attribute disk_attr_uevent = {
.attr = {.name = "uevent", .mode = S_IWUSR },
.store = disk_uevent_store
@@ -425,6 +433,10 @@ static struct disk_attribute disk_attr_s
.attr = {.name = "stat", .mode = S_IRUGO },
.show = disk_stats_read
};
+static struct disk_attribute disk_attr_sample = {
+ .attr = {.name = "sample.sh", .mode = S_IRUSR | S_IXUSR | S_IRUGO },
+ .show = disk_sample_read
+};
static struct attribute * default_attrs[] = {
&disk_attr_uevent.attr,
@@ -433,6 +445,7 @@ static struct attribute * default_attrs[
&disk_attr_removable.attr,
&disk_attr_size.attr,
&disk_attr_stat.attr,
+ &disk_attr_sample.attr,
NULL,
};
--- gregkh-2.6.orig/fs/partitions/check.c
+++ gregkh-2.6/fs/partitions/check.c
@@ -249,6 +249,15 @@ static ssize_t part_stat_read(struct hd_
p->ios[0], (unsigned long long)p->sectors[0],
p->ios[1], (unsigned long long)p->sectors[1]);
}
+static ssize_t part_sample_read(struct hd_struct *p, char *page)
+{
+ struct gendisk *disk = container_of(p->kobj.parent, struct gendisk, kobj);
+ char buf[BDEVNAME_SIZE];
+
+ return sprintf(page, "#!/bin/sh\nmknod /dev/%s b %d %d\n",
+ disk_name(disk, p->partno, buf),
+ disk->major, disk->first_minor + p->partno);
+}
static struct part_attribute part_attr_uevent = {
.attr = {.name = "uevent", .mode = S_IWUSR },
.store = part_uevent_store
@@ -269,6 +278,10 @@ static struct part_attribute part_attr_s
.attr = {.name = "stat", .mode = S_IRUGO },
.show = part_stat_read
};
+static struct part_attribute part_attr_sample = {
+ .attr = {.name = "sample.sh", .mode = S_IRUSR | S_IXUSR | S_IRUGO },
+ .show = part_sample_read
+};
static struct attribute * default_attrs[] = {
&part_attr_uevent.attr,
@@ -276,6 +289,7 @@ static struct attribute * default_attrs[
&part_attr_start.attr,
&part_attr_size.attr,
&part_attr_stat.attr,
+ &part_attr_sample.attr,
NULL,
};
--- gregkh-2.6.orig/drivers/base/class.c
+++ gregkh-2.6/drivers/base/class.c
@@ -468,6 +468,13 @@ static ssize_t store_uevent(struct class
return count;
}
+static ssize_t show_sample(struct class_device *class_dev, char *buf)
+{
+ return sprintf(buf, "#!/bin/sh\nmknod /dev/%s c %d %d\n",
+ kobject_name(&class_dev->kobj),
+ MAJOR(class_dev->devt), MINOR(class_dev->devt));
+}
+
void class_device_initialize(struct class_device *class_dev)
{
kobj_set_kset_s(class_dev, class_obj_subsys);
@@ -548,6 +555,21 @@ int class_device_add(struct class_device
attr->show = show_dev;
class_device_create_file(class_dev, attr);
class_dev->devt_attr = attr;
+
+ attr = kzalloc(sizeof(*attr), GFP_KERNEL);
+ if (!attr) {
+ error = -ENOMEM;
+ kobject_del(&class_dev->kobj);
+ goto register_done;
+ }
+
+ attr->attr.name = "sample.sh";
+ attr->attr.mode = S_IRUSR | S_IXUSR | S_IRUGO;
+ attr->attr.owner = parent_class->owner;
+ attr->show = show_sample;
+ attr->store = NULL;
+ class_device_create_file(class_dev, attr);
+ class_dev->sample_attr = attr;
}
class_device_add_attrs(class_dev);
--- gregkh-2.6.orig/include/linux/device.h
+++ gregkh-2.6/include/linux/device.h
@@ -222,6 +222,7 @@ struct class_device {
dev_t devt; /* dev_t, creates the sysfs "dev" */
struct class_device_attribute *devt_attr;
struct class_device_attribute uevent_attr;
+ struct class_device_attribute *sample_attr;
struct device * dev; /* not necessary, but nice to have */
void * class_data; /* class-specific data */
struct class_device *parent; /* parent of this child device, if there is one */