xfs: return the hash value of a leaf1 directory block

Modify the existing dir leafn lasthash function to enable us to
calculate the highest hash value of a leaf1 block.  This will be used by
the directory scrubbing code to check the sanity of hashes in leaf1
directory blocks.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
This commit is contained in:
Darrick J. Wong 2017-06-16 11:00:13 -07:00
parent e7f5d5ca36
commit 8e8877e6ed
3 changed files with 12 additions and 10 deletions

View File

@ -1282,7 +1282,7 @@ xfs_da3_fixhashpath(
return; return;
break; break;
case XFS_DIR2_LEAFN_MAGIC: case XFS_DIR2_LEAFN_MAGIC:
lasthash = xfs_dir2_leafn_lasthash(dp, blk->bp, &count); lasthash = xfs_dir2_leaf_lasthash(dp, blk->bp, &count);
if (count == 0) if (count == 0)
return; return;
break; break;
@ -1502,7 +1502,7 @@ xfs_da3_node_lookup_int(
if (blk->magic == XFS_DIR2_LEAFN_MAGIC || if (blk->magic == XFS_DIR2_LEAFN_MAGIC ||
blk->magic == XFS_DIR3_LEAFN_MAGIC) { blk->magic == XFS_DIR3_LEAFN_MAGIC) {
blk->magic = XFS_DIR2_LEAFN_MAGIC; blk->magic = XFS_DIR2_LEAFN_MAGIC;
blk->hashval = xfs_dir2_leafn_lasthash(args->dp, blk->hashval = xfs_dir2_leaf_lasthash(args->dp,
blk->bp, NULL); blk->bp, NULL);
break; break;
} }
@ -1929,7 +1929,7 @@ xfs_da3_path_shift(
blk->magic = XFS_DIR2_LEAFN_MAGIC; blk->magic = XFS_DIR2_LEAFN_MAGIC;
ASSERT(level == path->active-1); ASSERT(level == path->active-1);
blk->index = 0; blk->index = 0;
blk->hashval = xfs_dir2_leafn_lasthash(args->dp, blk->hashval = xfs_dir2_leaf_lasthash(args->dp,
blk->bp, NULL); blk->bp, NULL);
break; break;
default: default:

View File

@ -528,7 +528,7 @@ xfs_dir2_free_hdr_check(
* Stale entries are ok. * Stale entries are ok.
*/ */
xfs_dahash_t /* hash value */ xfs_dahash_t /* hash value */
xfs_dir2_leafn_lasthash( xfs_dir2_leaf_lasthash(
struct xfs_inode *dp, struct xfs_inode *dp,
struct xfs_buf *bp, /* leaf buffer */ struct xfs_buf *bp, /* leaf buffer */
int *count) /* count of entries in leaf */ int *count) /* count of entries in leaf */
@ -540,7 +540,9 @@ xfs_dir2_leafn_lasthash(
dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf); dp->d_ops->leaf_hdr_from_disk(&leafhdr, leaf);
ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC || ASSERT(leafhdr.magic == XFS_DIR2_LEAFN_MAGIC ||
leafhdr.magic == XFS_DIR3_LEAFN_MAGIC); leafhdr.magic == XFS_DIR3_LEAFN_MAGIC ||
leafhdr.magic == XFS_DIR2_LEAF1_MAGIC ||
leafhdr.magic == XFS_DIR3_LEAF1_MAGIC);
if (count) if (count)
*count = leafhdr.count; *count = leafhdr.count;
@ -1405,8 +1407,8 @@ xfs_dir2_leafn_split(
/* /*
* Update last hashval in each block since we added the name. * Update last hashval in each block since we added the name.
*/ */
oldblk->hashval = xfs_dir2_leafn_lasthash(dp, oldblk->bp, NULL); oldblk->hashval = xfs_dir2_leaf_lasthash(dp, oldblk->bp, NULL);
newblk->hashval = xfs_dir2_leafn_lasthash(dp, newblk->bp, NULL); newblk->hashval = xfs_dir2_leaf_lasthash(dp, newblk->bp, NULL);
xfs_dir3_leaf_check(dp, oldblk->bp); xfs_dir3_leaf_check(dp, oldblk->bp);
xfs_dir3_leaf_check(dp, newblk->bp); xfs_dir3_leaf_check(dp, newblk->bp);
return error; return error;

View File

@ -95,7 +95,7 @@ extern bool xfs_dir3_leaf_check_int(struct xfs_mount *mp, struct xfs_inode *dp,
/* xfs_dir2_node.c */ /* xfs_dir2_node.c */
extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args, extern int xfs_dir2_leaf_to_node(struct xfs_da_args *args,
struct xfs_buf *lbp); struct xfs_buf *lbp);
extern xfs_dahash_t xfs_dir2_leafn_lasthash(struct xfs_inode *dp, extern xfs_dahash_t xfs_dir2_leaf_lasthash(struct xfs_inode *dp,
struct xfs_buf *bp, int *count); struct xfs_buf *bp, int *count);
extern int xfs_dir2_leafn_lookup_int(struct xfs_buf *bp, extern int xfs_dir2_leafn_lookup_int(struct xfs_buf *bp,
struct xfs_da_args *args, int *indexp, struct xfs_da_args *args, int *indexp,