lkml.org 
[lkml]   [2011]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH 1/3] [RFC] genhd: add a new attribute in device structure
Date
Allow users to set the preferred name of device via sysfs interface.

(Exsample) sda -> foo
# echo foo > /sys/block/sda/preferred_name
Suggested-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Suggested-by: Jon Masters <jcm@redhat.com>
Signed-off-by: Nao Nishijima <nao.nishijima.xt@hitachi.com>
---
block/genhd.c | 28 ++++++++++++++++++++++++++++
include/linux/device.h | 9 +++++++++
2 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/block/genhd.c b/block/genhd.c
index 95822ae..79b97f6 100644
--- a/block/genhd.c
+++ b/block/genhd.c
@@ -909,6 +909,31 @@ static int __init genhd_device_init(void)

subsys_initcall(genhd_device_init);

+static ssize_t preferred_name_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return snprintf(buf, PREFERRED_NAME_LEN, "%s\n", dev->preferred_name);
+}
+
+static ssize_t preferred_name_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ struct gendisk *disk = dev_to_disk(dev);
+ if (!count)
+ return -EINVAL;
+ if (strlen(buf) >= PREFERRED_NAME_LEN) {
+ printk(KERN_ERR "preferred_name: %s is too long\n", buf);
+ return -EINVAL;
+ }
+ dev->preferred_name = kasprintf(GFP_KERNEL, "%s", buf);
+ if (!dev->preferred_name)
+ return -ENOMEM;
+ printk(KERN_INFO "preferred_name: assigned %s to %s\n",
+ buf, disk->disk_name);
+ return count;
+}
+
static ssize_t disk_range_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
@@ -968,6 +993,8 @@ static ssize_t disk_discard_alignment_show(struct device *dev,
return sprintf(buf, "%d\n", queue_discard_alignment(disk->queue));
}

+static DEVICE_ATTR(preferred_name, S_IRUGO|S_IWUSR, preferred_name_show,
+ preferred_name_store);
static DEVICE_ATTR(range, S_IRUGO, disk_range_show, NULL);
static DEVICE_ATTR(ext_range, S_IRUGO, disk_ext_range_show, NULL);
static DEVICE_ATTR(removable, S_IRUGO, disk_removable_show, NULL);
@@ -990,6 +1017,7 @@ static struct device_attribute dev_attr_fail_timeout =
#endif

static struct attribute *disk_attrs[] = {
+ &dev_attr_preferred_name.attr,
&dev_attr_range.attr,
&dev_attr_ext_range.attr,
&dev_attr_removable.attr,
diff --git a/include/linux/device.h b/include/linux/device.h
index c66111a..0486644 100644
--- a/include/linux/device.h
+++ b/include/linux/device.h
@@ -490,6 +490,9 @@ struct device_dma_parameters {
unsigned long segment_boundary_mask;
};

+/* maximum length of preferred name */
+#define PREFERRED_NAME_LEN 256
+
/**
* struct device - The basic device structure
* @parent: The device's "parent" device, the device to which it is attached.
@@ -500,6 +503,7 @@ struct device_dma_parameters {
* See the comment of the struct device_private for detail.
* @kobj: A top-level, abstract class from which other classes are derived.
* @init_name: Initial name of the device.
+ * @preferred_name: Preferred name of the device.
* @type: The type of device.
* This identifies the device type and carries type-specific
* information.
@@ -556,6 +560,7 @@ struct device {

struct kobject kobj;
const char *init_name; /* initial name of the device */
+ const char *preferred_name; /* preferred name of the device */
const struct device_type *type;

struct mutex mutex; /* mutex to synchronize calls to
@@ -608,6 +613,10 @@ struct device {

static inline const char *dev_name(const struct device *dev)
{
+ /* Use the preferred name when users set it */
+ if (dev->preferred_name)
+ return dev->preferred_name;
+
/* Use the init name until the kobject becomes available */
if (dev->init_name)
return dev->init_name;


\
 
 \ /
  Last update: 2011-06-15 10:25    [W:0.416 / U:0.040 seconds]
©2003-2014 Jasper Spaans. Advertise on this site