diff options
Diffstat (limited to 'fs/ubifs/tnc.c')
-rw-r--r-- | fs/ubifs/tnc.c | 345 |
1 files changed, 322 insertions, 23 deletions
diff --git a/fs/ubifs/tnc.c b/fs/ubifs/tnc.c index 7634c5970887..d27fd918b9c9 100644 --- a/fs/ubifs/tnc.c +++ b/fs/ubifs/tnc.c | |||
@@ -284,7 +284,7 @@ static struct ubifs_znode *dirty_cow_znode(struct ubifs_info *c, | |||
284 | } | 284 | } |
285 | 285 | ||
286 | zn = copy_znode(c, znode); | 286 | zn = copy_znode(c, znode); |
287 | if (unlikely(IS_ERR(zn))) | 287 | if (IS_ERR(zn)) |
288 | return zn; | 288 | return zn; |
289 | 289 | ||
290 | if (zbr->len) { | 290 | if (zbr->len) { |
@@ -470,6 +470,10 @@ static int try_read_node(const struct ubifs_info *c, void *buf, int type, | |||
470 | if (node_len != len) | 470 | if (node_len != len) |
471 | return 0; | 471 | return 0; |
472 | 472 | ||
473 | if (type == UBIFS_DATA_NODE && !c->always_chk_crc) | ||
474 | if (c->no_chk_data_crc) | ||
475 | return 0; | ||
476 | |||
473 | crc = crc32(UBIFS_CRC32_INIT, buf + 8, node_len - 8); | 477 | crc = crc32(UBIFS_CRC32_INIT, buf + 8, node_len - 8); |
474 | node_crc = le32_to_cpu(ch->crc); | 478 | node_crc = le32_to_cpu(ch->crc); |
475 | if (crc != node_crc) | 479 | if (crc != node_crc) |
@@ -1128,7 +1132,7 @@ static struct ubifs_znode *dirty_cow_bottom_up(struct ubifs_info *c, | |||
1128 | ubifs_assert(znode == c->zroot.znode); | 1132 | ubifs_assert(znode == c->zroot.znode); |
1129 | znode = dirty_cow_znode(c, &c->zroot); | 1133 | znode = dirty_cow_znode(c, &c->zroot); |
1130 | } | 1134 | } |
1131 | if (unlikely(IS_ERR(znode)) || !p) | 1135 | if (IS_ERR(znode) || !p) |
1132 | break; | 1136 | break; |
1133 | ubifs_assert(path[p - 1] >= 0); | 1137 | ubifs_assert(path[p - 1] >= 0); |
1134 | ubifs_assert(path[p - 1] < znode->child_cnt); | 1138 | ubifs_assert(path[p - 1] < znode->child_cnt); |
@@ -1492,6 +1496,289 @@ out: | |||
1492 | } | 1496 | } |
1493 | 1497 | ||
1494 | /** | 1498 | /** |
1499 | * ubifs_tnc_get_bu_keys - lookup keys for bulk-read. | ||
1500 | * @c: UBIFS file-system description object | ||
1501 | * @bu: bulk-read parameters and results | ||
1502 | * | ||
1503 | * Lookup consecutive data node keys for the same inode that reside | ||
1504 | * consecutively in the same LEB. | ||
1505 | */ | ||
1506 | int ubifs_tnc_get_bu_keys(struct ubifs_info *c, struct bu_info *bu) | ||
1507 | { | ||
1508 | int n, err = 0, lnum = -1, uninitialized_var(offs); | ||
1509 | int uninitialized_var(len); | ||
1510 | unsigned int block = key_block(c, &bu->key); | ||
1511 | struct ubifs_znode *znode; | ||
1512 | |||
1513 | bu->cnt = 0; | ||
1514 | bu->blk_cnt = 0; | ||
1515 | bu->eof = 0; | ||
1516 | |||
1517 | mutex_lock(&c->tnc_mutex); | ||
1518 | /* Find first key */ | ||
1519 | err = ubifs_lookup_level0(c, &bu->key, &znode, &n); | ||
1520 | if (err < 0) | ||
1521 | goto out; | ||
1522 | if (err) { | ||
1523 | /* Key found */ | ||
1524 | len = znode->zbranch[n].len; | ||
1525 | /* The buffer must be big enough for at least 1 node */ | ||
1526 | if (len > bu->buf_len) { | ||
1527 | err = -EINVAL; | ||
1528 | goto out; | ||
1529 | } | ||
1530 | /* Add this key */ | ||
1531 | bu->zbranch[bu->cnt++] = znode->zbranch[n]; | ||
1532 | bu->blk_cnt += 1; | ||
1533 | lnum = znode->zbranch[n].lnum; | ||
1534 | offs = ALIGN(znode->zbranch[n].offs + len, 8); | ||
1535 | } | ||
1536 | while (1) { | ||
1537 | struct ubifs_zbranch *zbr; | ||
1538 | union ubifs_key *key; | ||
1539 | unsigned int next_block; | ||
1540 | |||
1541 | /* Find next key */ | ||
1542 | err = tnc_next(c, &znode, &n); | ||
1543 | if (err) | ||
1544 | goto out; | ||
1545 | zbr = &znode->zbranch[n]; | ||
1546 | key = &zbr->key; | ||
1547 | /* See if there is another data key for this file */ | ||
1548 | if (key_inum(c, key) != key_inum(c, &bu->key) || | ||
1549 | key_type(c, key) != UBIFS_DATA_KEY) { | ||
1550 | err = -ENOENT; | ||
1551 | goto out; | ||
1552 | } | ||
1553 | if (lnum < 0) { | ||
1554 | /* First key found */ | ||
1555 | lnum = zbr->lnum; | ||
1556 | offs = ALIGN(zbr->offs + zbr->len, 8); | ||
1557 | len = zbr->len; | ||
1558 | if (len > bu->buf_len) { | ||
1559 | err = -EINVAL; | ||
1560 | goto out; | ||
1561 | } | ||
1562 | } else { | ||
1563 | /* | ||
1564 | * The data nodes must be in consecutive positions in | ||
1565 | * the same LEB. | ||
1566 | */ | ||
1567 | if (zbr->lnum != lnum || zbr->offs != offs) | ||
1568 | goto out; | ||
1569 | offs += ALIGN(zbr->len, 8); | ||
1570 | len = ALIGN(len, 8) + zbr->len; | ||
1571 | /* Must not exceed buffer length */ | ||
1572 | if (len > bu->buf_len) | ||
1573 | goto out; | ||
1574 | } | ||
1575 | /* Allow for holes */ | ||
1576 | next_block = key_block(c, key); | ||
1577 | bu->blk_cnt += (next_block - block - 1); | ||
1578 | if (bu->blk_cnt >= UBIFS_MAX_BULK_READ) | ||
1579 | goto out; | ||
1580 | block = next_block; | ||
1581 | /* Add this key */ | ||
1582 | bu->zbranch[bu->cnt++] = *zbr; | ||
1583 | bu->blk_cnt += 1; | ||
1584 | /* See if we have room for more */ | ||
1585 | if (bu->cnt >= UBIFS_MAX_BULK_READ) | ||
1586 | goto out; | ||
1587 | if (bu->blk_cnt >= UBIFS_MAX_BULK_READ) | ||
1588 | goto out; | ||
1589 | } | ||
1590 | out: | ||
1591 | if (err == -ENOENT) { | ||
1592 | bu->eof = 1; | ||
1593 | err = 0; | ||
1594 | } | ||
1595 | bu->gc_seq = c->gc_seq; | ||
1596 | mutex_unlock(&c->tnc_mutex); | ||
1597 | if (err) | ||
1598 | return err; | ||
1599 | /* | ||
1600 | * An enormous hole could cause bulk-read to encompass too many | ||
1601 | * page cache pages, so limit the number here. | ||
1602 | */ | ||
1603 | if (bu->blk_cnt > UBIFS_MAX_BULK_READ) | ||
1604 | bu->blk_cnt = UBIFS_MAX_BULK_READ; | ||
1605 | /* | ||
1606 | * Ensure that bulk-read covers a whole number of page cache | ||
1607 | * pages. | ||
1608 | */ | ||
1609 | if (UBIFS_BLOCKS_PER_PAGE == 1 || | ||
1610 | !(bu->blk_cnt & (UBIFS_BLOCKS_PER_PAGE - 1))) | ||
1611 | return 0; | ||
1612 | if (bu->eof) { | ||
1613 | /* At the end of file we can round up */ | ||
1614 | bu->blk_cnt += UBIFS_BLOCKS_PER_PAGE - 1; | ||
1615 | return 0; | ||
1616 | } | ||
1617 | /* Exclude data nodes that do not make up a whole page cache page */ | ||
1618 | block = key_block(c, &bu->key) + bu->blk_cnt; | ||
1619 | block &= ~(UBIFS_BLOCKS_PER_PAGE - 1); | ||
1620 | while (bu->cnt) { | ||
1621 | if (key_block(c, &bu->zbranch[bu->cnt - 1].key) < block) | ||
1622 | break; | ||
1623 | bu->cnt -= 1; | ||
1624 | } | ||
1625 | return 0; | ||
1626 | } | ||
1627 | |||
1628 | /** | ||
1629 | * read_wbuf - bulk-read from a LEB with a wbuf. | ||
1630 | * @wbuf: wbuf that may overlap the read | ||
1631 | * @buf: buffer into which to read | ||
1632 | * @len: read length | ||
1633 | * @lnum: LEB number from which to read | ||
1634 | * @offs: offset from which to read | ||
1635 | * | ||
1636 | * This functions returns %0 on success or a negative error code on failure. | ||
1637 | */ | ||
1638 | static int read_wbuf(struct ubifs_wbuf *wbuf, void *buf, int len, int lnum, | ||
1639 | int offs) | ||
1640 | { | ||
1641 | const struct ubifs_info *c = wbuf->c; | ||
1642 | int rlen, overlap; | ||
1643 | |||
1644 | dbg_io("LEB %d:%d, length %d", lnum, offs, len); | ||
1645 | ubifs_assert(wbuf && lnum >= 0 && lnum < c->leb_cnt && offs >= 0); | ||
1646 | ubifs_assert(!(offs & 7) && offs < c->leb_size); | ||
1647 | ubifs_assert(offs + len <= c->leb_size); | ||
1648 | |||
1649 | spin_lock(&wbuf->lock); | ||
1650 | overlap = (lnum == wbuf->lnum && offs + len > wbuf->offs); | ||
1651 | if (!overlap) { | ||
1652 | /* We may safely unlock the write-buffer and read the data */ | ||
1653 | spin_unlock(&wbuf->lock); | ||
1654 | return ubi_read(c->ubi, lnum, buf, offs, len); | ||
1655 | } | ||
1656 | |||
1657 | /* Don't read under wbuf */ | ||
1658 | rlen = wbuf->offs - offs; | ||
1659 | if (rlen < 0) | ||
1660 | rlen = 0; | ||
1661 | |||
1662 | /* Copy the rest from the write-buffer */ | ||
1663 | memcpy(buf + rlen, wbuf->buf + offs + rlen - wbuf->offs, len - rlen); | ||
1664 | spin_unlock(&wbuf->lock); | ||
1665 | |||
1666 | if (rlen > 0) | ||
1667 | /* Read everything that goes before write-buffer */ | ||
1668 | return ubi_read(c->ubi, lnum, buf, offs, rlen); | ||
1669 | |||
1670 | return 0; | ||
1671 | } | ||
1672 | |||
1673 | /** | ||
1674 | * validate_data_node - validate data nodes for bulk-read. | ||
1675 | * @c: UBIFS file-system description object | ||
1676 | * @buf: buffer containing data node to validate | ||
1677 | * @zbr: zbranch of data node to validate | ||
1678 | * | ||
1679 | * This functions returns %0 on success or a negative error code on failure. | ||
1680 | */ | ||
1681 | static int validate_data_node(struct ubifs_info *c, void *buf, | ||
1682 | struct ubifs_zbranch *zbr) | ||
1683 | { | ||
1684 | union ubifs_key key1; | ||
1685 | struct ubifs_ch *ch = buf; | ||
1686 | int err, len; | ||
1687 | |||
1688 | if (ch->node_type != UBIFS_DATA_NODE) { | ||
1689 | ubifs_err("bad node type (%d but expected %d)", | ||
1690 | ch->node_type, UBIFS_DATA_NODE); | ||
1691 | goto out_err; | ||
1692 | } | ||
1693 | |||
1694 | err = ubifs_check_node(c, buf, zbr->lnum, zbr->offs, 0, 0); | ||
1695 | if (err) { | ||
1696 | ubifs_err("expected node type %d", UBIFS_DATA_NODE); | ||
1697 | goto out; | ||
1698 | } | ||
1699 | |||
1700 | len = le32_to_cpu(ch->len); | ||
1701 | if (len != zbr->len) { | ||
1702 | ubifs_err("bad node length %d, expected %d", len, zbr->len); | ||
1703 | goto out_err; | ||
1704 | } | ||
1705 | |||
1706 | /* Make sure the key of the read node is correct */ | ||
1707 | key_read(c, buf + UBIFS_KEY_OFFSET, &key1); | ||
1708 | if (!keys_eq(c, &zbr->key, &key1)) { | ||
1709 | ubifs_err("bad key in node at LEB %d:%d", | ||
1710 | zbr->lnum, zbr->offs); | ||
1711 | dbg_tnc("looked for key %s found node's key %s", | ||
1712 | DBGKEY(&zbr->key), DBGKEY1(&key1)); | ||
1713 | goto out_err; | ||
1714 | } | ||
1715 | |||
1716 | return 0; | ||
1717 | |||
1718 | out_err: | ||
1719 | err = -EINVAL; | ||
1720 | out: | ||
1721 | ubifs_err("bad node at LEB %d:%d", zbr->lnum, zbr->offs); | ||
1722 | dbg_dump_node(c, buf); | ||
1723 | dbg_dump_stack(); | ||
1724 | return err; | ||
1725 | } | ||
1726 | |||
1727 | /** | ||
1728 | * ubifs_tnc_bulk_read - read a number of data nodes in one go. | ||
1729 | * @c: UBIFS file-system description object | ||
1730 | * @bu: bulk-read parameters and results | ||
1731 | * | ||
1732 | * This functions reads and validates the data nodes that were identified by the | ||
1733 | * 'ubifs_tnc_get_bu_keys()' function. This functions returns %0 on success, | ||
1734 | * -EAGAIN to indicate a race with GC, or another negative error code on | ||
1735 | * failure. | ||
1736 | */ | ||
1737 | int ubifs_tnc_bulk_read(struct ubifs_info *c, struct bu_info *bu) | ||
1738 | { | ||
1739 | int lnum = bu->zbranch[0].lnum, offs = bu->zbranch[0].offs, len, err, i; | ||
1740 | struct ubifs_wbuf *wbuf; | ||
1741 | void *buf; | ||
1742 | |||
1743 | len = bu->zbranch[bu->cnt - 1].offs; | ||
1744 | len += bu->zbranch[bu->cnt - 1].len - offs; | ||
1745 | if (len > bu->buf_len) { | ||
1746 | ubifs_err("buffer too small %d vs %d", bu->buf_len, len); | ||
1747 | return -EINVAL; | ||
1748 | } | ||
1749 | |||
1750 | /* Do the read */ | ||
1751 | wbuf = ubifs_get_wbuf(c, lnum); | ||
1752 | if (wbuf) | ||
1753 | err = read_wbuf(wbuf, bu->buf, len, lnum, offs); | ||
1754 | else | ||
1755 | err = ubi_read(c->ubi, lnum, bu->buf, offs, len); | ||
1756 | |||
1757 | /* Check for a race with GC */ | ||
1758 | if (maybe_leb_gced(c, lnum, bu->gc_seq)) | ||
1759 | return -EAGAIN; | ||
1760 | |||
1761 | if (err && err != -EBADMSG) { | ||
1762 | ubifs_err("failed to read from LEB %d:%d, error %d", | ||
1763 | lnum, offs, err); | ||
1764 | dbg_dump_stack(); | ||
1765 | dbg_tnc("key %s", DBGKEY(&bu->key)); | ||
1766 | return err; | ||
1767 | } | ||
1768 | |||
1769 | /* Validate the nodes read */ | ||
1770 | buf = bu->buf; | ||
1771 | for (i = 0; i < bu->cnt; i++) { | ||
1772 | err = validate_data_node(c, buf, &bu->zbranch[i]); | ||
1773 | if (err) | ||
1774 | return err; | ||
1775 | buf = buf + ALIGN(bu->zbranch[i].len, 8); | ||
1776 | } | ||
1777 | |||
1778 | return 0; | ||
1779 | } | ||
1780 | |||
1781 | /** | ||
1495 | * do_lookup_nm- look up a "hashed" node. | 1782 | * do_lookup_nm- look up a "hashed" node. |
1496 | * @c: UBIFS file-system description object | 1783 | * @c: UBIFS file-system description object |
1497 | * @key: node key to lookup | 1784 | * @key: node key to lookup |
@@ -1675,7 +1962,7 @@ static int tnc_insert(struct ubifs_info *c, struct ubifs_znode *znode, | |||
1675 | { | 1962 | { |
1676 | struct ubifs_znode *zn, *zi, *zp; | 1963 | struct ubifs_znode *zn, *zi, *zp; |
1677 | int i, keep, move, appending = 0; | 1964 | int i, keep, move, appending = 0; |
1678 | union ubifs_key *key = &zbr->key; | 1965 | union ubifs_key *key = &zbr->key, *key1; |
1679 | 1966 | ||
1680 | ubifs_assert(n >= 0 && n <= c->fanout); | 1967 | ubifs_assert(n >= 0 && n <= c->fanout); |
1681 | 1968 | ||
@@ -1716,20 +2003,33 @@ again: | |||
1716 | zn->level = znode->level; | 2003 | zn->level = znode->level; |
1717 | 2004 | ||
1718 | /* Decide where to split */ | 2005 | /* Decide where to split */ |
1719 | if (znode->level == 0 && n == c->fanout && | 2006 | if (znode->level == 0 && key_type(c, key) == UBIFS_DATA_KEY) { |
1720 | key_type(c, key) == UBIFS_DATA_KEY) { | 2007 | /* Try not to split consecutive data keys */ |
1721 | union ubifs_key *key1; | 2008 | if (n == c->fanout) { |
1722 | 2009 | key1 = &znode->zbranch[n - 1].key; | |
1723 | /* | 2010 | if (key_inum(c, key1) == key_inum(c, key) && |
1724 | * If this is an inode which is being appended - do not split | 2011 | key_type(c, key1) == UBIFS_DATA_KEY) |
1725 | * it because no other zbranches can be inserted between | 2012 | appending = 1; |
1726 | * zbranches of consecutive data nodes anyway. | 2013 | } else |
1727 | */ | 2014 | goto check_split; |
1728 | key1 = &znode->zbranch[n - 1].key; | 2015 | } else if (appending && n != c->fanout) { |
1729 | if (key_inum(c, key1) == key_inum(c, key) && | 2016 | /* Try not to split consecutive data keys */ |
1730 | key_type(c, key1) == UBIFS_DATA_KEY && | 2017 | appending = 0; |
1731 | key_block(c, key1) == key_block(c, key) - 1) | 2018 | check_split: |
1732 | appending = 1; | 2019 | if (n >= (c->fanout + 1) / 2) { |
2020 | key1 = &znode->zbranch[0].key; | ||
2021 | if (key_inum(c, key1) == key_inum(c, key) && | ||
2022 | key_type(c, key1) == UBIFS_DATA_KEY) { | ||
2023 | key1 = &znode->zbranch[n].key; | ||
2024 | if (key_inum(c, key1) != key_inum(c, key) || | ||
2025 | key_type(c, key1) != UBIFS_DATA_KEY) { | ||
2026 | keep = n; | ||
2027 | move = c->fanout - keep; | ||
2028 | zi = znode; | ||
2029 | goto do_split; | ||
2030 | } | ||
2031 | } | ||
2032 | } | ||
1733 | } | 2033 | } |
1734 | 2034 | ||
1735 | if (appending) { | 2035 | if (appending) { |
@@ -1759,6 +2059,8 @@ again: | |||
1759 | zbr->znode->parent = zn; | 2059 | zbr->znode->parent = zn; |
1760 | } | 2060 | } |
1761 | 2061 | ||
2062 | do_split: | ||
2063 | |||
1762 | __set_bit(DIRTY_ZNODE, &zn->flags); | 2064 | __set_bit(DIRTY_ZNODE, &zn->flags); |
1763 | atomic_long_inc(&c->dirty_zn_cnt); | 2065 | atomic_long_inc(&c->dirty_zn_cnt); |
1764 | 2066 | ||
@@ -1785,14 +2087,11 @@ again: | |||
1785 | 2087 | ||
1786 | /* Insert new znode (produced by spitting) into the parent */ | 2088 | /* Insert new znode (produced by spitting) into the parent */ |
1787 | if (zp) { | 2089 | if (zp) { |
1788 | i = n; | 2090 | if (n == 0 && zi == znode && znode->iip == 0) |
2091 | correct_parent_keys(c, znode); | ||
2092 | |||
1789 | /* Locate insertion point */ | 2093 | /* Locate insertion point */ |
1790 | n = znode->iip + 1; | 2094 | n = znode->iip + 1; |
1791 | if (appending && n != c->fanout) | ||
1792 | appending = 0; | ||
1793 | |||
1794 | if (i == 0 && zi == znode && znode->iip == 0) | ||
1795 | correct_parent_keys(c, znode); | ||
1796 | 2095 | ||
1797 | /* Tail recursion */ | 2096 | /* Tail recursion */ |
1798 | zbr->key = zn->zbranch[0].key; | 2097 | zbr->key = zn->zbranch[0].key; |