Просмотр исходного кода

mtd: part: Add sysfs variable for offset of partition

This patch makes a sysfs variable called 'offset' on each partition
which contains the offset in bytes from the beginning of the master
device that the partition starts.

Signed-off-by: Dan Ehrenberg <dehrenberg@chromium.org>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Dan Ehrenberg 10 лет назад
Родитель
Сommit
a62c24d755
2 измененных файлов с 39 добавлено и 0 удалено
  1. 10 0
      Documentation/ABI/testing/sysfs-class-mtd
  2. 29 0
      drivers/mtd/mtdpart.c

+ 10 - 0
Documentation/ABI/testing/sysfs-class-mtd

@@ -222,3 +222,13 @@ Description:
 		The number of blocks that are marked as reserved, if any, in
 		The number of blocks that are marked as reserved, if any, in
 		this partition. These are typically used to store the in-flash
 		this partition. These are typically used to store the in-flash
 		bad block table (BBT).
 		bad block table (BBT).
+
+What:		/sys/class/mtd/mtdX/offset
+Date:		March 2015
+KernelVersion:	4.1
+Contact:	linux-mtd@lists.infradead.org
+Description:
+		For a partition, the offset of that partition from the start
+		of the master device in bytes. This attribute is absent on
+		main devices, so it can be used to distinguish between
+		partitions and devices that aren't partitions.

+ 29 - 0
drivers/mtd/mtdpart.c

@@ -554,6 +554,30 @@ out_register:
 	return slave;
 	return slave;
 }
 }
 
 
+static ssize_t mtd_partition_offset_show(struct device *dev,
+		struct device_attribute *attr, char *buf)
+{
+	struct mtd_info *mtd = dev_get_drvdata(dev);
+	struct mtd_part *part = PART(mtd);
+	return snprintf(buf, PAGE_SIZE, "%lld\n", part->offset);
+}
+
+static DEVICE_ATTR(offset, S_IRUGO, mtd_partition_offset_show, NULL);
+
+static const struct attribute *mtd_partition_attrs[] = {
+	&dev_attr_offset.attr,
+	NULL
+};
+
+static int mtd_add_partition_attrs(struct mtd_part *new)
+{
+	int ret = sysfs_create_files(&new->mtd.dev.kobj, mtd_partition_attrs);
+	if (ret)
+		printk(KERN_WARNING
+		       "mtd: failed to create partition attrs, err=%d\n", ret);
+	return ret;
+}
+
 int mtd_add_partition(struct mtd_info *master, const char *name,
 int mtd_add_partition(struct mtd_info *master, const char *name,
 		      long long offset, long long length)
 		      long long offset, long long length)
 {
 {
@@ -603,6 +627,8 @@ int mtd_add_partition(struct mtd_info *master, const char *name,
 
 
 	add_mtd_device(&new->mtd);
 	add_mtd_device(&new->mtd);
 
 
+	mtd_add_partition_attrs(new);
+
 	return ret;
 	return ret;
 err_inv:
 err_inv:
 	mutex_unlock(&mtd_partitions_mutex);
 	mutex_unlock(&mtd_partitions_mutex);
@@ -620,6 +646,8 @@ int mtd_del_partition(struct mtd_info *master, int partno)
 	list_for_each_entry_safe(slave, next, &mtd_partitions, list)
 	list_for_each_entry_safe(slave, next, &mtd_partitions, list)
 		if ((slave->master == master) &&
 		if ((slave->master == master) &&
 		    (slave->mtd.index == partno)) {
 		    (slave->mtd.index == partno)) {
+			sysfs_remove_files(&slave->mtd.dev.kobj,
+					   mtd_partition_attrs);
 			ret = del_mtd_device(&slave->mtd);
 			ret = del_mtd_device(&slave->mtd);
 			if (ret < 0)
 			if (ret < 0)
 				break;
 				break;
@@ -663,6 +691,7 @@ int add_mtd_partitions(struct mtd_info *master,
 		mutex_unlock(&mtd_partitions_mutex);
 		mutex_unlock(&mtd_partitions_mutex);
 
 
 		add_mtd_device(&slave->mtd);
 		add_mtd_device(&slave->mtd);
+		mtd_add_partition_attrs(slave);
 
 
 		cur_offset = slave->offset + slave->mtd.size;
 		cur_offset = slave->offset + slave->mtd.size;
 	}
 	}