Skip to content

Commit

Permalink
mtd: part: Add sysfs variable for offset of partition
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dan Ehrenberg authored and Brian Norris committed Apr 6, 2015
1 parent 727dc61 commit a62c24d
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 0 deletions.
10 changes: 10 additions & 0 deletions Documentation/ABI/testing/sysfs-class-mtd
Original file line number Diff line number Diff line change
Expand Up @@ -222,3 +222,13 @@ Description:
The number of blocks that are marked as reserved, if any, in
this partition. These are typically used to store the in-flash
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 changes: 29 additions & 0 deletions drivers/mtd/mtdpart.c
Original file line number Diff line number Diff line change
Expand Up @@ -554,6 +554,30 @@ static struct mtd_part *allocate_partition(struct mtd_info *master,
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,
long long offset, long long length)
{
Expand Down Expand Up @@ -603,6 +627,8 @@ int mtd_add_partition(struct mtd_info *master, const char *name,

add_mtd_device(&new->mtd);

mtd_add_partition_attrs(new);

return ret;
err_inv:
mutex_unlock(&mtd_partitions_mutex);
Expand All @@ -620,6 +646,8 @@ int mtd_del_partition(struct mtd_info *master, int partno)
list_for_each_entry_safe(slave, next, &mtd_partitions, list)
if ((slave->master == master) &&
(slave->mtd.index == partno)) {
sysfs_remove_files(&slave->mtd.dev.kobj,
mtd_partition_attrs);
ret = del_mtd_device(&slave->mtd);
if (ret < 0)
break;
Expand Down Expand Up @@ -663,6 +691,7 @@ int add_mtd_partitions(struct mtd_info *master,
mutex_unlock(&mtd_partitions_mutex);

add_mtd_device(&slave->mtd);
mtd_add_partition_attrs(slave);

cur_offset = slave->offset + slave->mtd.size;
}
Expand Down

0 comments on commit a62c24d

Please sign in to comment.