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
owl
John Crispin 2014-03-30 09:15:20 +00:00
parent deba38f2a7
commit bc03add273
1 changed files with 88 additions and 0 deletions

View File

@ -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;