浏览代码

[PATCH] md: allow available size of component devices to be set via sysfs

Signed-off-by: Neil Brown <neilb@suse.de>
Acked-by: Greg KH <greg@kroah.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
NeilBrown 20 年之前
父节点
当前提交
83303b613d
共有 2 个文件被更改,包括 32 次插入0 次删除
  1. 7 0
      Documentation/md.txt
  2. 25 0
      drivers/md/md.c

+ 7 - 0
Documentation/md.txt

@@ -250,6 +250,13 @@ Each directory contains:
         the device before this offset us not touched, unless it is
         the device before this offset us not touched, unless it is
         used for storing metadata (Formats 1.1 and 1.2).
         used for storing metadata (Formats 1.1 and 1.2).
 
 
+      size
+        The amount of the device, after the offset, that can be used
+        for storage of data.  This will normally be the same as the
+	component_size.  This can be written while assembling an
+        array.  If a value less than the current component_size is
+        written, component_size will be reduced to this value.
+
 
 
 An active md device will also contain and entry for each active device
 An active md device will also contain and entry for each active device
 in the array.  These are named
 in the array.  These are named

+ 25 - 0
drivers/md/md.c

@@ -1686,12 +1686,37 @@ offset_store(mdk_rdev_t *rdev, const char *buf, size_t len)
 static struct rdev_sysfs_entry rdev_offset =
 static struct rdev_sysfs_entry rdev_offset =
 __ATTR(offset, 0644, offset_show, offset_store);
 __ATTR(offset, 0644, offset_show, offset_store);
 
 
+static ssize_t
+rdev_size_show(mdk_rdev_t *rdev, char *page)
+{
+	return sprintf(page, "%llu\n", (unsigned long long)rdev->size);
+}
+
+static ssize_t
+rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+{
+	char *e;
+	unsigned long long size = simple_strtoull(buf, &e, 10);
+	if (e==buf || (*e && *e != '\n'))
+		return -EINVAL;
+	if (rdev->mddev->pers)
+		return -EBUSY;
+	rdev->size = size;
+	if (size < rdev->mddev->size || rdev->mddev->size == 0)
+		rdev->mddev->size = size;
+	return len;
+}
+
+static struct rdev_sysfs_entry rdev_size =
+__ATTR(size, 0644, rdev_size_show, rdev_size_store);
+
 static struct attribute *rdev_default_attrs[] = {
 static struct attribute *rdev_default_attrs[] = {
 	&rdev_state.attr,
 	&rdev_state.attr,
 	&rdev_super.attr,
 	&rdev_super.attr,
 	&rdev_errors.attr,
 	&rdev_errors.attr,
 	&rdev_slot.attr,
 	&rdev_slot.attr,
 	&rdev_offset.attr,
 	&rdev_offset.attr,
+	&rdev_size.attr,
 	NULL,
 	NULL,
 };
 };
 static ssize_t
 static ssize_t