aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_dir_leaf.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_dir_leaf.c')
-rw-r--r--fs/xfs/xfs_dir_leaf.c127
1 files changed, 66 insertions, 61 deletions
diff --git a/fs/xfs/xfs_dir_leaf.c b/fs/xfs/xfs_dir_leaf.c
index 6a4d8caaba7b..e7121040cd9d 100644
--- a/fs/xfs/xfs_dir_leaf.c
+++ b/fs/xfs/xfs_dir_leaf.c
@@ -652,7 +652,7 @@ xfs_dir_leaf_to_shortform(xfs_da_args_t *iargs)
652 hdr = &leaf->hdr; 652 hdr = &leaf->hdr;
653 entry = &leaf->entries[0]; 653 entry = &leaf->entries[0];
654 for (i = be16_to_cpu(hdr->count)-1; i >= 0; entry++, i--) { 654 for (i = be16_to_cpu(hdr->count)-1; i >= 0; entry++, i--) {
655 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); 655 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, be16_to_cpu(entry->nameidx));
656 if ((entry->namelen == 2) && 656 if ((entry->namelen == 2) &&
657 (namest->name[0] == '.') && 657 (namest->name[0] == '.') &&
658 (namest->name[1] == '.')) { 658 (namest->name[1] == '.')) {
@@ -684,10 +684,10 @@ xfs_dir_leaf_to_shortform(xfs_da_args_t *iargs)
684 for (i = 0; i < be16_to_cpu(hdr->count); entry++, i++) { 684 for (i = 0; i < be16_to_cpu(hdr->count); entry++, i++) {
685 if (!entry->nameidx) 685 if (!entry->nameidx)
686 continue; 686 continue;
687 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); 687 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, be16_to_cpu(entry->nameidx));
688 args.name = (char *)(namest->name); 688 args.name = (char *)(namest->name);
689 args.namelen = entry->namelen; 689 args.namelen = entry->namelen;
690 args.hashval = INT_GET(entry->hashval, ARCH_CONVERT); 690 args.hashval = be32_to_cpu(entry->hashval);
691 XFS_DIR_SF_GET_DIRINO(&namest->inumber, &args.inumber); 691 XFS_DIR_SF_GET_DIRINO(&namest->inumber, &args.inumber);
692 xfs_dir_shortform_addname(&args); 692 xfs_dir_shortform_addname(&args);
693 } 693 }
@@ -742,9 +742,7 @@ xfs_dir_leaf_to_node(xfs_da_args_t *args)
742 node = bp1->data; 742 node = bp1->data;
743 leaf = bp2->data; 743 leaf = bp2->data;
744 ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC); 744 ASSERT(be16_to_cpu(leaf->hdr.info.magic) == XFS_DIR_LEAF_MAGIC);
745 node->btree[0].hashval = cpu_to_be32( 745 node->btree[0].hashval = leaf->entries[be16_to_cpu(leaf->hdr.count)-1].hashval;
746 INT_GET(leaf->entries[
747 be16_to_cpu(leaf->hdr.count)-1].hashval, ARCH_CONVERT));
748 xfs_da_buf_done(bp2); 746 xfs_da_buf_done(bp2);
749 node->btree[0].before = cpu_to_be32(blkno); 747 node->btree[0].before = cpu_to_be32(blkno);
750 node->hdr.count = cpu_to_be16(1); 748 node->hdr.count = cpu_to_be16(1);
@@ -970,8 +968,9 @@ xfs_dir_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int index,
970 ASSERT(be16_to_cpu(map->size) < XFS_LBSIZE(mp)); 968 ASSERT(be16_to_cpu(map->size) < XFS_LBSIZE(mp));
971 969
972 be16_add(&map->size, -(XFS_DIR_LEAF_ENTSIZE_BYNAME(args->namelen))); 970 be16_add(&map->size, -(XFS_DIR_LEAF_ENTSIZE_BYNAME(args->namelen)));
973 INT_SET(entry->nameidx, ARCH_CONVERT, be16_to_cpu(map->base) + be16_to_cpu(map->size)); 971 entry->nameidx = cpu_to_be16(be16_to_cpu(map->base) +
974 INT_SET(entry->hashval, ARCH_CONVERT, args->hashval); 972 be16_to_cpu(map->size));
973 entry->hashval = cpu_to_be32(args->hashval);
975 entry->namelen = args->namelen; 974 entry->namelen = args->namelen;
976 xfs_da_log_buf(args->trans, bp, 975 xfs_da_log_buf(args->trans, bp,
977 XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry))); 976 XFS_DA_LOGRANGE(leaf, entry, sizeof(*entry)));
@@ -979,7 +978,7 @@ xfs_dir_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int index,
979 /* 978 /*
980 * Copy the string and inode number into the new space. 979 * Copy the string and inode number into the new space.
981 */ 980 */
982 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); 981 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, be16_to_cpu(entry->nameidx));
983 XFS_DIR_SF_PUT_DIRINO(&args->inumber, &namest->inumber); 982 XFS_DIR_SF_PUT_DIRINO(&args->inumber, &namest->inumber);
984 memcpy(namest->name, args->name, args->namelen); 983 memcpy(namest->name, args->name, args->namelen);
985 xfs_da_log_buf(args->trans, bp, 984 xfs_da_log_buf(args->trans, bp,
@@ -988,7 +987,7 @@ xfs_dir_leaf_add_work(xfs_dabuf_t *bp, xfs_da_args_t *args, int index,
988 /* 987 /*
989 * Update the control info for this leaf node 988 * Update the control info for this leaf node
990 */ 989 */
991 if (INT_GET(entry->nameidx, ARCH_CONVERT) < be16_to_cpu(hdr->firstused)) 990 if (be16_to_cpu(entry->nameidx) < be16_to_cpu(hdr->firstused))
992 hdr->firstused = entry->nameidx; 991 hdr->firstused = entry->nameidx;
993 ASSERT(be16_to_cpu(hdr->firstused) >= 992 ASSERT(be16_to_cpu(hdr->firstused) >=
994 ((be16_to_cpu(hdr->count)*sizeof(*entry))+sizeof(*hdr))); 993 ((be16_to_cpu(hdr->count)*sizeof(*entry))+sizeof(*hdr)));
@@ -1198,8 +1197,10 @@ xfs_dir_leaf_rebalance(xfs_da_state_t *state, xfs_da_state_blk_t *blk1,
1198 /* 1197 /*
1199 * Copy out last hashval in each block for B-tree code. 1198 * Copy out last hashval in each block for B-tree code.
1200 */ 1199 */
1201 blk1->hashval = INT_GET(leaf1->entries[be16_to_cpu(leaf1->hdr.count)-1].hashval, ARCH_CONVERT); 1200 blk1->hashval = be32_to_cpu(leaf1->entries[
1202 blk2->hashval = INT_GET(leaf2->entries[be16_to_cpu(leaf2->hdr.count)-1].hashval, ARCH_CONVERT); 1201 be16_to_cpu(leaf1->hdr.count)-1].hashval);
1202 blk2->hashval = be32_to_cpu(leaf2->entries[
1203 be16_to_cpu(leaf2->hdr.count)-1].hashval);
1203 1204
1204 /* 1205 /*
1205 * Adjust the expected index for insertion. 1206 * Adjust the expected index for insertion.
@@ -1462,8 +1463,8 @@ xfs_dir_leaf_remove(xfs_trans_t *trans, xfs_dabuf_t *bp, int index)
1462 ASSERT(be16_to_cpu(hdr->firstused) >= 1463 ASSERT(be16_to_cpu(hdr->firstused) >=
1463 ((be16_to_cpu(hdr->count)*sizeof(*entry))+sizeof(*hdr))); 1464 ((be16_to_cpu(hdr->count)*sizeof(*entry))+sizeof(*hdr)));
1464 entry = &leaf->entries[index]; 1465 entry = &leaf->entries[index];
1465 ASSERT(INT_GET(entry->nameidx, ARCH_CONVERT) >= be16_to_cpu(hdr->firstused)); 1466 ASSERT(be16_to_cpu(entry->nameidx) >= be16_to_cpu(hdr->firstused));
1466 ASSERT(INT_GET(entry->nameidx, ARCH_CONVERT) < XFS_LBSIZE(mp)); 1467 ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp));
1467 1468
1468 /* 1469 /*
1469 * Scan through free region table: 1470 * Scan through free region table:
@@ -1487,9 +1488,11 @@ xfs_dir_leaf_remove(xfs_trans_t *trans, xfs_dabuf_t *bp, int index)
1487 be16_add(&map->size, entry_size); 1488 be16_add(&map->size, entry_size);
1488 } 1489 }
1489 1490
1490 if ((be16_to_cpu(map->base) + be16_to_cpu(map->size)) == INT_GET(entry->nameidx, ARCH_CONVERT)) { 1491 if ((be16_to_cpu(map->base) + be16_to_cpu(map->size)) ==
1492 be16_to_cpu(entry->nameidx)) {
1491 before = i; 1493 before = i;
1492 } else if (be16_to_cpu(map->base) == (INT_GET(entry->nameidx, ARCH_CONVERT) + entsize)) { 1494 } else if (be16_to_cpu(map->base) ==
1495 (be16_to_cpu(entry->nameidx) + entsize)) {
1493 after = i; 1496 after = i;
1494 } else if (be16_to_cpu(map->size) < tmp) { 1497 } else if (be16_to_cpu(map->size) < tmp) {
1495 tmp = be16_to_cpu(map->size); 1498 tmp = be16_to_cpu(map->size);
@@ -1530,7 +1533,7 @@ xfs_dir_leaf_remove(xfs_trans_t *trans, xfs_dabuf_t *bp, int index)
1530 /* 1533 /*
1531 * Did we remove the first entry? 1534 * Did we remove the first entry?
1532 */ 1535 */
1533 if (INT_GET(entry->nameidx, ARCH_CONVERT) == be16_to_cpu(hdr->firstused)) 1536 if (be16_to_cpu(entry->nameidx) == be16_to_cpu(hdr->firstused))
1534 smallest = 1; 1537 smallest = 1;
1535 else 1538 else
1536 smallest = 0; 1539 smallest = 0;
@@ -1538,7 +1541,7 @@ xfs_dir_leaf_remove(xfs_trans_t *trans, xfs_dabuf_t *bp, int index)
1538 /* 1541 /*
1539 * Compress the remaining entries and zero out the removed stuff. 1542 * Compress the remaining entries and zero out the removed stuff.
1540 */ 1543 */
1541 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); 1544 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, be16_to_cpu(entry->nameidx));
1542 memset((char *)namest, 0, entsize); 1545 memset((char *)namest, 0, entsize);
1543 xfs_da_log_buf(trans, bp, XFS_DA_LOGRANGE(leaf, namest, entsize)); 1546 xfs_da_log_buf(trans, bp, XFS_DA_LOGRANGE(leaf, namest, entsize));
1544 1547
@@ -1561,11 +1564,11 @@ xfs_dir_leaf_remove(xfs_trans_t *trans, xfs_dabuf_t *bp, int index)
1561 tmp = XFS_LBSIZE(mp); 1564 tmp = XFS_LBSIZE(mp);
1562 entry = &leaf->entries[0]; 1565 entry = &leaf->entries[0];
1563 for (i = be16_to_cpu(hdr->count)-1; i >= 0; entry++, i--) { 1566 for (i = be16_to_cpu(hdr->count)-1; i >= 0; entry++, i--) {
1564 ASSERT(INT_GET(entry->nameidx, ARCH_CONVERT) >= 1567 ASSERT(be16_to_cpu(entry->nameidx) >=
1565 be16_to_cpu(hdr->firstused)); 1568 be16_to_cpu(hdr->firstused));
1566 ASSERT(INT_GET(entry->nameidx, ARCH_CONVERT) < XFS_LBSIZE(mp)); 1569 ASSERT(be16_to_cpu(entry->nameidx) < XFS_LBSIZE(mp));
1567 if (INT_GET(entry->nameidx, ARCH_CONVERT) < tmp) 1570 if (be16_to_cpu(entry->nameidx) < tmp)
1568 tmp = INT_GET(entry->nameidx, ARCH_CONVERT); 1571 tmp = be16_to_cpu(entry->nameidx);
1569 } 1572 }
1570 hdr->firstused = cpu_to_be16(tmp); 1573 hdr->firstused = cpu_to_be16(tmp);
1571 if (!hdr->firstused) 1574 if (!hdr->firstused)
@@ -1617,7 +1620,8 @@ xfs_dir_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk,
1617 /* 1620 /*
1618 * Save last hashval from dying block for later Btree fixup. 1621 * Save last hashval from dying block for later Btree fixup.
1619 */ 1622 */
1620 drop_blk->hashval = INT_GET(drop_leaf->entries[be16_to_cpu(drop_leaf->hdr.count)-1].hashval, ARCH_CONVERT); 1623 drop_blk->hashval = be32_to_cpu(drop_leaf->entries[
1624 be16_to_cpu(drop_leaf->hdr.count)-1].hashval);
1621 1625
1622 /* 1626 /*
1623 * Check if we need a temp buffer, or can we do it in place. 1627 * Check if we need a temp buffer, or can we do it in place.
@@ -1676,7 +1680,8 @@ xfs_dir_leaf_unbalance(xfs_da_state_t *state, xfs_da_state_blk_t *drop_blk,
1676 /* 1680 /*
1677 * Copy out last hashval in each block for B-tree code. 1681 * Copy out last hashval in each block for B-tree code.
1678 */ 1682 */
1679 save_blk->hashval = INT_GET(save_leaf->entries[be16_to_cpu(save_leaf->hdr.count)-1 ].hashval, ARCH_CONVERT); 1683 save_blk->hashval = be32_to_cpu(save_leaf->entries[
1684 be16_to_cpu(save_leaf->hdr.count)-1].hashval);
1680} 1685}
1681 1686
1682/*======================================================================== 1687/*========================================================================
@@ -1716,30 +1721,32 @@ xfs_dir_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args, int *index)
1716 for (entry = &leaf->entries[probe]; span > 4; 1721 for (entry = &leaf->entries[probe]; span > 4;
1717 entry = &leaf->entries[probe]) { 1722 entry = &leaf->entries[probe]) {
1718 span /= 2; 1723 span /= 2;
1719 if (INT_GET(entry->hashval, ARCH_CONVERT) < hashval) 1724 if (be32_to_cpu(entry->hashval) < hashval)
1720 probe += span; 1725 probe += span;
1721 else if (INT_GET(entry->hashval, ARCH_CONVERT) > hashval) 1726 else if (be32_to_cpu(entry->hashval) > hashval)
1722 probe -= span; 1727 probe -= span;
1723 else 1728 else
1724 break; 1729 break;
1725 } 1730 }
1726 ASSERT((probe >= 0) && \ 1731 ASSERT((probe >= 0) && \
1727 ((!leaf->hdr.count) || (probe < be16_to_cpu(leaf->hdr.count)))); 1732 ((!leaf->hdr.count) || (probe < be16_to_cpu(leaf->hdr.count))));
1728 ASSERT((span <= 4) || (INT_GET(entry->hashval, ARCH_CONVERT) == hashval)); 1733 ASSERT((span <= 4) || (be32_to_cpu(entry->hashval) == hashval));
1729 1734
1730 /* 1735 /*
1731 * Since we may have duplicate hashval's, find the first matching 1736 * Since we may have duplicate hashval's, find the first matching
1732 * hashval in the leaf. 1737 * hashval in the leaf.
1733 */ 1738 */
1734 while ((probe > 0) && (INT_GET(entry->hashval, ARCH_CONVERT) >= hashval)) { 1739 while ((probe > 0) && (be32_to_cpu(entry->hashval) >= hashval)) {
1735 entry--; 1740 entry--;
1736 probe--; 1741 probe--;
1737 } 1742 }
1738 while ((probe < be16_to_cpu(leaf->hdr.count)) && (INT_GET(entry->hashval, ARCH_CONVERT) < hashval)) { 1743 while ((probe < be16_to_cpu(leaf->hdr.count)) &&
1744 (be32_to_cpu(entry->hashval) < hashval)) {
1739 entry++; 1745 entry++;
1740 probe++; 1746 probe++;
1741 } 1747 }
1742 if ((probe == be16_to_cpu(leaf->hdr.count)) || (INT_GET(entry->hashval, ARCH_CONVERT) != hashval)) { 1748 if ((probe == be16_to_cpu(leaf->hdr.count)) ||
1749 (be32_to_cpu(entry->hashval) != hashval)) {
1743 *index = probe; 1750 *index = probe;
1744 ASSERT(args->oknoent); 1751 ASSERT(args->oknoent);
1745 return XFS_ERROR(ENOENT); 1752 return XFS_ERROR(ENOENT);
@@ -1748,8 +1755,9 @@ xfs_dir_leaf_lookup_int(xfs_dabuf_t *bp, xfs_da_args_t *args, int *index)
1748 /* 1755 /*
1749 * Duplicate keys may be present, so search all of them for a match. 1756 * Duplicate keys may be present, so search all of them for a match.
1750 */ 1757 */
1751 while ((probe < be16_to_cpu(leaf->hdr.count)) && (INT_GET(entry->hashval, ARCH_CONVERT) == hashval)) { 1758 while ((probe < be16_to_cpu(leaf->hdr.count)) &&
1752 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, INT_GET(entry->nameidx, ARCH_CONVERT)); 1759 (be32_to_cpu(entry->hashval) == hashval)) {
1760 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, be16_to_cpu(entry->nameidx));
1753 if (entry->namelen == args->namelen && 1761 if (entry->namelen == args->namelen &&
1754 namest->name[0] == args->name[0] && 1762 namest->name[0] == args->name[0] &&
1755 memcmp(args->name, namest->name, args->namelen) == 0) { 1763 memcmp(args->name, namest->name, args->namelen) == 0) {
@@ -1825,19 +1833,19 @@ xfs_dir_leaf_moveents(xfs_dir_leafblock_t *leaf_s, int start_s,
1825 entry_s = &leaf_s->entries[start_s]; 1833 entry_s = &leaf_s->entries[start_s];
1826 entry_d = &leaf_d->entries[start_d]; 1834 entry_d = &leaf_d->entries[start_d];
1827 for (i = 0; i < count; entry_s++, entry_d++, i++) { 1835 for (i = 0; i < count; entry_s++, entry_d++, i++) {
1828 ASSERT(INT_GET(entry_s->nameidx, ARCH_CONVERT) >= 1836 ASSERT(be16_to_cpu(entry_s->nameidx) >=
1829 be16_to_cpu(hdr_s->firstused)); 1837 be16_to_cpu(hdr_s->firstused));
1830 tmp = XFS_DIR_LEAF_ENTSIZE_BYENTRY(entry_s); 1838 tmp = XFS_DIR_LEAF_ENTSIZE_BYENTRY(entry_s);
1831 be16_add(&hdr_d->firstused, -(tmp)); 1839 be16_add(&hdr_d->firstused, -(tmp));
1832 entry_d->hashval = entry_s->hashval; 1840 entry_d->hashval = entry_s->hashval;
1833 entry_d->nameidx = hdr_d->firstused; 1841 entry_d->nameidx = hdr_d->firstused;
1834 entry_d->namelen = entry_s->namelen; 1842 entry_d->namelen = entry_s->namelen;
1835 ASSERT(INT_GET(entry_d->nameidx, ARCH_CONVERT) + tmp <= XFS_LBSIZE(mp)); 1843 ASSERT(be16_to_cpu(entry_d->nameidx) + tmp <= XFS_LBSIZE(mp));
1836 memcpy(XFS_DIR_LEAF_NAMESTRUCT(leaf_d, INT_GET(entry_d->nameidx, ARCH_CONVERT)), 1844 memcpy(XFS_DIR_LEAF_NAMESTRUCT(leaf_d, be16_to_cpu(entry_d->nameidx)),
1837 XFS_DIR_LEAF_NAMESTRUCT(leaf_s, INT_GET(entry_s->nameidx, ARCH_CONVERT)), tmp); 1845 XFS_DIR_LEAF_NAMESTRUCT(leaf_s, be16_to_cpu(entry_s->nameidx)), tmp);
1838 ASSERT(INT_GET(entry_s->nameidx, ARCH_CONVERT) + tmp <= XFS_LBSIZE(mp)); 1846 ASSERT(be16_to_cpu(entry_s->nameidx) + tmp <= XFS_LBSIZE(mp));
1839 memset((char *)XFS_DIR_LEAF_NAMESTRUCT(leaf_s, INT_GET(entry_s->nameidx, ARCH_CONVERT)), 1847 memset((char *)XFS_DIR_LEAF_NAMESTRUCT(leaf_s,
1840 0, tmp); 1848 be16_to_cpu(entry_s->nameidx)), 0, tmp);
1841 be16_add(&hdr_s->namebytes, -(entry_d->namelen)); 1849 be16_add(&hdr_s->namebytes, -(entry_d->namelen));
1842 be16_add(&hdr_d->namebytes, entry_d->namelen); 1850 be16_add(&hdr_d->namebytes, entry_d->namelen);
1843 be16_add(&hdr_s->count, -1); 1851 be16_add(&hdr_s->count, -1);
@@ -1900,10 +1908,12 @@ xfs_dir_leaf_order(xfs_dabuf_t *leaf1_bp, xfs_dabuf_t *leaf2_bp)
1900 ASSERT((be16_to_cpu(leaf1->hdr.info.magic) == XFS_DIR_LEAF_MAGIC) && 1908 ASSERT((be16_to_cpu(leaf1->hdr.info.magic) == XFS_DIR_LEAF_MAGIC) &&
1901 (be16_to_cpu(leaf2->hdr.info.magic) == XFS_DIR_LEAF_MAGIC)); 1909 (be16_to_cpu(leaf2->hdr.info.magic) == XFS_DIR_LEAF_MAGIC));
1902 if (leaf1->hdr.count && leaf2->hdr.count && 1910 if (leaf1->hdr.count && leaf2->hdr.count &&
1903 ((INT_GET(leaf2->entries[ 0 ].hashval, ARCH_CONVERT) < 1911 ((be32_to_cpu(leaf2->entries[0].hashval) <
1904 INT_GET(leaf1->entries[ 0 ].hashval, ARCH_CONVERT)) || 1912 be32_to_cpu(leaf1->entries[0 ].hashval)) ||
1905 (INT_GET(leaf2->entries[be16_to_cpu(leaf2->hdr.count)-1].hashval, ARCH_CONVERT) < 1913 (be32_to_cpu(leaf2->entries[
1906 INT_GET(leaf1->entries[be16_to_cpu(leaf1->hdr.count)-1].hashval, ARCH_CONVERT)))) { 1914 be16_to_cpu(leaf2->hdr.count)-1].hashval) <
1915 be32_to_cpu(leaf1->entries[
1916 be16_to_cpu(leaf1->hdr.count)-1].hashval)))) {
1907 return 1; 1917 return 1;
1908 } 1918 }
1909 return 0; 1919 return 0;
@@ -1923,7 +1933,7 @@ xfs_dir_leaf_lasthash(xfs_dabuf_t *bp, int *count)
1923 *count = be16_to_cpu(leaf->hdr.count); 1933 *count = be16_to_cpu(leaf->hdr.count);
1924 if (!leaf->hdr.count) 1934 if (!leaf->hdr.count)
1925 return(0); 1935 return(0);
1926 return(INT_GET(leaf->entries[be16_to_cpu(leaf->hdr.count)-1].hashval, ARCH_CONVERT)); 1936 return be32_to_cpu(leaf->entries[be16_to_cpu(leaf->hdr.count)-1].hashval);
1927} 1937}
1928 1938
1929/* 1939/*
@@ -1972,7 +1982,7 @@ xfs_dir_leaf_getdents_int(
1972 i < be16_to_cpu(leaf->hdr.count); entry++, i++) { 1982 i < be16_to_cpu(leaf->hdr.count); entry++, i++) {
1973 1983
1974 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, 1984 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf,
1975 INT_GET(entry->nameidx, ARCH_CONVERT)); 1985 be16_to_cpu(entry->nameidx));
1976 1986
1977 if (unlikely( 1987 if (unlikely(
1978 ((char *)namest < (char *)leaf) || 1988 ((char *)namest < (char *)leaf) ||
@@ -1982,19 +1992,16 @@ xfs_dir_leaf_getdents_int(
1982 xfs_dir_trace_g_du("leaf: corrupted", dp, uio); 1992 xfs_dir_trace_g_du("leaf: corrupted", dp, uio);
1983 return XFS_ERROR(EFSCORRUPTED); 1993 return XFS_ERROR(EFSCORRUPTED);
1984 } 1994 }
1985 if (INT_GET(entry->hashval, ARCH_CONVERT) >= cookhash) { 1995 if (be32_to_cpu(entry->hashval) >= cookhash) {
1986 if ( entno < want_entno 1996 if (entno < want_entno &&
1987 && INT_GET(entry->hashval, ARCH_CONVERT) 1997 be32_to_cpu(entry->hashval) == cookhash) {
1988 == cookhash) {
1989 /* 1998 /*
1990 * Trying to get to a particular offset in a 1999 * Trying to get to a particular offset in a
1991 * run of equal-hashval entries. 2000 * run of equal-hashval entries.
1992 */ 2001 */
1993 entno++; 2002 entno++;
1994 } else if ( want_entno > 0 2003 } else if (want_entno > 0 && entno == want_entno &&
1995 && entno == want_entno 2004 be32_to_cpu(entry->hashval) == cookhash) {
1996 && INT_GET(entry->hashval, ARCH_CONVERT)
1997 == cookhash) {
1998 break; 2005 break;
1999 } else { 2006 } else {
2000 entno = 0; 2007 entno = 0;
@@ -2035,7 +2042,7 @@ xfs_dir_leaf_getdents_int(
2035 * the inode number from this entry. 2042 * the inode number from this entry.
2036 */ 2043 */
2037 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf, 2044 namest = XFS_DIR_LEAF_NAMESTRUCT(leaf,
2038 INT_GET(entry->nameidx, ARCH_CONVERT)); 2045 be16_to_cpu(entry->nameidx));
2039 2046
2040 if (unlikely( 2047 if (unlikely(
2041 ((char *)namest < (char *)leaf) || 2048 ((char *)namest < (char *)leaf) ||
@@ -2050,9 +2057,9 @@ xfs_dir_leaf_getdents_int(
2050 dp, uio, p.cook.o); 2057 dp, uio, p.cook.o);
2051 2058
2052 if (i < (be16_to_cpu(leaf->hdr.count) - 1)) { 2059 if (i < (be16_to_cpu(leaf->hdr.count) - 1)) {
2053 nexthash = INT_GET(entry[1].hashval, ARCH_CONVERT); 2060 nexthash = be32_to_cpu(entry[1].hashval);
2054 2061
2055 if (nexthash == INT_GET(entry->hashval, ARCH_CONVERT)) 2062 if (nexthash == be32_to_cpu(entry->hashval))
2056 nextentno = entno + 1; 2063 nextentno = entno + 1;
2057 else 2064 else
2058 nextentno = 0; 2065 nextentno = 0;
@@ -2088,8 +2095,7 @@ xfs_dir_leaf_getdents_int(
2088 return XFS_ERROR(EFSCORRUPTED); 2095 return XFS_ERROR(EFSCORRUPTED);
2089 } 2096 }
2090 2097
2091 nexthash = INT_GET(leaf2->entries[0].hashval, 2098 nexthash = be32_to_cpu(leaf2->entries[0].hashval);
2092 ARCH_CONVERT);
2093 nextentno = -1; 2099 nextentno = -1;
2094 XFS_PUT_COOKIE(p.cook, mp, thishash, 0, nexthash); 2100 XFS_PUT_COOKIE(p.cook, mp, thishash, 0, nexthash);
2095 xfs_da_brelse(dp->i_transp, bp2); 2101 xfs_da_brelse(dp->i_transp, bp2);
@@ -2113,9 +2119,9 @@ xfs_dir_leaf_getdents_int(
2113 * that share the same hashval. Hopefully the buffer 2119 * that share the same hashval. Hopefully the buffer
2114 * provided is big enough to handle it (see pv763517). 2120 * provided is big enough to handle it (see pv763517).
2115 */ 2121 */
2122 thishash = be32_to_cpu(entry->hashval);
2116#if (BITS_PER_LONG == 32) 2123#if (BITS_PER_LONG == 32)
2117 if ((thishash = INT_GET(entry->hashval, ARCH_CONVERT)) 2124 if (thishash != lasthash) {
2118 != lasthash) {
2119 XFS_PUT_COOKIE(lastoffset, mp, bno, entno, thishash); 2125 XFS_PUT_COOKIE(lastoffset, mp, bno, entno, thishash);
2120 lastresid = uio->uio_resid; 2126 lastresid = uio->uio_resid;
2121 lasthash = thishash; 2127 lasthash = thishash;
@@ -2124,7 +2130,6 @@ xfs_dir_leaf_getdents_int(
2124 dp, uio, p.cook.o); 2130 dp, uio, p.cook.o);
2125 } 2131 }
2126#else 2132#else
2127 thishash = INT_GET(entry->hashval, ARCH_CONVERT);
2128 XFS_PUT_COOKIE(lastoffset, mp, bno, entno, thishash); 2133 XFS_PUT_COOKIE(lastoffset, mp, bno, entno, thishash);
2129 lastresid = uio->uio_resid; 2134 lastresid = uio->uio_resid;
2130#endif /* BITS_PER_LONG == 32 */ 2135#endif /* BITS_PER_LONG == 32 */