diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-03-11 08:56:38 -0500 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-03-16 08:05:24 -0400 |
commit | 6fb324a4b0c3c9297cd569bd125ed691f2f98d57 (patch) | |
tree | e21c9930d753e13db7ac72e533138b864f9a909a /fs/ubifs | |
parent | cd5f7485bbbbfeea4363b535abeaa01df6942c66 (diff) |
UBIFS: allocate ltab checking buffer on demand
Instead of using pre-allocated 'c->dbg->buf' buffer in
'dbg_check_ltab_lnum()', dynamically allocate it when needed. The
intend is to get rid of the pre-allocated 'c->dbg->buf' buffer and
save 128KiB of RAM (or more if PEB size is larger). Indeed,
currently we allocate this memory even if the user never enables
any self-check, which is wasteful.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
Diffstat (limited to 'fs/ubifs')
-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 | /** |