diff options
author | John Crispin <john@openwrt.org> | 2014-03-30 09:15:20 +0000 |
---|---|---|
committer | John Crispin <john@openwrt.org> | 2014-03-30 09:15:20 +0000 |
commit | bc03add2731202dfa428e8da61ed9bb4aa0ae8e5 (patch) | |
tree | 73292125e7aaf31331eda8e7fb894adbc24e555c /target/linux | |
parent | deba38f2a7ee7daea08905b6d45412c1469d7c84 (diff) | |
download | upstream-bc03add2731202dfa428e8da61ed9bb4aa0ae8e5.tar.gz upstream-bc03add2731202dfa428e8da61ed9bb4aa0ae8e5.tar.bz2 upstream-bc03add2731202dfa428e8da61ed9bb4aa0ae8e5.zip |
kernel: export gluebi info to sysfs
Export the ubi_num and vol_id into the sysfs record of the gluebi-
emulated mtd device. Previously userspace didn't have a way to
map gluebi-emulated devices back to their corresponding ubi volumes.
SVN-Revision: 40306
Diffstat (limited to 'target/linux')
-rw-r--r-- | target/linux/generic/patches-3.13/555-gluebi-sysfs-support.patch | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/target/linux/generic/patches-3.13/555-gluebi-sysfs-support.patch b/target/linux/generic/patches-3.13/555-gluebi-sysfs-support.patch new file mode 100644 index 0000000000..91817ba1e8 --- /dev/null +++ b/target/linux/generic/patches-3.13/555-gluebi-sysfs-support.patch @@ -0,0 +1,88 @@ +Index: linux-3.13.2/drivers/mtd/ubi/gluebi.c +=================================================================== +--- linux-3.13.2.orig/drivers/mtd/ubi/gluebi.c ++++ linux-3.13.2/drivers/mtd/ubi/gluebi.c +@@ -38,6 +38,7 @@ + #include <linux/mutex.h> + #include <linux/mtd/ubi.h> + #include <linux/mtd/mtd.h> ++#include <linux/export.h> + #include "ubi-media.h" + + #define err_msg(fmt, ...) \ +@@ -66,6 +67,16 @@ struct gluebi_device { + static LIST_HEAD(gluebi_devices); + static DEFINE_MUTEX(devices_mutex); + ++/* Device attribute handler for gluebi files in '/<sysfs>/class/mtd/mtdX' */ ++static ssize_t gluebi_attribute_show(struct device *dev, ++ struct device_attribute *attr, char *buf); ++ ++/* Device attributes corresponding to files in '/<sysfs>/class/mtd/mtdX' */ ++static struct device_attribute attr_vol_gluebi_ubi_num = ++__ATTR(gluebi_ubi_num, S_IRUGO, gluebi_attribute_show, NULL); ++static struct device_attribute attr_vol_gluebi_vol_id = ++__ATTR(gluebi_vol_id, S_IRUGO, gluebi_attribute_show, NULL); ++ + /** + * find_gluebi_nolock - find a gluebi device. + * @ubi_num: UBI device number +@@ -288,6 +299,36 @@ out_err: + } + + /** ++ * gluebi_attribute_show - "Show" method for gluebi files in sysfs. ++ */ ++static ssize_t gluebi_attribute_show(struct device *dev, ++ struct device_attribute *attr, char *buf) ++{ ++ int ret; ++ struct mtd_info *mtd = container_of(dev, struct mtd_info, dev); ++ struct gluebi_device *gluebi; ++ ++ gluebi_get_device(mtd); ++ gluebi = container_of(mtd, struct gluebi_device, mtd); ++ ++ /* This really shouldn't happen */ ++ if (!gluebi) ++ return -ENODEV; ++ ++ if (attr == &attr_vol_gluebi_ubi_num) { ++ ret = sprintf(buf, "%u\n", gluebi->ubi_num); ++ } else if (attr == &attr_vol_gluebi_vol_id) { ++ ret = sprintf(buf, "%u\n", gluebi->vol_id); ++ } else { ++ /* This must be a bug */ ++ ret = -EINVAL; ++ } ++ ++ gluebi_put_device(mtd); ++ return ret; ++} ++ ++/** + * gluebi_create - create a gluebi device for an UBI volume. + * @di: UBI device description object + * @vi: UBI volume description object +@@ -355,6 +396,8 @@ static int gluebi_create(struct ubi_devi + mutex_lock(&devices_mutex); + list_add_tail(&gluebi->list, &gluebi_devices); + mutex_unlock(&devices_mutex); ++ device_create_file(&mtd->dev, &attr_vol_gluebi_ubi_num); ++ device_create_file(&mtd->dev, &attr_vol_gluebi_vol_id); + return 0; + } + +@@ -380,8 +423,11 @@ static int gluebi_remove(struct ubi_volu + err = -ENOENT; + } else if (gluebi->refcnt) + err = -EBUSY; +- else ++ else { ++ device_remove_file(&gluebi->mtd.dev, &attr_vol_gluebi_ubi_num); ++ device_remove_file(&gluebi->mtd.dev, &attr_vol_gluebi_vol_id); + list_del(&gluebi->list); ++ } + mutex_unlock(&devices_mutex); + if (err) + return err; |