UBI: rewrite of sysfs.c
Subsystems (2)
RFC PATCH 1/1 UBI: rewrite of sysfs.c
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.
--- drivers/mtd/ubi/sysfs.c | 464 +++++++++++++++--------------------------------- drivers/mtd/ubi/ubi.h | 4 2 files changed, 152 insertions(+), 316 deletions(-)
drivers/mtd/ubi/sysfs.c +150 -314
@@ -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 clasreturn -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; -}
drivers/mtd/ubi/ubi.h +2 -2
@@ -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;
Quoted 8 lines · Alexander Schmidt
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
Signature · 2 lines
Best Regards, Artem Bityutskiy (Артём Битюцкий)
Quoted 11 lines · Alexander Schmidt
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 volumesBefore we had
Quoted 7 lines
/sys/class/ubi/ubiX/for device files/sys/class/ubi/ubiX/Y/for volumesPlease let me know if you got any objections on this or if you have proposals for a better implementation.
Signed-off-by Alexander Schmidt <[email protected]>
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?
Signature · 2 lines
Best Regards, Artem Bityutskiy (Артём Битюцкий)
Hi Artem,
Quoted 18 lines · Artem Bityutskiy
Quoted 17 lines · Alexander Schmidt
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 volumesBefore we had
/sys/class/ubi/ubiX/for device files/sys/class/ubi/ubiX/Y/for volumesPlease let me know if you got any objections on this or if you have proposals for a better implementation.
Quoted 6 lines
Quoted 1 line
Signed-off-by Alexander Schmidt <[email protected]>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
Quoted 7 lines · Frank Haverkamp
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?
Signature · 2 lines
Best Regards, Artem Bityutskiy (Артём Битюцкий)
Quoted 18 lines · Artem Bityutskiy
Quoted 17 lines · Alexander Schmidt
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 volumesBefore we had
/sys/class/ubi/ubiX/for device files/sys/class/ubi/ubiX/Y/for volumesPlease let me know if you got any objections on this or if you have proposals for a better implementation.
Quoted 6 lines
Quoted 1 line
Signed-off-by Alexander Schmidt <[email protected]>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
Quoted 9 lines · Alexander Schmidt
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
Quoted 7 lines
Before we had
/sys/class/ubi/ubiX/for device files/sys/class/ubi/ubiX/Y/for volumesPlease 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.
Signature · 2 lines
Best Regards, Artem Bityutskiy (Артём Битюцкий)