* [RFC] [PATCH] UBI: rewrite of sysfs.c
@ 2007-03-13 15:10 Alexander Schmidt
2007-03-13 16:38 ` Artem Bityutskiy
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Alexander Schmidt @ 2007-03-13 15:10 UTC (permalink / raw)
To: linux-mtd@lists.infradead.org
Cc: Artem.Bityutskiy, Thomas Gleixner, Frank Haverkamp
Hi,
I rewrote the sysfs interface to use struct device instead of struct
class_device. This implies an interface change, as sysfs files are now
ordered in a different manner:
/sys/class/ubi/ubiX/ for device files
/sys/class/ubi/ubiX_Y/ for volumes
Before we had
/sys/class/ubi/ubiX/ for device files
/sys/class/ubi/ubiX/Y/ for volumes
Please let me know if you got any objections on this or if you have
proposals for a better implementation.
Signed-off-by: Alexander Schmidt <alexs@linux.vnet.ibm.com>
---
drivers/mtd/ubi/sysfs.c | 464 +++++++++++++++---------------------------------
drivers/mtd/ubi/ubi.h | 4
2 files changed, 152 insertions(+), 316 deletions(-)
--- dedekind-ubi-2.6.orig/drivers/mtd/ubi/sysfs.c
+++ dedekind-ubi-2.6/drivers/mtd/ubi/sysfs.c
@@ -64,41 +64,33 @@ void ubi_sysfs_infr_close(void)
class_destroy(ubi_class);
}
-static void dev_release(struct class_device *dev);
-static ssize_t dev_eraseblock_size_show(struct class_device *dev, char *buf);
-static ssize_t dev_avail_eraseblocks_show(struct class_device *dev, char *buf);
-static ssize_t dev_total_eraseblocks_show(struct class_device *dev, char *buf);
-static ssize_t dev_volumes_count_show(struct class_device *dev, char *buf);
-static ssize_t dev_max_ec_show(struct class_device *dev, char *buf);
-static ssize_t dev_reserved_for_bad_show(struct class_device *dev, char *buf);
-static ssize_t dev_bad_peb_count_show(struct class_device *dev, char *buf);
-static ssize_t dev_max_vol_count_show(struct class_device *dev, char *buf);
-static ssize_t dev_min_io_size_show(struct class_device *dev, char *buf);
-static ssize_t dev_bgt_enabled_show(struct class_device *dev, char *buf);
+static void dev_release(struct device *dev);
+static ssize_t dev_attribute_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
/*
* Class device attributes corresponding to files in '/<sysfs>/class/ubi/ubiX'.
*/
-static struct class_device_attribute dev_eraseblock_size =
- __ATTR(eraseblock_size, S_IRUGO, dev_eraseblock_size_show, NULL);
-static struct class_device_attribute dev_avail_eraseblocks =
- __ATTR(avail_eraseblocks, S_IRUGO, dev_avail_eraseblocks_show, NULL);
-static struct class_device_attribute dev_total_eraseblocks =
- __ATTR(total_eraseblocks, S_IRUGO, dev_total_eraseblocks_show, NULL);
-static struct class_device_attribute dev_volumes_count =
- __ATTR(volumes_count, S_IRUGO, dev_volumes_count_show, NULL);
-static struct class_device_attribute dev_max_ec =
- __ATTR(max_ec, S_IRUGO, dev_max_ec_show, NULL);
-static struct class_device_attribute dev_reserved_for_bad =
- __ATTR(reserved_for_bad, S_IRUGO, dev_reserved_for_bad_show, NULL);
-static struct class_device_attribute dev_bad_peb_count =
- __ATTR(bad_peb_count, S_IRUGO, dev_bad_peb_count_show, NULL);
-static struct class_device_attribute dev_max_vol_count =
- __ATTR(max_vol_count, S_IRUGO, dev_max_vol_count_show, NULL);
-static struct class_device_attribute dev_min_io_size =
- __ATTR(min_io_size, S_IRUGO, dev_min_io_size_show, NULL);
-static struct class_device_attribute dev_bgt_enabled =
- __ATTR(bgt_enabled, S_IRUGO, dev_bgt_enabled_show, NULL);
+static struct device_attribute dev_eraseblock_size =
+ __ATTR(eraseblock_size, S_IRUGO, dev_attribute_show, NULL);
+static struct device_attribute dev_avail_eraseblocks =
+ __ATTR(avail_eraseblocks, S_IRUGO, dev_attribute_show, NULL);
+static struct device_attribute dev_total_eraseblocks =
+ __ATTR(total_eraseblocks, S_IRUGO, dev_attribute_show, NULL);
+static struct device_attribute dev_volumes_count =
+ __ATTR(volumes_count, S_IRUGO, dev_attribute_show, NULL);
+static struct device_attribute dev_max_ec =
+ __ATTR(max_ec, S_IRUGO, dev_attribute_show, NULL);
+static struct device_attribute dev_reserved_for_bad =
+ __ATTR(reserved_for_bad, S_IRUGO, dev_attribute_show, NULL);
+static struct device_attribute dev_bad_peb_count =
+ __ATTR(bad_peb_count, S_IRUGO, dev_attribute_show, NULL);
+static struct device_attribute dev_max_vol_count =
+ __ATTR(max_vol_count, S_IRUGO, dev_attribute_show, NULL);
+static struct device_attribute dev_min_io_size =
+ __ATTR(min_io_size, S_IRUGO, dev_attribute_show, NULL);
+static struct device_attribute dev_bgt_enabled =
+ __ATTR(bgt_enabled, S_IRUGO, dev_attribute_show, NULL);
/**
* ubi_sysfs_init - initialize sysfs for an UBI device.
@@ -115,64 +107,64 @@ int ubi_sysfs_init(struct ubi_info *ubi)
ubi->uif.dev.release = dev_release;
ubi->uif.dev.devt = MKDEV(ubi->uif.major, 0);
ubi->uif.dev.class = ubi_class;
- sprintf(&ubi->uif.dev.class_id[0], UBI_STRING_NAME"%d", ubi->ubi_num);
- err = class_device_register(&ubi->uif.dev);
+ sprintf(&ubi->uif.dev.bus_id[0], UBI_STRING_NAME"%d", ubi->ubi_num);
+ err = device_register(&ubi->uif.dev);
if (err)
goto out;
- err = class_device_create_file(&ubi->uif.dev, &dev_eraseblock_size);
+ err = device_create_file(&ubi->uif.dev, &dev_eraseblock_size);
if (err)
goto out_unregister;
- err = class_device_create_file(&ubi->uif.dev, &dev_avail_eraseblocks);
+ err = device_create_file(&ubi->uif.dev, &dev_avail_eraseblocks);
if (err)
goto out_eraseblock_size;
- err = class_device_create_file(&ubi->uif.dev, &dev_total_eraseblocks);
+ err = device_create_file(&ubi->uif.dev, &dev_total_eraseblocks);
if (err)
goto out_avail_eraseblocks;
- err = class_device_create_file(&ubi->uif.dev, &dev_volumes_count);
+ err = device_create_file(&ubi->uif.dev, &dev_volumes_count);
if (err)
goto out_total_eraseblocks;
- err = class_device_create_file(&ubi->uif.dev, &dev_max_ec);
+ err = device_create_file(&ubi->uif.dev, &dev_max_ec);
if (err)
goto out_volumes_count;
- err = class_device_create_file(&ubi->uif.dev, &dev_reserved_for_bad);
+ err = device_create_file(&ubi->uif.dev, &dev_reserved_for_bad);
if (err)
goto out_volumes_max_ec;
- err = class_device_create_file(&ubi->uif.dev, &dev_bad_peb_count);
+ err = device_create_file(&ubi->uif.dev, &dev_bad_peb_count);
if (err)
goto out_reserved_for_bad;
- err = class_device_create_file(&ubi->uif.dev, &dev_max_vol_count);
+ err = device_create_file(&ubi->uif.dev, &dev_max_vol_count);
if (err)
goto out_bad_peb_count;
- err = class_device_create_file(&ubi->uif.dev, &dev_min_io_size);
+ err = device_create_file(&ubi->uif.dev, &dev_min_io_size);
if (err)
goto out_max_vol_count;
- err = class_device_create_file(&ubi->uif.dev, &dev_bgt_enabled);
+ err = device_create_file(&ubi->uif.dev, &dev_bgt_enabled);
if (err)
goto out_min_io_size;
return 0;
out_min_io_size:
- class_device_remove_file(&ubi->uif.dev, &dev_min_io_size);
+ device_remove_file(&ubi->uif.dev, &dev_min_io_size);
out_max_vol_count:
- class_device_remove_file(&ubi->uif.dev, &dev_max_vol_count);
+ device_remove_file(&ubi->uif.dev, &dev_max_vol_count);
out_bad_peb_count:
- class_device_remove_file(&ubi->uif.dev, &dev_bad_peb_count);
+ device_remove_file(&ubi->uif.dev, &dev_bad_peb_count);
out_reserved_for_bad:
- class_device_remove_file(&ubi->uif.dev, &dev_reserved_for_bad);
+ device_remove_file(&ubi->uif.dev, &dev_reserved_for_bad);
out_volumes_max_ec:
- class_device_remove_file(&ubi->uif.dev, &dev_max_ec);
+ device_remove_file(&ubi->uif.dev, &dev_max_ec);
out_volumes_count:
- class_device_remove_file(&ubi->uif.dev, &dev_volumes_count);
+ device_remove_file(&ubi->uif.dev, &dev_volumes_count);
out_total_eraseblocks:
- class_device_remove_file(&ubi->uif.dev, &dev_total_eraseblocks);
+ device_remove_file(&ubi->uif.dev, &dev_total_eraseblocks);
out_avail_eraseblocks:
- class_device_remove_file(&ubi->uif.dev, &dev_avail_eraseblocks);
+ device_remove_file(&ubi->uif.dev, &dev_avail_eraseblocks);
out_eraseblock_size:
- class_device_remove_file(&ubi->uif.dev, &dev_eraseblock_size);
+ device_remove_file(&ubi->uif.dev, &dev_eraseblock_size);
out_unregister:
- class_device_unregister(&ubi->uif.dev);
+ device_unregister(&ubi->uif.dev);
out:
ubi_err("failed to initialize sysfs for UBI device %d", ubi->ubi_num);
return err;
@@ -185,49 +177,43 @@ out:
*/
void ubi_sysfs_close(struct ubi_info *ubi)
{
- class_device_remove_file(&ubi->uif.dev, &dev_bgt_enabled);
- class_device_remove_file(&ubi->uif.dev, &dev_min_io_size);
- class_device_remove_file(&ubi->uif.dev, &dev_max_vol_count);
- class_device_remove_file(&ubi->uif.dev, &dev_bad_peb_count);
- class_device_remove_file(&ubi->uif.dev, &dev_reserved_for_bad);
- class_device_remove_file(&ubi->uif.dev, &dev_max_ec);
- class_device_remove_file(&ubi->uif.dev, &dev_volumes_count);
- class_device_remove_file(&ubi->uif.dev, &dev_total_eraseblocks);
- class_device_remove_file(&ubi->uif.dev, &dev_avail_eraseblocks);
- class_device_remove_file(&ubi->uif.dev, &dev_eraseblock_size);
- class_device_unregister(&ubi->uif.dev);
-}
-
-static void vol_release(struct class_device *dev);
-static ssize_t vol_reserved_ebs_show(struct class_device *dev, char *buf);
-static ssize_t vol_type_show(struct class_device *dev, char *buf);
-static ssize_t vol_name_show(struct class_device *dev, char *buf);
-static ssize_t vol_corrupted_show(struct class_device *dev, char *buf);
-static ssize_t vol_alignment_show(struct class_device *dev, char *buf);
-static ssize_t vol_usable_eb_size_show(struct class_device *dev, char *buf);
-static ssize_t vol_data_bytes_show(struct class_device *dev, char *buf);
-static ssize_t vol_upd_marker_show(struct class_device *dev, char *buf);
+ device_remove_file(&ubi->uif.dev, &dev_bgt_enabled);
+ device_remove_file(&ubi->uif.dev, &dev_min_io_size);
+ device_remove_file(&ubi->uif.dev, &dev_max_vol_count);
+ device_remove_file(&ubi->uif.dev, &dev_bad_peb_count);
+ device_remove_file(&ubi->uif.dev, &dev_reserved_for_bad);
+ device_remove_file(&ubi->uif.dev, &dev_max_ec);
+ device_remove_file(&ubi->uif.dev, &dev_volumes_count);
+ device_remove_file(&ubi->uif.dev, &dev_total_eraseblocks);
+ device_remove_file(&ubi->uif.dev, &dev_avail_eraseblocks);
+ device_remove_file(&ubi->uif.dev, &dev_eraseblock_size);
+ device_unregister(&ubi->uif.dev);
+}
+
+static void vol_release(struct device *dev);
+static ssize_t vol_attribute_show(struct device *dev,
+ struct device_attribute *attr, char *buf);
/*
* Class device attributes corresponding to files in
* '/<sysfs>/class/ubi/ubiX/Y'.
*/
-static struct class_device_attribute vol_reserved_ebs =
- __ATTR(reserved_ebs, S_IRUGO, vol_reserved_ebs_show, NULL);
-static struct class_device_attribute vol_type =
- __ATTR(type, S_IRUGO, vol_type_show, NULL);
-static struct class_device_attribute vol_name =
- __ATTR(name, S_IRUGO, vol_name_show, NULL);
-static struct class_device_attribute vol_corrupted =
- __ATTR(corrupted, S_IRUGO, vol_corrupted_show, NULL);
-static struct class_device_attribute vol_alignment =
- __ATTR(alignment, S_IRUGO, vol_alignment_show, NULL);
-static struct class_device_attribute vol_usable_eb_size =
- __ATTR(usable_eb_size, S_IRUGO, vol_usable_eb_size_show, NULL);
-static struct class_device_attribute vol_data_bytes =
- __ATTR(data_bytes, S_IRUGO, vol_data_bytes_show, NULL);
-static struct class_device_attribute vol_upd_marker =
- __ATTR(upd_marker, S_IRUGO, vol_upd_marker_show, NULL);
+static struct device_attribute vol_reserved_ebs =
+ __ATTR(reserved_ebs, S_IRUGO, vol_attribute_show, NULL);
+static struct device_attribute vol_type =
+ __ATTR(type, S_IRUGO, vol_attribute_show, NULL);
+static struct device_attribute vol_name =
+ __ATTR(name, S_IRUGO, vol_attribute_show, NULL);
+static struct device_attribute vol_corrupted =
+ __ATTR(corrupted, S_IRUGO, vol_attribute_show, NULL);
+static struct device_attribute vol_alignment =
+ __ATTR(alignment, S_IRUGO, vol_attribute_show, NULL);
+static struct device_attribute vol_usable_eb_size =
+ __ATTR(usable_eb_size, S_IRUGO, vol_attribute_show, NULL);
+static struct device_attribute vol_data_bytes =
+ __ATTR(data_bytes, S_IRUGO, vol_attribute_show, NULL);
+static struct device_attribute vol_upd_marker =
+ __ATTR(upd_marker, S_IRUGO, vol_attribute_show, NULL);
/**
* ubi_sysfs_vol_init - initialize sysfs for an UBI volume.
@@ -250,33 +236,33 @@ int ubi_sysfs_vol_init(struct ubi_info *
vol->dev.parent = &ubi->uif.dev;
vol->dev.devt = MKDEV(ubi->uif.major, vol->vol_id + 1);
vol->dev.class = ubi_class;
- sprintf(&vol->dev.class_id[0], "%d", vol->vol_id);
- err = class_device_register(&vol->dev);
+ sprintf(&vol->dev.bus_id[0], "%s_%d", ubi->uif.ubi_name, vol->vol_id);
+ err = device_register(&vol->dev);
if (err)
return err;
- err = class_device_create_file(&vol->dev, &vol_reserved_ebs);
+ err = device_create_file(&vol->dev, &vol_reserved_ebs);
if (err)
return err;
- err = class_device_create_file(&vol->dev, &vol_type);
+ err = device_create_file(&vol->dev, &vol_type);
if (err)
return err;
- err = class_device_create_file(&vol->dev, &vol_name);
+ err = device_create_file(&vol->dev, &vol_name);
if (err)
return err;
- err = class_device_create_file(&vol->dev, &vol_corrupted);
+ err = device_create_file(&vol->dev, &vol_corrupted);
if (err)
return err;
- err = class_device_create_file(&vol->dev, &vol_alignment);
+ err = device_create_file(&vol->dev, &vol_alignment);
if (err)
return err;
- err = class_device_create_file(&vol->dev, &vol_usable_eb_size);
+ err = device_create_file(&vol->dev, &vol_usable_eb_size);
if (err)
return err;
- err = class_device_create_file(&vol->dev, &vol_data_bytes);
+ err = device_create_file(&vol->dev, &vol_data_bytes);
if (err)
return err;
- err = class_device_create_file(&vol->dev, &vol_upd_marker);
+ err = device_create_file(&vol->dev, &vol_upd_marker);
if (err)
return err;
return 0;
@@ -289,15 +275,15 @@ int ubi_sysfs_vol_init(struct ubi_info *
*/
void ubi_sysfs_vol_close(struct ubi_uif_volume *vol)
{
- class_device_remove_file(&vol->dev, &vol_upd_marker);
- class_device_remove_file(&vol->dev, &vol_data_bytes);
- class_device_remove_file(&vol->dev, &vol_usable_eb_size);
- class_device_remove_file(&vol->dev, &vol_alignment);
- class_device_remove_file(&vol->dev, &vol_corrupted);
- class_device_remove_file(&vol->dev, &vol_name);
- class_device_remove_file(&vol->dev, &vol_type);
- class_device_remove_file(&vol->dev, &vol_reserved_ebs);
- class_device_unregister(&vol->dev);
+ device_remove_file(&vol->dev, &vol_upd_marker);
+ device_remove_file(&vol->dev, &vol_data_bytes);
+ device_remove_file(&vol->dev, &vol_usable_eb_size);
+ device_remove_file(&vol->dev, &vol_alignment);
+ device_remove_file(&vol->dev, &vol_corrupted);
+ device_remove_file(&vol->dev, &vol_name);
+ device_remove_file(&vol->dev, &vol_type);
+ device_remove_file(&vol->dev, &vol_reserved_ebs);
+ device_unregister(&vol->dev);
}
/**
@@ -308,7 +294,7 @@ void ubi_sysfs_vol_close(struct ubi_uif_
*
* This function returns a pointer to the UBI device description object.
*/
-static inline struct ubi_info *dev2ubi(struct class_device *dev)
+static inline struct ubi_info *dev2ubi(struct device *dev)
{
return container_of(dev, struct ubi_info, uif.dev);
}
@@ -320,86 +306,45 @@ static ssize_t ubi_version_show(struct c
}
/* "Release" method for UBI devices */
-static void dev_release(struct class_device *dev)
+static void dev_release(struct device *dev)
{
return;
}
/* "Show" method for files in '/<sysfs>/class/ubi/ubiX/' */
-static ssize_t dev_eraseblock_size_show(struct class_device *dev, char *buf)
-{
- const struct ubi_info *ubi = dev2ubi(dev);
-
- return sprintf(buf, "%d\n", ubi->io.leb_size);
-}
-
-static ssize_t dev_avail_eraseblocks_show(struct class_device *dev, char *buf)
-{
- const struct ubi_info *ubi = dev2ubi(dev);
-
- return sprintf(buf, "%d\n", ubi->acc.avail_pebs);
-}
-
-static ssize_t dev_total_eraseblocks_show(struct class_device *dev, char *buf)
-{
- const struct ubi_info *ubi = dev2ubi(dev);
-
- return sprintf(buf, "%d\n", ubi->io.good_peb_count);
-}
-
-static ssize_t dev_volumes_count_show(struct class_device *dev, char *buf)
-{
- const struct ubi_info *ubi = dev2ubi(dev);
-
- return sprintf(buf, "%d\n", ubi->vtbl.vol_count);
-}
-
-static ssize_t dev_max_ec_show(struct class_device *dev, char *buf)
-{
- const struct ubi_info *ubi = dev2ubi(dev);
-
- return sprintf(buf, "%d\n", ubi->wl.max_ec);
-}
-
-static ssize_t dev_reserved_for_bad_show(struct class_device *dev, char *buf)
-{
- const struct ubi_info *ubi = dev2ubi(dev);
-
- return sprintf(buf, "%d\n", ubi->acc.beb_rsvd_pebs);
-}
-
-static ssize_t dev_bad_peb_count_show(struct class_device *dev, char *buf)
-{
- const struct ubi_info *ubi = dev2ubi(dev);
-
- return sprintf(buf, "%d\n", ubi->io.bad_peb_count);
-}
-
-static ssize_t dev_max_vol_count_show(struct class_device *dev, char *buf)
-{
- const struct ubi_info *ubi = dev2ubi(dev);
-
- return sprintf(buf, "%d\n", ubi->vtbl.vt_slots);
-}
-
-static ssize_t dev_min_io_size_show(struct class_device *dev, char *buf)
-{
- const struct ubi_info *ubi = dev2ubi(dev);
-
- return sprintf(buf, "%d\n", ubi->io.min_io_size);
-}
-
-static ssize_t dev_bgt_enabled_show(struct class_device *dev, char *buf)
+static ssize_t dev_attribute_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
const struct ubi_info *ubi = dev2ubi(dev);
int enabled;
- if (DBG_DISABLE_BGT || ubi->io.ro_mode)
- enabled = 0;
- else
- enabled = 1;
+ if (attr == &dev_eraseblock_size)
+ return sprintf(buf, "%d\n", ubi->io.leb_size);
+ else if (attr == &dev_avail_eraseblocks)
+ return sprintf(buf, "%d\n", ubi->acc.avail_pebs);
+ else if (attr == &dev_total_eraseblocks)
+ return sprintf(buf, "%d\n", ubi->io.good_peb_count);
+ else if (attr == &dev_volumes_count)
+ return sprintf(buf, "%d\n", ubi->vtbl.vol_count);
+ else if (attr == &dev_max_ec)
+ return sprintf(buf, "%d\n", ubi->wl.max_ec);
+ else if (attr == &dev_reserved_for_bad)
+ return sprintf(buf, "%d\n", ubi->acc.beb_rsvd_pebs);
+ else if (attr == &dev_bad_peb_count)
+ return sprintf(buf, "%d\n", ubi->io.bad_peb_count);
+ else if (attr == &dev_max_vol_count)
+ return sprintf(buf, "%d\n", ubi->vtbl.vt_slots);
+ else if (attr == &dev_min_io_size)
+ return sprintf(buf, "%d\n", ubi->io.min_io_size);
+ else if (attr == &dev_bgt_enabled) {
+ if (DBG_DISABLE_BGT || ubi->io.ro_mode)
+ enabled = 0;
+ else
+ enabled = 1;
+ return sprintf(buf, "%d\n", enabled);
+ }
- return sprintf(buf, "%d\n", enabled);
+ return 0;
}
/**
@@ -410,13 +355,13 @@ static ssize_t dev_bgt_enabled_show(stru
*
* This function returns a pointer to the UBI volume description object.
*/
-static inline struct ubi_uif_volume *dev2vol(struct class_device *dev)
+static inline struct ubi_uif_volume *dev2vol(struct device *dev)
{
return container_of(dev, struct ubi_uif_volume, dev);
}
/* Release method for volume devices */
-static void vol_release(struct class_device *dev)
+static void vol_release(struct device *dev)
{
const struct ubi_uif_volume *vol = dev2vol(dev);
@@ -425,7 +370,7 @@ static void vol_release(struct class_dev
}
/*
- * "Show" methods for files in '/<sysfs>/class/ubi/ubiX/Y/'.
+ * "Show" method for files in '/<sysfs>/class/ubi/ubiX/Y/'.
*
* Consider a situation:
* A. process 1 opens a sysfs file related to volume Y, say
@@ -438,29 +383,12 @@ static void vol_release(struct class_dev
* the UBI UIF volume information structure.
*/
-static ssize_t vol_reserved_ebs_show(struct class_device *dev, char *buf)
+static ssize_t vol_attribute_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- int ret;
+ int usable_eb_size, ret = 0;
const struct ubi_vtbl_vtr *vtr;
- struct ubi_uif_volume *vol = dev2vol(dev);
-
- spin_lock(&vol->vol_lock);
- if (vol->removed) {
- spin_unlock(&vol->vol_lock);
- dbg_err("volume %d was removed", vol->vol_id);
- return -EIO;
- }
- vtr = ubi_vtbl_get_vtr(vol->ubi, vol->vol_id);
- ret = sprintf(buf, "%d\n", vtr->reserved_pebs);
- spin_unlock(&vol->vol_lock);
- return ret;
-}
-
-static ssize_t vol_type_show(struct class_device *dev, char *buf)
-{
- int ret;
const char *tp;
- const struct ubi_vtbl_vtr *vtr;
struct ubi_uif_volume *vol = dev2vol(dev);
spin_lock(&vol->vol_lock);
@@ -470,117 +398,25 @@ static ssize_t vol_type_show(struct clas
return -EIO;
}
vtr = ubi_vtbl_get_vtr(vol->ubi, vol->vol_id);
- tp = vtr->vol_type == UBI_DYNAMIC_VOLUME ? "dynamic" : "static";
- ret = sprintf(buf, "%s\n", tp);
+ if (attr == &vol_reserved_ebs)
+ ret = sprintf(buf, "%d\n", vtr->reserved_pebs);
+ else if (attr == &vol_type) {
+ tp = vtr->vol_type == UBI_DYNAMIC_VOLUME ? "dynamic" : "static";
+ ret = sprintf(buf, "%s\n", tp);
+ } else if (attr == &vol_name)
+ ret = sprintf(buf, "%s\n", vtr->name);
+ else if (attr == &vol_corrupted)
+ ret = sprintf(buf, "%d\n", vtr->corrupted);
+ else if (attr == &vol_alignment)
+ ret = sprintf(buf, "%d\n", vtr->alignment);
+ else if (attr == &vol_usable_eb_size) {
+ usable_eb_size = vol->ubi->io.leb_size - vtr->data_pad;
+ ret = sprintf(buf, "%d\n", usable_eb_size);
+ } else if (attr == &vol_data_bytes)
+ ret = sprintf(buf, "%lld\n", vtr->used_bytes);
+ else if (attr == &vol_upd_marker)
+ ret = sprintf(buf, "%d\n", vtr->upd_marker);
spin_unlock(&vol->vol_lock);
return ret;
}
-static ssize_t vol_name_show(struct class_device *dev, char *buf)
-{
- int ret;
- const struct ubi_vtbl_vtr *vtr;
- struct ubi_uif_volume *vol = dev2vol(dev);
-
- spin_lock(&vol->vol_lock);
- if (vol->removed) {
- spin_unlock(&vol->vol_lock);
- dbg_err("volume %d was removed", vol->vol_id);
- return -EIO;
- }
- vtr = ubi_vtbl_get_vtr(vol->ubi, vol->vol_id);
- ret = sprintf(buf, "%s\n", vtr->name);
- spin_unlock(&vol->vol_lock);
- return ret;
-}
-
-static ssize_t vol_corrupted_show(struct class_device *dev, char *buf)
-{
- int ret;
- const struct ubi_vtbl_vtr *vtr;
- struct ubi_uif_volume *vol = dev2vol(dev);
-
- spin_lock(&vol->vol_lock);
- if (vol->removed) {
- spin_unlock(&vol->vol_lock);
- dbg_err("volume %d was removed", vol->vol_id);
- return -EIO;
- }
- vtr = ubi_vtbl_get_vtr(vol->ubi, vol->vol_id);
- ret = sprintf(buf, "%d\n", vtr->corrupted);
- spin_unlock(&vol->vol_lock);
- return ret;
-}
-
-static ssize_t vol_alignment_show(struct class_device *dev, char *buf)
-{
- int ret;
- const struct ubi_vtbl_vtr *vtr;
- struct ubi_uif_volume *vol = dev2vol(dev);
-
- spin_lock(&vol->vol_lock);
- if (vol->removed) {
- spin_unlock(&vol->vol_lock);
- dbg_err("volume %d was removed", vol->vol_id);
- return -EIO;
- }
- vtr = ubi_vtbl_get_vtr(vol->ubi, vol->vol_id);
- ret = sprintf(buf, "%d\n", vtr->alignment);
- spin_unlock(&vol->vol_lock);
- return ret;
-}
-
-static ssize_t vol_usable_eb_size_show(struct class_device *dev, char *buf)
-{
- int ret, usable_eb_size;
- const struct ubi_vtbl_vtr *vtr;
- struct ubi_uif_volume *vol = dev2vol(dev);
-
- spin_lock(&vol->vol_lock);
- if (vol->removed) {
- spin_unlock(&vol->vol_lock);
- dbg_err("volume %d was removed", vol->vol_id);
- return -EIO;
- }
- vtr = ubi_vtbl_get_vtr(vol->ubi, vol->vol_id);
- usable_eb_size = vol->ubi->io.leb_size - vtr->data_pad;
- ret = sprintf(buf, "%d\n", usable_eb_size);
- spin_unlock(&vol->vol_lock);
- return ret;
-}
-
-static ssize_t vol_data_bytes_show(struct class_device *dev, char *buf)
-{
- int ret;
- const struct ubi_vtbl_vtr *vtr;
- struct ubi_uif_volume *vol = dev2vol(dev);
-
- spin_lock(&vol->vol_lock);
- if (vol->removed) {
- spin_unlock(&vol->vol_lock);
- dbg_err("volume %d was removed", vol->vol_id);
- return -EIO;
- }
- vtr = ubi_vtbl_get_vtr(vol->ubi, vol->vol_id);
- ret = sprintf(buf, "%lld\n", vtr->used_bytes);
- spin_unlock(&vol->vol_lock);
- return ret;
-}
-
-static ssize_t vol_upd_marker_show(struct class_device *dev, char *buf)
-{
- int ret;
- const struct ubi_vtbl_vtr *vtr;
- struct ubi_uif_volume *vol = dev2vol(dev);
-
- spin_lock(&vol->vol_lock);
- if (vol->removed) {
- spin_unlock(&vol->vol_lock);
- dbg_err("volume %d was removed", vol->vol_id);
- return -EIO;
- }
- vtr = ubi_vtbl_get_vtr(vol->ubi, vol->vol_id);
- ret = sprintf(buf, "%d\n", vtr->upd_marker);
- spin_unlock(&vol->vol_lock);
- return ret;
-}
--- dedekind-ubi-2.6.orig/drivers/mtd/ubi/ubi.h
+++ dedekind-ubi-2.6/drivers/mtd/ubi/ubi.h
@@ -540,7 +540,7 @@ struct ubi_vol_desc;
* @gluebi_mtd: MTD device description object of the gluebi MTD device
*/
struct ubi_uif_volume {
- struct class_device dev;
+ struct device dev;
struct cdev cdev;
struct ubi_info *ubi;
int vol_id;
@@ -603,7 +603,7 @@ struct ubi_vol_desc {
*/
struct ubi_uif_info {
struct cdev cdev;
- struct class_device dev;
+ struct device dev;
int major;
struct list_head volumes;
spinlock_t volumes_list_lock;
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [RFC] [PATCH] UBI: rewrite of sysfs.c
2007-03-13 15:10 [RFC] [PATCH] UBI: rewrite of sysfs.c Alexander Schmidt
@ 2007-03-13 16:38 ` Artem Bityutskiy
2007-03-13 16:42 ` Artem Bityutskiy
2007-03-14 9:23 ` Artem Bityutskiy
2 siblings, 0 replies; 7+ messages in thread
From: Artem Bityutskiy @ 2007-03-13 16:38 UTC (permalink / raw)
To: Alexander Schmidt
Cc: Thomas Gleixner, linux-mtd@lists.infradead.org, Frank Haverkamp
Alexander Schmidt wrote:
> Hi,
>
> I rewrote the sysfs interface to use struct device instead of struct
> class_device. This implies an interface change, as sysfs files are now
> ordered in a different manner:
>
> /sys/class/ubi/ubiX/ for device files
> /sys/class/ubi/ubiX_Y/ for volumes
It seems this is something we have
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] [PATCH] UBI: rewrite of sysfs.c
2007-03-13 15:10 [RFC] [PATCH] UBI: rewrite of sysfs.c Alexander Schmidt
2007-03-13 16:38 ` Artem Bityutskiy
@ 2007-03-13 16:42 ` Artem Bityutskiy
2007-03-14 8:24 ` Frank Haverkamp
2007-03-16 22:25 ` Thomas Gleixner
2007-03-14 9:23 ` Artem Bityutskiy
2 siblings, 2 replies; 7+ messages in thread
From: Artem Bityutskiy @ 2007-03-13 16:42 UTC (permalink / raw)
To: ext Alexander Schmidt
Cc: Thomas Gleixner, linux-mtd@lists.infradead.org, Frank Haverkamp
Alexander Schmidt wrote:
> Hi,
>
> I rewrote the sysfs interface to use struct device instead of struct
> class_device. This implies an interface change, as sysfs files are now
> ordered in a different manner:
>
> /sys/class/ubi/ubiX/ for device files
> /sys/class/ubi/ubiX_Y/ for volumes
>
> Before we had
>
> /sys/class/ubi/ubiX/ for device files
> /sys/class/ubi/ubiX/Y/ for volumes
>
> Please let me know if you got any objections on this or if you have
> proposals for a better implementation.
>
> Signed-off-by: Alexander Schmidt <alexs@linux.vnet.ibm.com>
It seems we cannot preserve old sysfs structure...
It is fine with me. You and Thomas are the main users, so if it is ok
with you - lets' apply this.
Thomas?
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] [PATCH] UBI: rewrite of sysfs.c
2007-03-13 16:42 ` Artem Bityutskiy
@ 2007-03-14 8:24 ` Frank Haverkamp
2007-03-14 8:32 ` Artem Bityutskiy
2007-03-16 22:25 ` Thomas Gleixner
1 sibling, 1 reply; 7+ messages in thread
From: Frank Haverkamp @ 2007-03-14 8:24 UTC (permalink / raw)
To: Artem.Bityutskiy
Cc: Thomas Gleixner, ext Alexander Schmidt,
linux-mtd@lists.infradead.org, Frank Haverkamp
Hi Artem,
On Tue, 2007-03-13 at 18:42 +0200, Artem Bityutskiy wrote:
> Alexander Schmidt wrote:
> > Hi,
> >
> > I rewrote the sysfs interface to use struct device instead of struct
> > class_device. This implies an interface change, as sysfs files are now
> > ordered in a different manner:
> >
> > /sys/class/ubi/ubiX/ for device files
> > /sys/class/ubi/ubiX_Y/ for volumes
> >
> > Before we had
> >
> > /sys/class/ubi/ubiX/ for device files
> > /sys/class/ubi/ubiX/Y/ for volumes
> >
> > Please let me know if you got any objections on this or if you have
> > proposals for a better implementation.
> >
> > Signed-off-by: Alexander Schmidt <alexs@linux.vnet.ibm.com>
>
> It seems we cannot preserve old sysfs structure...
>
> It is fine with me. You and Thomas are the main users, so if it is ok
> with you - lets' apply this.
Josh is representing some users too. But just in case I suggest, that we
wait at least 2-3 days before we commit such interface changes, to give
yet anomymous (in the world which are not in the German/Finish/US
eastcoast timzone) users a chance to comment on this. I also discussed
with Alex that we might want to enhance our ubi-utils to support the old
and new interfaces to avoid possible trouble before we include the
changes.
Frank
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] [PATCH] UBI: rewrite of sysfs.c
2007-03-14 8:24 ` Frank Haverkamp
@ 2007-03-14 8:32 ` Artem Bityutskiy
0 siblings, 0 replies; 7+ messages in thread
From: Artem Bityutskiy @ 2007-03-14 8:32 UTC (permalink / raw)
To: haver
Cc: Thomas Gleixner, Alexander Schmidt, linux-mtd@lists.infradead.org,
Frank Haverkamp
Frank Haverkamp wrote:
> Josh is representing some users too. But just in case I suggest, that we
> wait at least 2-3 days before we commit such interface changes, to give
> yet anomymous (in the world which are not in the German/Finish/US
> eastcoast timzone) users a chance to comment on this. I also discussed
> with Alex that we might want to enhance our ubi-utils to support the old
> and new interfaces to avoid possible trouble before we include the
> changes.
When I said "you" I meant IBM-ers :-)
Well, I actually suggest not to change it and just keep trying to get into
mainline. If somebody complain, we will ask him why and how. For now,
lets preserve sysfs as it is.
Comments?
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] [PATCH] UBI: rewrite of sysfs.c
2007-03-13 16:42 ` Artem Bityutskiy
2007-03-14 8:24 ` Frank Haverkamp
@ 2007-03-16 22:25 ` Thomas Gleixner
1 sibling, 0 replies; 7+ messages in thread
From: Thomas Gleixner @ 2007-03-16 22:25 UTC (permalink / raw)
To: Artem.Bityutskiy
Cc: ext Alexander Schmidt, linux-mtd@lists.infradead.org,
Frank Haverkamp
On Tue, 2007-03-13 at 18:42 +0200, Artem Bityutskiy wrote:
> Alexander Schmidt wrote:
> > Hi,
> >
> > I rewrote the sysfs interface to use struct device instead of struct
> > class_device. This implies an interface change, as sysfs files are now
> > ordered in a different manner:
> >
> > /sys/class/ubi/ubiX/ for device files
> > /sys/class/ubi/ubiX_Y/ for volumes
> >
> > Before we had
> >
> > /sys/class/ubi/ubiX/ for device files
> > /sys/class/ubi/ubiX/Y/ for volumes
> >
> > Please let me know if you got any objections on this or if you have
> > proposals for a better implementation.
> >
> > Signed-off-by: Alexander Schmidt <alexs@linux.vnet.ibm.com>
>
> It seems we cannot preserve old sysfs structure...
>
> It is fine with me. You and Thomas are the main users, so if it is ok
> with you - lets' apply this.
No objections. I will hack^Wscript my way around it and silently curse
at you :)
tglx
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [RFC] [PATCH] UBI: rewrite of sysfs.c
2007-03-13 15:10 [RFC] [PATCH] UBI: rewrite of sysfs.c Alexander Schmidt
2007-03-13 16:38 ` Artem Bityutskiy
2007-03-13 16:42 ` Artem Bityutskiy
@ 2007-03-14 9:23 ` Artem Bityutskiy
2 siblings, 0 replies; 7+ messages in thread
From: Artem Bityutskiy @ 2007-03-14 9:23 UTC (permalink / raw)
To: Alexander Schmidt
Cc: Thomas Gleixner, linux-mtd@lists.infradead.org, Frank Haverkamp
Alexander Schmidt wrote:
> Hi,
>
> I rewrote the sysfs interface to use struct device instead of struct
> class_device. This implies an interface change, as sysfs files are now
> ordered in a different manner:
>
> /sys/class/ubi/ubiX/ for device files
> /sys/class/ubi/ubiX_Y/ for volumes
>
> Before we had
>
> /sys/class/ubi/ubiX/ for device files
> /sys/class/ubi/ubiX/Y/ for volumes
>
> Please let me know if you got any objections on this or if you have
> proposals for a better implementation.
Alexander, may I please ask you to to the following experiments with your new changes:
Experiment 1: open sysfs file, and make sure UBI module refcount is increased.
lsmod will help. Please, check this with a UBI device's file and a UBI volume's
file.
Experiment 2: write a program which opens any sysfs file of volume, e.g.,
/sys/class/ubi/ubi0_0/alignment, and keeps it open. Do not close it. Then
remove the corresponding volume (volume 0). Make sure you delete the volume
and do not crash.
--
Best Regards,
Artem Bityutskiy (Артём Битюцкий)
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2007-03-16 22:18 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-03-13 15:10 [RFC] [PATCH] UBI: rewrite of sysfs.c Alexander Schmidt
2007-03-13 16:38 ` Artem Bityutskiy
2007-03-13 16:42 ` Artem Bityutskiy
2007-03-14 8:24 ` Frank Haverkamp
2007-03-14 8:32 ` Artem Bityutskiy
2007-03-16 22:25 ` Thomas Gleixner
2007-03-14 9:23 ` Artem Bityutskiy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox