Пример #1
0
/**
 * ubi_io_write - write data to a physical eraseblock.
 * @ubi: UBI device description object
 * @buf: buffer with the data to write
 * @pnum: physical eraseblock number to write to
 * @offset: offset within the physical eraseblock where to write
 * @len: how many bytes to write
 *
 * This function writes @len bytes of data from buffer @buf to offset @offset
 * of physical eraseblock @pnum. If all the data were successfully written,
 * zero is returned. If an error occurred, this function returns a negative
 * error code. If %-EIO is returned, the physical eraseblock most probably went
 * bad.
 *
 * Note, in case of an error, it is possible that something was still written
 * to the flash media, but may be some garbage.
 */
int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,
		 int len)
{
	int err;
	size_t written;
	loff_t addr;

	dbg_io("write %d bytes to PEB %d:%d", len, pnum, offset);

	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
	ubi_assert(offset >= 0 && offset + len <= ubi->peb_size);
	ubi_assert(offset % ubi->hdrs_min_io_size == 0);
	ubi_assert(len > 0 && len % ubi->hdrs_min_io_size == 0);

	if (ubi->ro_mode) {
		ubi_err("read-only mode");
		return -EROFS;
	}

	err = self_check_not_bad(ubi, pnum);
	if (err)
		return err;

	/* The area we are writing to has to contain all 0xFF bytes */
	err = ubi_self_check_all_ff(ubi, pnum, offset, len);
	if (err)
		return err;

	if (offset >= ubi->leb_start) {
		/*
		 * We write to the data area of the physical eraseblock. Make
		 * sure it has valid EC and VID headers.
		 */
		err = self_check_peb_ec_hdr(ubi, pnum);
		if (err)
			return err;
		err = self_check_peb_vid_hdr(ubi, pnum);
		if (err)
			return err;
	}

	if (ubi_dbg_is_write_failure(ubi)) {
		ubi_err("cannot write %d bytes to PEB %d:%d (emulated)",
			len, pnum, offset);
		dump_stack();
		return -EIO;
	}

	addr = (loff_t)pnum * ubi->peb_size + offset;
	err = mtd_write(ubi->mtd, addr, len, &written, buf);
	if (err) {
		ubi_err("error %d while writing %d bytes to PEB %d:%d, written %zd bytes",
			err, len, pnum, offset, written);
		dump_stack();
		ubi_dump_flash(ubi, pnum, offset, len);
	} else
		ubi_assert(written == len);

	if (!err) {
		err = self_check_write(ubi, buf, pnum, offset, len);
		if (err)
			return err;

		/*
		 * Since we always write sequentially, the rest of the PEB has
		 * to contain only 0xFF bytes.
		 */
		offset += len;
		len = ubi->peb_size - offset;
		if (len)
			err = ubi_self_check_all_ff(ubi, pnum, offset, len);
	}

	return err;
}
Пример #2
0
/**
 * do_sync_erase - synchronously erase a physical eraseblock.
 * @ubi: UBI device description object
 * @pnum: the physical eraseblock number to erase
 *
 * This function synchronously erases physical eraseblock @pnum and returns
 * zero in case of success and a negative error code in case of failure. If
 * %-EIO is returned, the physical eraseblock most probably went bad.
 */
static int do_sync_erase(struct ubi_device *ubi, int pnum)
{
	int err, retries = 0;
	struct erase_info ei;
	wait_queue_head_t wq;

	dbg_io("erase PEB %d", pnum);
	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);

	if (ubi->ro_mode) {
		ubi_err("read-only mode");
		return -EROFS;
	}

retry:
	init_waitqueue_head(&wq);
	memset(&ei, 0, sizeof(struct erase_info));

	ei.mtd      = ubi->mtd;
	ei.addr     = (loff_t)pnum * ubi->peb_size;
	ei.len      = ubi->peb_size;
	ei.callback = erase_callback;
	ei.priv     = (unsigned long)&wq;

	err = mtd_erase(ubi->mtd, &ei);
	if (err) {
		if (retries++ < UBI_IO_RETRIES) {
			ubi_warn("error %d while erasing PEB %d, retry",
				 err, pnum);
			yield();
			goto retry;
		}
		ubi_err("cannot erase PEB %d, error %d", pnum, err);
		dump_stack();
		return err;
	}

	err = wait_event_interruptible(wq, ei.state == MTD_ERASE_DONE ||
					   ei.state == MTD_ERASE_FAILED);
	if (err) {
		ubi_err("interrupted PEB %d erasure", pnum);
		return -EINTR;
	}

	if (ei.state == MTD_ERASE_FAILED) {
		if (retries++ < UBI_IO_RETRIES) {
			ubi_warn("error while erasing PEB %d, retry", pnum);
			yield();
			goto retry;
		}
		ubi_err("cannot erase PEB %d", pnum);
		dump_stack();
		return -EIO;
	}

	err = ubi_self_check_all_ff(ubi, pnum, 0, ubi->peb_size);
	if (err)
		return err;

	if (ubi_dbg_is_erase_failure(ubi)) {
		ubi_err("cannot erase PEB %d (emulated)", pnum);
		return -EIO;
	}

	return 0;
}
Пример #3
0
/**
 * ubi_io_read_vid_hdr - read and check a volume identifier header.
 * @ubi: UBI device description object
 * @pnum: physical eraseblock number to read from
 * @vid_hdr: &struct ubi_vid_hdr object where to store the read volume
 * identifier header
 * @verbose: be verbose if the header is corrupted or wasn't found
 *
 * This function reads the volume identifier header from physical eraseblock
 * @pnum and stores it in @vid_hdr. It also checks CRC checksum of the read
 * volume identifier header. The error codes are the same as in
 * 'ubi_io_read_ec_hdr()'.
 *
 * Note, the implementation of this function is also very similar to
 * 'ubi_io_read_ec_hdr()', so refer commentaries in 'ubi_io_read_ec_hdr()'.
 */
int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
			struct ubi_vid_hdr *vid_hdr, int verbose)
{
	int err, read_err;
	uint32_t crc, magic, hdr_crc;
	void *p;

	dbg_io("read VID header from PEB %d", pnum);
	ubi_assert(pnum >= 0 &&  pnum < ubi->peb_count);

	p = (char *)vid_hdr - ubi->vid_hdr_shift;
	read_err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
			  ubi->vid_hdr_alsize);
	if (read_err && read_err != UBI_IO_BITFLIPS && !mtd_is_eccerr(read_err))
		return read_err;

	magic = be32_to_cpu(vid_hdr->magic);
	if (magic != UBI_VID_HDR_MAGIC) {
		if (mtd_is_eccerr(read_err))
			return UBI_IO_BAD_HDR_EBADMSG;

		if (ubi_check_pattern(vid_hdr, 0xFF, UBI_VID_HDR_SIZE)) {
			if (verbose)
				ubi_warn("no VID header found at PEB %d, only 0xFF bytes",
					 pnum);
			dbg_bld("no VID header found at PEB %d, only 0xFF bytes",
				pnum);
			if (!read_err)
				return UBI_IO_FF;
			else
				return UBI_IO_FF_BITFLIPS;
		}

		if (verbose) {
			ubi_warn("bad magic number at PEB %d: %08x instead of %08x",
				 pnum, magic, UBI_VID_HDR_MAGIC);
			ubi_dump_vid_hdr(vid_hdr);
		}
		dbg_bld("bad magic number at PEB %d: %08x instead of %08x",
			pnum, magic, UBI_VID_HDR_MAGIC);
		return UBI_IO_BAD_HDR;
	}

	crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_VID_HDR_SIZE_CRC);
	hdr_crc = be32_to_cpu(vid_hdr->hdr_crc);

	if (hdr_crc != crc) {
		if (verbose) {
			ubi_warn("bad CRC at PEB %d, calculated %#08x, read %#08x",
				 pnum, crc, hdr_crc);
			ubi_dump_vid_hdr(vid_hdr);
		}
		dbg_bld("bad CRC at PEB %d, calculated %#08x, read %#08x",
			pnum, crc, hdr_crc);
		if (!read_err)
			return UBI_IO_BAD_HDR;
		else
			return UBI_IO_BAD_HDR_EBADMSG;
	}

	err = validate_vid_hdr(ubi, vid_hdr);
	if (err) {
		ubi_err("validation failed for PEB %d", pnum);
		return -EINVAL;
	}

	return read_err ? UBI_IO_BITFLIPS : 0;
}
Пример #4
0
/**
 * ubi_io_read - read data from a physical eraseblock.
 * @ubi: UBI device description object
 * @buf: buffer where to store the read data
 * @pnum: physical eraseblock number to read from
 * @offset: offset within the physical eraseblock from where to read
 * @len: how many bytes to read
 *
 * This function reads data from offset @offset of physical eraseblock @pnum
 * and stores the read data in the @buf buffer. The following return codes are
 * possible:
 *
 * o %0 if all the requested data were successfully read;
 * o %UBI_IO_BITFLIPS if all the requested data were successfully read, but
 *   correctable bit-flips were detected; this is harmless but may indicate
 *   that this eraseblock may become bad soon (but do not have to);
 * o %-EBADMSG if the MTD subsystem reported about data integrity problems, for
 *   example it can be an ECC error in case of NAND; this most probably means
 *   that the data is corrupted;
 * o %-EIO if some I/O error occurred;
 * o other negative error codes in case of other errors.
 */
int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,
		int len)
{
	int err, retries = 0;
	size_t read;
	loff_t addr;

	dbg_io("read %d bytes from PEB %d:%d", len, pnum, offset);

	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
	ubi_assert(offset >= 0 && offset + len <= ubi->peb_size);
	ubi_assert(len > 0);

	err = self_check_not_bad(ubi, pnum);
	if (err)
		return err;

	/*
	 * Deliberately corrupt the buffer to improve robustness. Indeed, if we
	 * do not do this, the following may happen:
	 * 1. The buffer contains data from previous operation, e.g., read from
	 *    another PEB previously. The data looks like expected, e.g., if we
	 *    just do not read anything and return - the caller would not
	 *    notice this. E.g., if we are reading a VID header, the buffer may
	 *    contain a valid VID header from another PEB.
	 * 2. The driver is buggy and returns us success or -EBADMSG or
	 *    -EUCLEAN, but it does not actually put any data to the buffer.
	 *
	 * This may confuse UBI or upper layers - they may think the buffer
	 * contains valid data while in fact it is just old data. This is
	 * especially possible because UBI (and UBIFS) relies on CRC, and
	 * treats data as correct even in case of ECC errors if the CRC is
	 * correct.
	 *
	 * Try to prevent this situation by changing the first byte of the
	 * buffer.
	 */
	*((uint8_t *)buf) ^= 0xFF;

	addr = (loff_t)pnum * ubi->peb_size + offset;
retry:
	err = mtd_read(ubi->mtd, addr, len, &read, buf);
	if (err) {
		const char *errstr = mtd_is_eccerr(err) ? " (ECC error)" : "";

		if (mtd_is_bitflip(err)) {
			/*
			 * -EUCLEAN is reported if there was a bit-flip which
			 * was corrected, so this is harmless.
			 *
			 * We do not report about it here unless debugging is
			 * enabled. A corresponding message will be printed
			 * later, when it is has been scrubbed.
			 */
			ubi_msg("fixable bit-flip detected at PEB %d", pnum);
			ubi_assert(len == read);
			return UBI_IO_BITFLIPS;
		}

		if (retries++ < UBI_IO_RETRIES) {
			ubi_warn("error %d%s while reading %d bytes from PEB %d:%d, read only %zd bytes, retry",
				 err, errstr, len, pnum, offset, read);
			yield();
			goto retry;
		}

		ubi_err("error %d%s while reading %d bytes from PEB %d:%d, read %zd bytes",
			err, errstr, len, pnum, offset, read);
		dump_stack();

		/*
		 * The driver should never return -EBADMSG if it failed to read
		 * all the requested data. But some buggy drivers might do
		 * this, so we change it to -EIO.
		 */
		if (read != len && mtd_is_eccerr(err)) {
#ifndef NO_FREESTYLE
			dbg_drv ("_______________ %s ____________ EBADMSG -> EIO", __func__);
#endif
			ubi_assert(0);
			err = -EIO;
		}
	} else {
		ubi_assert(len == read);

		if (ubi_dbg_is_bitflip(ubi)) {
			dbg_gen("bit-flip (emulated)");
			err = UBI_IO_BITFLIPS;
		}
	}

	return err;
}
Пример #5
0
/**
 * ubi_io_read_ec_hdr - read and check an erase counter header.
 * @ubi: UBI device description object
 * @pnum: physical eraseblock to read from
 * @ec_hdr: a &struct ubi_ec_hdr object where to store the read erase counter
 * header
 * @verbose: be verbose if the header is corrupted or was not found
 *
 * This function reads erase counter header from physical eraseblock @pnum and
 * stores it in @ec_hdr. This function also checks CRC checksum of the read
 * erase counter header. The following codes may be returned:
 *
 * o %0 if the CRC checksum is correct and the header was successfully read;
 * o %UBI_IO_BITFLIPS if the CRC is correct, but bit-flips were detected
 *   and corrected by the flash driver; this is harmless but may indicate that
 *   this eraseblock may become bad soon (but may be not);
 * o %UBI_IO_BAD_HDR if the erase counter header is corrupted (a CRC error);
 * o %UBI_IO_BAD_HDR_EBADMSG is the same as %UBI_IO_BAD_HDR, but there also was
 *   a data integrity error (uncorrectable ECC error in case of NAND);
 * o %UBI_IO_FF if only 0xFF bytes were read (the PEB is supposedly empty)
 * o a negative error code in case of failure.
 */
int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum,
		       struct ubi_ec_hdr *ec_hdr, int verbose)
{
	int err, read_err;
	uint32_t crc, magic, hdr_crc;

	dbg_io("read EC header from PEB %d", pnum);
	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);

	read_err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE);
	if (read_err) {
		if (read_err != UBI_IO_BITFLIPS && !mtd_is_eccerr(read_err))
			return read_err;

		/*
		 * We read all the data, but either a correctable bit-flip
		 * occurred, or MTD reported a data integrity error
		 * (uncorrectable ECC error in case of NAND). The former is
		 * harmless, the later may mean that the read data is
		 * corrupted. But we have a CRC check-sum and we will detect
		 * this. If the EC header is still OK, we just report this as
		 * there was a bit-flip, to force scrubbing.
		 */
	}

	magic = be32_to_cpu(ec_hdr->magic);
	if (magic != UBI_EC_HDR_MAGIC) {
		if (mtd_is_eccerr(read_err))
			return UBI_IO_BAD_HDR_EBADMSG;

		/*
		 * The magic field is wrong. Let's check if we have read all
		 * 0xFF. If yes, this physical eraseblock is assumed to be
		 * empty.
		 */
		if (ubi_check_pattern(ec_hdr, 0xFF, UBI_EC_HDR_SIZE)) {
			/* The physical eraseblock is supposedly empty */
			if (verbose)
				ubi_warn("no EC header found at PEB %d, "
					 "only 0xFF bytes", pnum);
			dbg_bld("no EC header found at PEB %d, "
				"only 0xFF bytes", pnum);
			if (!read_err)
				return UBI_IO_FF;
			else
				return UBI_IO_FF_BITFLIPS;
		}

		/*
		 * This is not a valid erase counter header, and these are not
		 * 0xFF bytes. Report that the header is corrupted.
		 */
		if (verbose) {
			ubi_warn("bad magic number at PEB %d: %08x instead of "
				 "%08x", pnum, magic, UBI_EC_HDR_MAGIC);
			ubi_dbg_dump_ec_hdr(ec_hdr);
		}
		dbg_bld("bad magic number at PEB %d: %08x instead of "
			"%08x", pnum, magic, UBI_EC_HDR_MAGIC);
		return UBI_IO_BAD_HDR;
	}

	crc = crc32(UBI_CRC32_INIT, ec_hdr, UBI_EC_HDR_SIZE_CRC);
	hdr_crc = be32_to_cpu(ec_hdr->hdr_crc);

	if (hdr_crc != crc) {
		if (verbose) {
			ubi_warn("bad EC header CRC at PEB %d, calculated "
				 "%#08x, read %#08x", pnum, crc, hdr_crc);
			ubi_dbg_dump_ec_hdr(ec_hdr);
		}
		dbg_bld("bad EC header CRC at PEB %d, calculated "
			"%#08x, read %#08x", pnum, crc, hdr_crc);

		if (!read_err)
			return UBI_IO_BAD_HDR;
		else
			return UBI_IO_BAD_HDR_EBADMSG;
	}

	/* And of course validate what has just been read from the media */
	err = validate_ec_hdr(ubi, ec_hdr);
	if (err) {
		ubi_err("validation failed for PEB %d", pnum);
		return -EINVAL;
	}

	/*
	 * If there was %-EBADMSG, but the header CRC is still OK, report about
	 * a bit-flip to force scrubbing on this PEB.
	 */
	return read_err ? UBI_IO_BITFLIPS : 0;
}
Пример #6
0
/**
 * ubi_io_read_vid_hdr - read and check a volume identifier header.
 * @ubi: UBI device description object
 * @pnum: physical eraseblock number to read from
 * @vid_hdr: &struct ubi_vid_hdr object where to store the read volume
 * identifier header
 * @verbose: be verbose if the header is corrupted or wasn't found
 *
 * This function reads the volume identifier header from physical eraseblock
 * @pnum and stores it in @vid_hdr. It also checks CRC checksum of the read
 * volume identifier header. The following codes may be returned:
 *
 * o %0 if the CRC checksum is correct and the header was successfully read;
 * o %UBI_IO_BITFLIPS if the CRC is correct, but bit-flips were detected
 *   and corrected by the flash driver; this is harmless but may indicate that
 *   this eraseblock may become bad soon;
 * o %UBI_IO_BAD_VID_HRD if the volume identifier header is corrupted (a CRC
 *   error detected);
 * o %UBI_IO_PEB_FREE if the physical eraseblock is free (i.e., there is no VID
 *   header there);
 * o a negative error code in case of failure.
 */
int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
                        struct ubi_vid_hdr *vid_hdr, int verbose)
{
    int err, read_err = 0;
    uint32_t crc, magic, hdr_crc;
    void *p;

    dbg_io("read VID header from PEB %d", pnum);
    ubi_assert(pnum >= 0 &&  pnum < ubi->peb_count);
    if (UBI_IO_DEBUG)
        verbose = 1;

    p = (char *)vid_hdr - ubi->vid_hdr_shift;
    err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
                      ubi->vid_hdr_alsize);
    if (err) {
        if (err != UBI_IO_BITFLIPS && err != -EBADMSG)
            return err;

        /*
         * We read all the data, but either a correctable bit-flip
         * occurred, or MTD reported about some data integrity error,
         * like an ECC error in case of NAND. The former is harmless,
         * the later may mean the read data is corrupted. But we have a
         * CRC check-sum and we will identify this. If the VID header is
         * still OK, we just report this as there was a bit-flip.
         */
        read_err = err;
    }

    magic = be32_to_cpu(vid_hdr->magic);
    if (magic != UBI_VID_HDR_MAGIC) {
        /*
         * If we have read all 0xFF bytes, the VID header probably does
         * not exist and the physical eraseblock is assumed to be free.
         *
         * But if there was a read error, we do not test the data for
         * 0xFFs. Even if it does contain all 0xFFs, this error
         * indicates that something is still wrong with this physical
         * eraseblock and it cannot be regarded as free.
         */
        if (read_err != -EBADMSG &&
                check_pattern(vid_hdr, 0xFF, UBI_VID_HDR_SIZE)) {
            /* The physical eraseblock is supposedly free */

            /*
             * The below is just a paranoid check, it has to be
             * compiled out if paranoid checks are disabled.
             */
            err = paranoid_check_all_ff(ubi, pnum, ubi->leb_start,
                                        ubi->leb_size);
            if (err)
                return err > 0 ? UBI_IO_BAD_VID_HDR : err;

            if (verbose)
                ubi_warn("no VID header found at PEB %d, "
                         "only 0xFF bytes", pnum);
            return UBI_IO_PEB_FREE;
        }

        /*
         * This is not a valid VID header, and these are not 0xFF
         * bytes. Report that the header is corrupted.
         */
        if (verbose) {
            ubi_warn("bad magic number at PEB %d: %08x instead of "
                     "%08x", pnum, magic, UBI_VID_HDR_MAGIC);
            ubi_dbg_dump_vid_hdr(vid_hdr);
        }
        return UBI_IO_BAD_VID_HDR;
    }

    crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_VID_HDR_SIZE_CRC);
    hdr_crc = be32_to_cpu(vid_hdr->hdr_crc);

    if (hdr_crc != crc) {
        if (verbose) {
            ubi_warn("bad CRC at PEB %d, calculated %#08x, "
                     "read %#08x", pnum, crc, hdr_crc);
            ubi_dbg_dump_vid_hdr(vid_hdr);
        }
        return UBI_IO_BAD_VID_HDR;
    }

    /* Validate the VID header that we have just read */
    err = validate_vid_hdr(ubi, vid_hdr);
    if (err) {
        ubi_err("validation failed for PEB %d", pnum);
        return -EINVAL;
    }

    return read_err ? UBI_IO_BITFLIPS : 0;
}
Пример #7
0
/**
 * ubi_io_read_ec_hdr - read and check an erase counter header.
 * @ubi: UBI device description object
 * @pnum: physical eraseblock to read from
 * @ec_hdr: a &struct ubi_ec_hdr object where to store the read erase counter
 * header
 * @verbose: be verbose if the header is corrupted or was not found
 *
 * This function reads erase counter header from physical eraseblock @pnum and
 * stores it in @ec_hdr. This function also checks CRC checksum of the read
 * erase counter header. The following codes may be returned:
 *
 * o %0 if the CRC checksum is correct and the header was successfully read;
 * o %UBI_IO_BITFLIPS if the CRC is correct, but bit-flips were detected
 *   and corrected by the flash driver; this is harmless but may indicate that
 *   this eraseblock may become bad soon (but may be not);
 * o %UBI_IO_BAD_EC_HDR if the erase counter header is corrupted (a CRC error);
 * o %UBI_IO_PEB_EMPTY if the physical eraseblock is empty;
 * o a negative error code in case of failure.
 */
int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum,
                       struct ubi_ec_hdr *ec_hdr, int verbose)
{
    int err, read_err = 0;
    uint32_t crc, magic, hdr_crc;

    dbg_io("read EC header from PEB %d", pnum);
    ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
    if (UBI_IO_DEBUG)
        verbose = 1;

    err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE);
    if (err) {
        if (err != UBI_IO_BITFLIPS && err != -EBADMSG)
            return err;

        /*
         * We read all the data, but either a correctable bit-flip
         * occurred, or MTD reported about some data integrity error,
         * like an ECC error in case of NAND. The former is harmless,
         * the later may mean that the read data is corrupted. But we
         * have a CRC check-sum and we will detect this. If the EC
         * header is still OK, we just report this as there was a
         * bit-flip.
         */
        read_err = err;
    }

    magic = be32_to_cpu(ec_hdr->magic);
    if (magic != UBI_EC_HDR_MAGIC) {
        /*
         * The magic field is wrong. Let's check if we have read all
         * 0xFF. If yes, this physical eraseblock is assumed to be
         * empty.
         *
         * But if there was a read error, we do not test it for all
         * 0xFFs. Even if it does contain all 0xFFs, this error
         * indicates that something is still wrong with this physical
         * eraseblock and we anyway cannot treat it as empty.
         */
        if (read_err != -EBADMSG &&
                check_pattern(ec_hdr, 0xFF, UBI_EC_HDR_SIZE)) {
            /* The physical eraseblock is supposedly empty */

            /*
             * The below is just a paranoid check, it has to be
             * compiled out if paranoid checks are disabled.
             */
            err = paranoid_check_all_ff(ubi, pnum, 0,
                                        ubi->peb_size);
            if (err)
                return err > 0 ? UBI_IO_BAD_EC_HDR : err;

            if (verbose)
                ubi_warn("no EC header found at PEB %d, "
                         "only 0xFF bytes", pnum);
            return UBI_IO_PEB_EMPTY;
        }

        /*
         * This is not a valid erase counter header, and these are not
         * 0xFF bytes. Report that the header is corrupted.
         */
        if (verbose) {
            ubi_warn("bad magic number at PEB %d: %08x instead of "
                     "%08x", pnum, magic, UBI_EC_HDR_MAGIC);
            ubi_dbg_dump_ec_hdr(ec_hdr);
        }
        return UBI_IO_BAD_EC_HDR;
    }

    crc = crc32(UBI_CRC32_INIT, ec_hdr, UBI_EC_HDR_SIZE_CRC);
    hdr_crc = be32_to_cpu(ec_hdr->hdr_crc);

    if (hdr_crc != crc) {
        if (verbose) {
            ubi_warn("bad EC header CRC at PEB %d, calculated %#08x,"
                     " read %#08x", pnum, crc, hdr_crc);
            ubi_dbg_dump_ec_hdr(ec_hdr);
        }
        return UBI_IO_BAD_EC_HDR;
    }

    /* And of course validate what has just been read from the media */
    err = validate_ec_hdr(ubi, ec_hdr);
    if (err) {
        ubi_err("validation failed for PEB %d", pnum);
        return -EINVAL;
    }

    return read_err ? UBI_IO_BITFLIPS : 0;
}
Пример #8
0
/**
 * ubi_io_write - write data to a physical eraseblock.
 * @ubi: UBI device description object
 * @buf: buffer with the data to write
 * @pnum: physical eraseblock number to write to
 * @offset: offset within the physical eraseblock where to write
 * @len: how many bytes to write
 *
 * This function writes @len bytes of data from buffer @buf to offset @offset
 * of physical eraseblock @pnum. If all the data were successfully written,
 * zero is returned. If an error occurred, this function returns a negative
 * error code. If %-EIO is returned, the physical eraseblock most probably went
 * bad.
 *
 * Note, in case of an error, it is possible that something was still written
 * to the flash media, but may be some garbage.
 */
int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,
                 int len)
{
    int err;
    size_t written;
    loff_t addr;

    dbg_io("write %d bytes to PEB %d:%d", len, pnum, offset);

    ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
    ubi_assert(offset >= 0 && offset + len <= ubi->peb_size);
    ubi_assert(offset % ubi->hdrs_min_io_size == 0);
    ubi_assert(len > 0 && len % ubi->hdrs_min_io_size == 0);

    if (ubi->ro_mode) {
        ubi_err("read-only mode");
        return -EROFS;
    }

    /* The below has to be compiled out if paranoid checks are disabled */

    err = paranoid_check_not_bad(ubi, pnum);
    if (err)
        return err > 0 ? -EINVAL : err;

    /* The area we are writing to has to contain all 0xFF bytes */
    err = paranoid_check_all_ff(ubi, pnum, offset, len);
    if (err)
        return err > 0 ? -EINVAL : err;

    if (offset >= ubi->leb_start) {
        /*
         * We write to the data area of the physical eraseblock. Make
         * sure it has valid EC and VID headers.
         */
        err = paranoid_check_peb_ec_hdr(ubi, pnum);
        if (err)
            return err > 0 ? -EINVAL : err;
        err = paranoid_check_peb_vid_hdr(ubi, pnum);
        if (err)
            return err > 0 ? -EINVAL : err;
    }

    if (ubi_dbg_is_write_failure()) {
        dbg_err("cannot write %d bytes to PEB %d:%d "
                "(emulated)", len, pnum, offset);
        ubi_dbg_dump_stack();
        return -EIO;
    }

    addr = (loff_t)pnum * ubi->peb_size + offset;
    err = ubi->mtd->write(ubi->mtd, addr, len, &written, buf);
    if (err) {
        ubi_err("error %d while writing %d bytes to PEB %d:%d, written"
                " %u bytes", err, len, pnum, offset, (unsigned int)written);
        ubi_dbg_dump_stack();
    } else
        ubi_assert(written == len);

    return err;
}
Пример #9
0
/**
 * ubi_io_read - read data from a physical eraseblock.
 * @ubi: UBI device description object
 * @buf: buffer where to store the read data
 * @pnum: physical eraseblock number to read from
 * @offset: offset within the physical eraseblock from where to read
 * @len: how many bytes to read
 *
 * This function reads data from offset @offset of physical eraseblock @pnum
 * and stores the read data in the @buf buffer. The following return codes are
 * possible:
 *
 * o %0 if all the requested data were successfully read;
 * o %UBI_IO_BITFLIPS if all the requested data were successfully read, but
 *   correctable bit-flips were detected; this is harmless but may indicate
 *   that this eraseblock may become bad soon (but do not have to);
 * o %-EBADMSG if the MTD subsystem reported about data integrity problems, for
 *   example it can be an ECC error in case of NAND; this most probably means
 *   that the data is corrupted;
 * o %-EIO if some I/O error occurred;
 * o other negative error codes in case of other errors.
 */
int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,
                int len)
{
    int err, retries = 0;
    size_t read;
    loff_t addr;

    dbg_io("read %d bytes from PEB %d:%d", len, pnum, offset);

    ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
    ubi_assert(offset >= 0 && offset + len <= ubi->peb_size);
    ubi_assert(len > 0);

    err = paranoid_check_not_bad(ubi, pnum);
    if (err)
        return err > 0 ? -EINVAL : err;

    addr = (loff_t)pnum * ubi->peb_size + offset;
retry:
    err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf);
    if (err) {
        if (err == -EUCLEAN) {
            /*
             * -EUCLEAN is reported if there was a bit-flip which
             * was corrected, so this is harmless.
             */
            ubi_msg("fixable bit-flip detected at PEB %d", pnum);
            ubi_assert(len == read);
            return UBI_IO_BITFLIPS;
        }

        if (read != len && retries++ < UBI_IO_RETRIES) {
            dbg_io("error %d while reading %d bytes from PEB %d:%d, "
                   "read only %u bytes, retry",
                   err, len, pnum, offset, (unsigned int)read);
            yield();
            goto retry;
        }

        ubi_err("error %d while reading %d bytes from PEB %d:%d, "
                "read %u bytes", err, len, pnum, offset, (unsigned int)read);
        ubi_dbg_dump_stack();

        /*
         * The driver should never return -EBADMSG if it failed to read
         * all the requested data. But some buggy drivers might do
         * this, so we change it to -EIO.
         */
        if (read != len && err == -EBADMSG) {
            ubi_assert(0);
            printk("%s[%d] not here\n", __func__, __LINE__);
//			err = -EIO;
        }
    } else {
        ubi_assert(len == read);

        if (ubi_dbg_is_bitflip()) {
            dbg_msg("bit-flip (emulated)");
            err = UBI_IO_BITFLIPS;
        }
    }

    return err;
}