Exemple #1
0
/**
 * ubi_start_update - start volume update.
 * @ubi: UBI device description object
 * @vol: volume description object
 * @bytes: update bytes
 *
 * This function starts volume update operation. If @bytes is zero, the volume
 * is just wiped out. Returns zero in case of success and a negative error code
 * in case of failure.
 */
int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol,
		     long long bytes)
{
	int i, err;

	dbg_gen("start update of volume %d, %llu bytes", vol->vol_id, bytes);
	ubi_assert(!vol->updating && !vol->changing_leb);
	vol->updating = 1;

	vol->upd_buf = vmalloc(ubi->leb_size);
	if (!vol->upd_buf)
		return -ENOMEM;

	err = set_update_marker(ubi, vol);
	if (err)
		return err;

	/* Before updating - wipe out the volume */
	for (i = 0; i < vol->reserved_pebs; i++) {
		err = ubi_eba_unmap_leb(ubi, vol, i);
		if (err)
			return err;
	}

	if (bytes == 0) {
		err = ubi_wl_flush(ubi, UBI_ALL, UBI_ALL);
		if (err)
			return err;

		err = clear_update_marker(ubi, vol, 0);
		if (err)
			return err;

		vfree(vol->upd_buf);
		vol->updating = 0;
		return 0;
	}

	vol->upd_ebs = div_u64(bytes + vol->usable_leb_size - 1,
			       vol->usable_leb_size);
	vol->upd_bytes = bytes;
	vol->upd_received = 0;
	return 0;
}
Exemple #2
0
/**
 * ubi_start_update - start volume update.
 * @ubi: UBI device description object
 * @vol: volume description object
 * @bytes: update bytes
 *
 * This function starts volume update operation. If @bytes is zero, the volume
 * is just wiped out. Returns zero in case of success and a negative error code
 * in case of failure.
 */
int ubi_start_update(struct ubi_device *ubi, struct ubi_volume *vol,
             long long bytes)
{
    int i, err;
    uint64_t tmp;

    dbg_msg("start update of volume %d, %llu bytes", vol->vol_id, bytes);
    ubi_assert(!vol->updating && !vol->changing_leb);
    vol->updating = 1;

    err = set_update_marker(ubi, vol);
    if (err)
        return err;

    /* Before updating - wipe out the volume */
    for (i = 0; i < vol->reserved_pebs; i++) {
        err = ubi_eba_unmap_leb(ubi, vol, i);
        if (err)
            return err;
    }

    if (bytes == 0) {
        err = clear_update_marker(ubi, vol, 0);
        if (err)
            return err;
        err = ubi_wl_flush(ubi);
        if (!err)
            vol->updating = 0;
    }

    vol->upd_buf = vmalloc(ubi->leb_size);
    if (!vol->upd_buf)
        return -ENOMEM;

    tmp = bytes;
    vol->upd_ebs = !!do_div(tmp, vol->usable_leb_size);
    vol->upd_ebs += tmp;
    vol->upd_bytes = bytes;
    vol->upd_received = 0;
    return 0;
}