int ubifs_leb_unmap(struct ubifs_info *c, int lnum) { int err; ubifs_assert(!c->ro_media && !c->ro_mount); if (c->ro_error) return -EROFS; if (!dbg_is_tst_rcvry(c)) err = ubi_leb_unmap(c->ubi, lnum); else err = dbg_leb_unmap(c, lnum); if (err) { ubifs_err("unmap LEB %d failed, error %d", lnum, err); ubifs_ro_mode(c, err); dbg_dump_stack(); } return err; }
/** * fixup_leb - fixup/unmap an LEB containing free space. * @c: UBIFS file-system description object * @lnum: the LEB number to fix up * @len: number of used bytes in LEB (starting at offset 0) * * This function reads the contents of the given LEB number @lnum, then fixes * it up, so that empty min. I/O units in the end of LEB are actually erased on * flash (rather than being just all-0xff real data). If the LEB is completely * empty, it is simply unmapped. */ static int fixup_leb(struct ubifs_info *c, int lnum, int len) { int err; ubifs_assert(len >= 0); ubifs_assert(len % c->min_io_size == 0); ubifs_assert(len < c->leb_size); if (len == 0) { dbg_mnt("unmap empty LEB %d", lnum); return ubi_leb_unmap(c->ubi, lnum); } dbg_mnt("fixup LEB %d, data len %d", lnum, len); err = ubi_read(c->ubi, lnum, c->sbuf, 0, len); if (err) return err; return ubi_leb_change(c->ubi, lnum, c->sbuf, len, UBI_UNKNOWN); }