diff options
| -rw-r--r-- | fs/ubifs/lpt_commit.c | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c index 5c90dec5db0b..62a38d9c55e9 100644 --- a/fs/ubifs/lpt_commit.c +++ b/fs/ubifs/lpt_commit.c | |||
| @@ -1628,29 +1628,35 @@ static int dbg_check_ltab_lnum(struct ubifs_info *c, int lnum) | |||
| 1628 | { | 1628 | { |
| 1629 | int err, len = c->leb_size, dirty = 0, node_type, node_num, node_len; | 1629 | int err, len = c->leb_size, dirty = 0, node_type, node_num, node_len; |
| 1630 | int ret; | 1630 | int ret; |
| 1631 | void *buf = c->dbg->buf; | 1631 | void *buf, *p; |
| 1632 | 1632 | ||
| 1633 | if (!(ubifs_chk_flags & UBIFS_CHK_LPROPS)) | 1633 | if (!(ubifs_chk_flags & UBIFS_CHK_LPROPS)) |
| 1634 | return 0; | 1634 | return 0; |
| 1635 | 1635 | ||
| 1636 | buf = p = __vmalloc(c->leb_size, GFP_KERNEL | GFP_NOFS, PAGE_KERNEL); | ||
| 1637 | if (!buf) { | ||
| 1638 | ubifs_err("cannot allocate memory for ltab checking"); | ||
| 1639 | return 0; | ||
| 1640 | } | ||
| 1641 | |||
| 1636 | dbg_lp("LEB %d", lnum); | 1642 | dbg_lp("LEB %d", lnum); |
| 1637 | err = ubi_read(c->ubi, lnum, buf, 0, c->leb_size); | 1643 | err = ubi_read(c->ubi, lnum, buf, 0, c->leb_size); |
| 1638 | if (err) { | 1644 | if (err) { |
| 1639 | dbg_msg("ubi_read failed, LEB %d, error %d", lnum, err); | 1645 | dbg_msg("ubi_read failed, LEB %d, error %d", lnum, err); |
| 1640 | return err; | 1646 | goto out; |
| 1641 | } | 1647 | } |
| 1642 | while (1) { | 1648 | while (1) { |
| 1643 | if (!is_a_node(c, buf, len)) { | 1649 | if (!is_a_node(c, p, len)) { |
| 1644 | int i, pad_len; | 1650 | int i, pad_len; |
| 1645 | 1651 | ||
| 1646 | pad_len = get_pad_len(c, buf, len); | 1652 | pad_len = get_pad_len(c, p, len); |
| 1647 | if (pad_len) { | 1653 | if (pad_len) { |
| 1648 | buf += pad_len; | 1654 | p += pad_len; |
| 1649 | len -= pad_len; | 1655 | len -= pad_len; |
| 1650 | dirty += pad_len; | 1656 | dirty += pad_len; |
| 1651 | continue; | 1657 | continue; |
| 1652 | } | 1658 | } |
| 1653 | if (!dbg_is_all_ff(buf, len)) { | 1659 | if (!dbg_is_all_ff(p, len)) { |
| 1654 | dbg_msg("invalid empty space in LEB %d at %d", | 1660 | dbg_msg("invalid empty space in LEB %d at %d", |
| 1655 | lnum, c->leb_size - len); | 1661 | lnum, c->leb_size - len); |
| 1656 | err = -EINVAL; | 1662 | err = -EINVAL; |
| @@ -1668,16 +1674,21 @@ static int dbg_check_ltab_lnum(struct ubifs_info *c, int lnum) | |||
| 1668 | lnum, dirty, c->ltab[i].dirty); | 1674 | lnum, dirty, c->ltab[i].dirty); |
| 1669 | err = -EINVAL; | 1675 | err = -EINVAL; |
| 1670 | } | 1676 | } |
| 1671 | return err; | 1677 | goto out; |
| 1672 | } | 1678 | } |
| 1673 | node_type = get_lpt_node_type(c, buf, &node_num); | 1679 | node_type = get_lpt_node_type(c, p, &node_num); |
| 1674 | node_len = get_lpt_node_len(c, node_type); | 1680 | node_len = get_lpt_node_len(c, node_type); |
| 1675 | ret = dbg_is_node_dirty(c, node_type, lnum, c->leb_size - len); | 1681 | ret = dbg_is_node_dirty(c, node_type, lnum, c->leb_size - len); |
| 1676 | if (ret == 1) | 1682 | if (ret == 1) |
| 1677 | dirty += node_len; | 1683 | dirty += node_len; |
| 1678 | buf += node_len; | 1684 | p += node_len; |
| 1679 | len -= node_len; | 1685 | len -= node_len; |
| 1680 | } | 1686 | } |
| 1687 | |||
| 1688 | err = 0; | ||
| 1689 | out: | ||
| 1690 | vfree(buf); | ||
| 1691 | return err; | ||
| 1681 | } | 1692 | } |
| 1682 | 1693 | ||
| 1683 | /** | 1694 | /** |
