diff options
Diffstat (limited to 'drivers/mtd/ubi/kapi.c')
| -rw-r--r-- | drivers/mtd/ubi/kapi.c | 69 | 
1 files changed, 40 insertions, 29 deletions
diff --git a/drivers/mtd/ubi/kapi.c b/drivers/mtd/ubi/kapi.c index 69fa4ef03c5..3aac1acceeb 100644 --- a/drivers/mtd/ubi/kapi.c +++ b/drivers/mtd/ubi/kapi.c @@ -40,7 +40,9 @@ void ubi_do_get_device_info(struct ubi_device *ubi, struct ubi_device_info *di)  {  	di->ubi_num = ubi->ubi_num;  	di->leb_size = ubi->leb_size; +	di->leb_start = ubi->leb_start;  	di->min_io_size = ubi->min_io_size; +	di->max_write_size = ubi->max_write_size;  	di->ro_mode = ubi->ro_mode;  	di->cdev = ubi->cdev.dev;  } @@ -219,7 +221,7 @@ out_free:  	kfree(desc);  out_put_ubi:  	ubi_put_device(ubi); -	dbg_err("cannot open device %d, volume %d, error %d", +	ubi_err("cannot open device %d, volume %d, error %d",  		ubi_num, vol_id, err);  	return ERR_PTR(err);  } @@ -408,7 +410,7 @@ int ubi_leb_read(struct ubi_volume_desc *desc, int lnum, char *buf, int offset,  		return 0;  	err = ubi_eba_read_leb(ubi, vol, lnum, buf, offset, len, check); -	if (err && err == -EBADMSG && vol->vol_type == UBI_STATIC_VOLUME) { +	if (err && mtd_is_eccerr(err) && vol->vol_type == UBI_STATIC_VOLUME) {  		ubi_warn("mark volume %d as corrupted", vol_id);  		vol->corrupted = 1;  	} @@ -424,11 +426,9 @@ EXPORT_SYMBOL_GPL(ubi_leb_read);   * @buf: data to write   * @offset: offset within the logical eraseblock where to write   * @len: how many bytes to write - * @dtype: expected data type   *   * This function writes @len bytes of data from @buf to offset @offset of - * logical eraseblock @lnum. The @dtype argument describes expected lifetime of - * the data. + * logical eraseblock @lnum.   *   * This function takes care of physical eraseblock write failures. If write to   * the physical eraseblock write operation fails, the logical eraseblock is @@ -445,7 +445,7 @@ EXPORT_SYMBOL_GPL(ubi_leb_read);   * returns immediately with %-EBADF code.   */  int ubi_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf, -		  int offset, int len, int dtype) +		  int offset, int len)  {  	struct ubi_volume *vol = desc->vol;  	struct ubi_device *ubi = vol->ubi; @@ -464,17 +464,13 @@ int ubi_leb_write(struct ubi_volume_desc *desc, int lnum, const void *buf,  	    offset & (ubi->min_io_size - 1) || len & (ubi->min_io_size - 1))  		return -EINVAL; -	if (dtype != UBI_LONGTERM && dtype != UBI_SHORTTERM && -	    dtype != UBI_UNKNOWN) -		return -EINVAL; -  	if (vol->upd_marker)  		return -EBADF;  	if (len == 0)  		return 0; -	return ubi_eba_write_leb(ubi, vol, lnum, buf, offset, len, dtype); +	return ubi_eba_write_leb(ubi, vol, lnum, buf, offset, len);  }  EXPORT_SYMBOL_GPL(ubi_leb_write); @@ -484,7 +480,6 @@ EXPORT_SYMBOL_GPL(ubi_leb_write);   * @lnum: logical eraseblock number to change   * @buf: data to write   * @len: how many bytes to write - * @dtype: expected data type   *   * This function changes the contents of a logical eraseblock atomically. @buf   * has to contain new logical eraseblock data, and @len - the length of the @@ -495,7 +490,7 @@ EXPORT_SYMBOL_GPL(ubi_leb_write);   * code in case of failure.   */  int ubi_leb_change(struct ubi_volume_desc *desc, int lnum, const void *buf, -		   int len, int dtype) +		   int len)  {  	struct ubi_volume *vol = desc->vol;  	struct ubi_device *ubi = vol->ubi; @@ -513,17 +508,13 @@ int ubi_leb_change(struct ubi_volume_desc *desc, int lnum, const void *buf,  	    len > vol->usable_leb_size || len & (ubi->min_io_size - 1))  		return -EINVAL; -	if (dtype != UBI_LONGTERM && dtype != UBI_SHORTTERM && -	    dtype != UBI_UNKNOWN) -		return -EINVAL; -  	if (vol->upd_marker)  		return -EBADF;  	if (len == 0)  		return 0; -	return ubi_eba_atomic_leb_change(ubi, vol, lnum, buf, len, dtype); +	return ubi_eba_atomic_leb_change(ubi, vol, lnum, buf, len);  }  EXPORT_SYMBOL_GPL(ubi_leb_change); @@ -560,7 +551,7 @@ int ubi_leb_erase(struct ubi_volume_desc *desc, int lnum)  	if (err)  		return err; -	return ubi_wl_flush(ubi); +	return ubi_wl_flush(ubi, vol->vol_id, lnum);  }  EXPORT_SYMBOL_GPL(ubi_leb_erase); @@ -624,7 +615,6 @@ EXPORT_SYMBOL_GPL(ubi_leb_unmap);   * ubi_leb_map - map logical eraseblock to a physical eraseblock.   * @desc: volume descriptor   * @lnum: logical eraseblock number - * @dtype: expected data type   *   * This function maps an un-mapped logical eraseblock @lnum to a physical   * eraseblock. This means, that after a successful invocation of this @@ -637,7 +627,7 @@ EXPORT_SYMBOL_GPL(ubi_leb_unmap);   * eraseblock is already mapped, and other negative error codes in case of   * other failures.   */ -int ubi_leb_map(struct ubi_volume_desc *desc, int lnum, int dtype) +int ubi_leb_map(struct ubi_volume_desc *desc, int lnum)  {  	struct ubi_volume *vol = desc->vol;  	struct ubi_device *ubi = vol->ubi; @@ -650,17 +640,13 @@ int ubi_leb_map(struct ubi_volume_desc *desc, int lnum, int dtype)  	if (lnum < 0 || lnum >= vol->reserved_pebs)  		return -EINVAL; -	if (dtype != UBI_LONGTERM && dtype != UBI_SHORTTERM && -	    dtype != UBI_UNKNOWN) -		return -EINVAL; -  	if (vol->upd_marker)  		return -EBADF;  	if (vol->eba_tbl[lnum] >= 0)  		return -EBADMSG; -	return ubi_eba_write_leb(ubi, vol, lnum, NULL, 0, 0, dtype); +	return ubi_eba_write_leb(ubi, vol, lnum, NULL, 0, 0);  }  EXPORT_SYMBOL_GPL(ubi_leb_map); @@ -712,14 +698,39 @@ int ubi_sync(int ubi_num)  	if (!ubi)  		return -ENODEV; -	if (ubi->mtd->sync) -		ubi->mtd->sync(ubi->mtd); - +	mtd_sync(ubi->mtd);  	ubi_put_device(ubi);  	return 0;  }  EXPORT_SYMBOL_GPL(ubi_sync); +/** + * ubi_flush - flush UBI work queue. + * @ubi_num: UBI device to flush work queue + * @vol_id: volume id to flush for + * @lnum: logical eraseblock number to flush for + * + * This function executes all pending works for a particular volume id / logical + * eraseblock number pair. If either value is set to %UBI_ALL, then it acts as + * a wildcard for all of the corresponding volume numbers or logical + * eraseblock numbers. It returns zero in case of success and a negative error + * code in case of failure. + */ +int ubi_flush(int ubi_num, int vol_id, int lnum) +{ +	struct ubi_device *ubi; +	int err = 0; + +	ubi = ubi_get_device(ubi_num); +	if (!ubi) +		return -ENODEV; + +	err = ubi_wl_flush(ubi, vol_id, lnum); +	ubi_put_device(ubi); +	return err; +} +EXPORT_SYMBOL_GPL(ubi_flush); +  BLOCKING_NOTIFIER_HEAD(ubi_notifiers);  /**  | 
