Ejemplo n.º 1
0
int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
                           struct ubi_vtbl_record *vtbl_rec)
{
    int i, err;
    uint32_t crc;
    struct ubi_volume *layout_vol;

    ubi_assert(idx >= 0 && idx < ubi->vtbl_slots);
    layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];

    if (!vtbl_rec)
        vtbl_rec = &empty_vtbl_record;
    else {
        crc = crc32(UBI_CRC32_INIT, vtbl_rec, UBI_VTBL_RECORD_SIZE_CRC);
        vtbl_rec->crc = cpu_to_be32(crc);
    }

    memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record));
    for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
        err = ubi_eba_unmap_leb(ubi, layout_vol, i);
        if (err)
            return err;

        err = ubi_eba_write_leb(ubi, layout_vol, i, ubi->vtbl, 0,
                                ubi->vtbl_size, UBI_LONGTERM);
        if (err)
            return err;
    }

    paranoid_vtbl_check(ubi);
    return 0;
}
Ejemplo n.º 2
0
/**
 * ubi_change_vtbl_record - change volume table record.
 * @ubi: UBI device description object
 * @idx: table index to change
 * @vtbl_rec: new volume table record
 *
 * This function changes volume table record @idx. If @vtbl_rec is %NULL, empty
 * volume table record is written. The caller does not have to calculate CRC of
 * the record as it is done by this function. Returns zero in case of success
 * and a negative error code in case of failure.
 */
int ubi_change_vtbl_record(struct ubi_device *ubi, int idx,
			   struct ubi_vtbl_record *vtbl_rec)
{
	int i, err;
	uint32_t crc;
	struct ubi_volume *layout_vol;

	ubi_assert(idx >= 0 && idx < ubi->vtbl_slots);
	layout_vol = ubi->volumes[vol_id2idx(ubi, UBI_LAYOUT_VOLUME_ID)];

	if (!vtbl_rec)
		vtbl_rec = &empty_vtbl_record;
	else {
		crc = crc32(UBI_CRC32_INIT, vtbl_rec, UBI_VTBL_RECORD_SIZE_CRC);
		vtbl_rec->crc = cpu_to_be32(crc);
	}

	memcpy(&ubi->vtbl[idx], vtbl_rec, sizeof(struct ubi_vtbl_record));
	for (i = 0; i < UBI_LAYOUT_VOLUME_EBS; i++) {
		err = ubi_eba_unmap_leb(ubi, layout_vol, i);
		if (err)
			return err;
#ifdef CONFIG_PWR_LOSS_MTK_SPOH
        if(i==0)
        {
            PL_RESET_ON_CASE("NAND", "CreateVol_1");
        }
        else if(i==1)
        {
            PL_RESET_ON_CASE("NAND", "CreateVol_2");
        }
#endif

		err = ubi_eba_write_leb(ubi, layout_vol, i, ubi->vtbl, 0,
					ubi->vtbl_size);
		if (err)
			return err;
	}

	paranoid_vtbl_check(ubi);
	return 0;
}