bc03add273
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
89 lines
2.7 KiB
Diff
89 lines
2.7 KiB
Diff
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;
|