mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 05:04:09 +08:00
xfs: add CRCs to dir2/da node blocks
Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Ben Myers <bpm@sgi.com> Signed-off-by: Ben Myers <bpm@sgi.com>
This commit is contained in:
parent
6b2647a12a
commit
f5ea110044
@ -15,7 +15,6 @@
|
|||||||
* along with this program; if not, write the Free Software Foundation,
|
* along with this program; if not, write the Free Software Foundation,
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "xfs.h"
|
#include "xfs.h"
|
||||||
#include "xfs_fs.h"
|
#include "xfs_fs.h"
|
||||||
#include "xfs_types.h"
|
#include "xfs_types.h"
|
||||||
@ -1236,7 +1235,7 @@ restart:
|
|||||||
* Search to see if name already exists, and get back a pointer
|
* Search to see if name already exists, and get back a pointer
|
||||||
* to where it should go.
|
* to where it should go.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_lookup_int(state, &retval);
|
error = xfs_da3_node_lookup_int(state, &retval);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
blk = &state->path.blk[ state->path.active-1 ];
|
blk = &state->path.blk[ state->path.active-1 ];
|
||||||
@ -1307,7 +1306,7 @@ restart:
|
|||||||
* in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields.
|
* in the index2/blkno2/rmtblkno2/rmtblkcnt2 fields.
|
||||||
*/
|
*/
|
||||||
xfs_bmap_init(args->flist, args->firstblock);
|
xfs_bmap_init(args->flist, args->firstblock);
|
||||||
error = xfs_da_split(state);
|
error = xfs_da3_split(state);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
error = xfs_bmap_finish(&args->trans, args->flist,
|
error = xfs_bmap_finish(&args->trans, args->flist,
|
||||||
&committed);
|
&committed);
|
||||||
@ -1329,7 +1328,7 @@ restart:
|
|||||||
/*
|
/*
|
||||||
* Addition succeeded, update Btree hashvals.
|
* Addition succeeded, update Btree hashvals.
|
||||||
*/
|
*/
|
||||||
xfs_da_fixhashpath(state, &state->path);
|
xfs_da3_fixhashpath(state, &state->path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1400,7 +1399,7 @@ restart:
|
|||||||
state->blocksize = state->mp->m_sb.sb_blocksize;
|
state->blocksize = state->mp->m_sb.sb_blocksize;
|
||||||
state->node_ents = state->mp->m_attr_node_ents;
|
state->node_ents = state->mp->m_attr_node_ents;
|
||||||
state->inleaf = 0;
|
state->inleaf = 0;
|
||||||
error = xfs_da_node_lookup_int(state, &retval);
|
error = xfs_da3_node_lookup_int(state, &retval);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
@ -1410,14 +1409,14 @@ restart:
|
|||||||
blk = &state->path.blk[ state->path.active-1 ];
|
blk = &state->path.blk[ state->path.active-1 ];
|
||||||
ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
|
ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
|
||||||
error = xfs_attr_leaf_remove(blk->bp, args);
|
error = xfs_attr_leaf_remove(blk->bp, args);
|
||||||
xfs_da_fixhashpath(state, &state->path);
|
xfs_da3_fixhashpath(state, &state->path);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if the tree needs to be collapsed.
|
* Check to see if the tree needs to be collapsed.
|
||||||
*/
|
*/
|
||||||
if (retval && (state->path.active > 1)) {
|
if (retval && (state->path.active > 1)) {
|
||||||
xfs_bmap_init(args->flist, args->firstblock);
|
xfs_bmap_init(args->flist, args->firstblock);
|
||||||
error = xfs_da_join(state);
|
error = xfs_da3_join(state);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
error = xfs_bmap_finish(&args->trans,
|
error = xfs_bmap_finish(&args->trans,
|
||||||
args->flist,
|
args->flist,
|
||||||
@ -1495,7 +1494,7 @@ xfs_attr_node_removename(xfs_da_args_t *args)
|
|||||||
/*
|
/*
|
||||||
* Search to see if name exists, and get back a pointer to it.
|
* Search to see if name exists, and get back a pointer to it.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_lookup_int(state, &retval);
|
error = xfs_da3_node_lookup_int(state, &retval);
|
||||||
if (error || (retval != EEXIST)) {
|
if (error || (retval != EEXIST)) {
|
||||||
if (error == 0)
|
if (error == 0)
|
||||||
error = retval;
|
error = retval;
|
||||||
@ -1546,14 +1545,14 @@ xfs_attr_node_removename(xfs_da_args_t *args)
|
|||||||
blk = &state->path.blk[ state->path.active-1 ];
|
blk = &state->path.blk[ state->path.active-1 ];
|
||||||
ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
|
ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
|
||||||
retval = xfs_attr_leaf_remove(blk->bp, args);
|
retval = xfs_attr_leaf_remove(blk->bp, args);
|
||||||
xfs_da_fixhashpath(state, &state->path);
|
xfs_da3_fixhashpath(state, &state->path);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check to see if the tree needs to be collapsed.
|
* Check to see if the tree needs to be collapsed.
|
||||||
*/
|
*/
|
||||||
if (retval && (state->path.active > 1)) {
|
if (retval && (state->path.active > 1)) {
|
||||||
xfs_bmap_init(args->flist, args->firstblock);
|
xfs_bmap_init(args->flist, args->firstblock);
|
||||||
error = xfs_da_join(state);
|
error = xfs_da3_join(state);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
error = xfs_bmap_finish(&args->trans, args->flist,
|
error = xfs_bmap_finish(&args->trans, args->flist,
|
||||||
&committed);
|
&committed);
|
||||||
@ -1699,7 +1698,7 @@ xfs_attr_refillstate(xfs_da_state_t *state)
|
|||||||
ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH));
|
ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH));
|
||||||
for (blk = path->blk, level = 0; level < path->active; blk++, level++) {
|
for (blk = path->blk, level = 0; level < path->active; blk++, level++) {
|
||||||
if (blk->disk_blkno) {
|
if (blk->disk_blkno) {
|
||||||
error = xfs_da_node_read(state->args->trans,
|
error = xfs_da3_node_read(state->args->trans,
|
||||||
state->args->dp,
|
state->args->dp,
|
||||||
blk->blkno, blk->disk_blkno,
|
blk->blkno, blk->disk_blkno,
|
||||||
&blk->bp, XFS_ATTR_FORK);
|
&blk->bp, XFS_ATTR_FORK);
|
||||||
@ -1718,7 +1717,7 @@ xfs_attr_refillstate(xfs_da_state_t *state)
|
|||||||
ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH));
|
ASSERT((path->active >= 0) && (path->active < XFS_DA_NODE_MAXDEPTH));
|
||||||
for (blk = path->blk, level = 0; level < path->active; blk++, level++) {
|
for (blk = path->blk, level = 0; level < path->active; blk++, level++) {
|
||||||
if (blk->disk_blkno) {
|
if (blk->disk_blkno) {
|
||||||
error = xfs_da_node_read(state->args->trans,
|
error = xfs_da3_node_read(state->args->trans,
|
||||||
state->args->dp,
|
state->args->dp,
|
||||||
blk->blkno, blk->disk_blkno,
|
blk->blkno, blk->disk_blkno,
|
||||||
&blk->bp, XFS_ATTR_FORK);
|
&blk->bp, XFS_ATTR_FORK);
|
||||||
@ -1758,7 +1757,7 @@ xfs_attr_node_get(xfs_da_args_t *args)
|
|||||||
/*
|
/*
|
||||||
* Search to see if name exists, and get back a pointer to it.
|
* Search to see if name exists, and get back a pointer to it.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_lookup_int(state, &retval);
|
error = xfs_da3_node_lookup_int(state, &retval);
|
||||||
if (error) {
|
if (error) {
|
||||||
retval = error;
|
retval = error;
|
||||||
} else if (retval == EEXIST) {
|
} else if (retval == EEXIST) {
|
||||||
@ -1810,7 +1809,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context)
|
|||||||
*/
|
*/
|
||||||
bp = NULL;
|
bp = NULL;
|
||||||
if (cursor->blkno > 0) {
|
if (cursor->blkno > 0) {
|
||||||
error = xfs_da_node_read(NULL, context->dp, cursor->blkno, -1,
|
error = xfs_da3_node_read(NULL, context->dp, cursor->blkno, -1,
|
||||||
&bp, XFS_ATTR_FORK);
|
&bp, XFS_ATTR_FORK);
|
||||||
if ((error != 0) && (error != EFSCORRUPTED))
|
if ((error != 0) && (error != EFSCORRUPTED))
|
||||||
return(error);
|
return(error);
|
||||||
@ -1852,7 +1851,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context)
|
|||||||
if (bp == NULL) {
|
if (bp == NULL) {
|
||||||
cursor->blkno = 0;
|
cursor->blkno = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
error = xfs_da_node_read(NULL, context->dp,
|
error = xfs_da3_node_read(NULL, context->dp,
|
||||||
cursor->blkno, -1, &bp,
|
cursor->blkno, -1, &bp,
|
||||||
XFS_ATTR_FORK);
|
XFS_ATTR_FORK);
|
||||||
if (error)
|
if (error)
|
||||||
@ -1870,7 +1869,7 @@ xfs_attr_node_list(xfs_attr_list_context_t *context)
|
|||||||
xfs_trans_brelse(NULL, bp);
|
xfs_trans_brelse(NULL, bp);
|
||||||
return(XFS_ERROR(EFSCORRUPTED));
|
return(XFS_ERROR(EFSCORRUPTED));
|
||||||
}
|
}
|
||||||
btree = node->btree;
|
btree = xfs_da3_node_tree_p(node);
|
||||||
for (i = 0; i < be16_to_cpu(node->hdr.count);
|
for (i = 0; i < be16_to_cpu(node->hdr.count);
|
||||||
btree++, i++) {
|
btree++, i++) {
|
||||||
if (cursor->hashval
|
if (cursor->hashval
|
||||||
|
@ -910,6 +910,7 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args)
|
|||||||
struct xfs_buf *bp1, *bp2;
|
struct xfs_buf *bp1, *bp2;
|
||||||
xfs_dablk_t blkno;
|
xfs_dablk_t blkno;
|
||||||
int error;
|
int error;
|
||||||
|
struct xfs_da_node_entry *btree;
|
||||||
|
|
||||||
trace_xfs_attr_leaf_to_node(args);
|
trace_xfs_attr_leaf_to_node(args);
|
||||||
|
|
||||||
@ -935,16 +936,16 @@ xfs_attr_leaf_to_node(xfs_da_args_t *args)
|
|||||||
/*
|
/*
|
||||||
* Set up the new root node.
|
* Set up the new root node.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK);
|
error = xfs_da3_node_create(args, 0, 1, &bp1, XFS_ATTR_FORK);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
node = bp1->b_addr;
|
node = bp1->b_addr;
|
||||||
leaf = bp2->b_addr;
|
leaf = bp2->b_addr;
|
||||||
ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC));
|
ASSERT(leaf->hdr.info.magic == cpu_to_be16(XFS_ATTR_LEAF_MAGIC));
|
||||||
/* both on-disk, don't endian-flip twice */
|
/* both on-disk, don't endian-flip twice */
|
||||||
node->btree[0].hashval =
|
btree = xfs_da3_node_tree_p(node);
|
||||||
leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval;
|
btree[0].hashval = leaf->entries[be16_to_cpu(leaf->hdr.count)-1 ].hashval;
|
||||||
node->btree[0].before = cpu_to_be32(blkno);
|
btree[0].before = cpu_to_be32(blkno);
|
||||||
node->hdr.count = cpu_to_be16(1);
|
node->hdr.count = cpu_to_be16(1);
|
||||||
xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1);
|
xfs_trans_log_buf(args->trans, bp1, 0, XFS_LBSIZE(dp->i_mount) - 1);
|
||||||
error = 0;
|
error = 0;
|
||||||
@ -1032,7 +1033,7 @@ xfs_attr_leaf_split(xfs_da_state_t *state, xfs_da_state_blk_t *oldblk,
|
|||||||
* NOTE: rebalance() currently depends on the 2nd block being empty.
|
* NOTE: rebalance() currently depends on the 2nd block being empty.
|
||||||
*/
|
*/
|
||||||
xfs_attr_leaf_rebalance(state, oldblk, newblk);
|
xfs_attr_leaf_rebalance(state, oldblk, newblk);
|
||||||
error = xfs_da_blk_link(state, oldblk, newblk);
|
error = xfs_da3_blk_link(state, oldblk, newblk);
|
||||||
if (error)
|
if (error)
|
||||||
return(error);
|
return(error);
|
||||||
|
|
||||||
@ -1660,7 +1661,7 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action)
|
|||||||
*/
|
*/
|
||||||
forward = (info->forw != 0);
|
forward = (info->forw != 0);
|
||||||
memcpy(&state->altpath, &state->path, sizeof(state->path));
|
memcpy(&state->altpath, &state->path, sizeof(state->path));
|
||||||
error = xfs_da_path_shift(state, &state->altpath, forward,
|
error = xfs_da3_path_shift(state, &state->altpath, forward,
|
||||||
0, &retval);
|
0, &retval);
|
||||||
if (error)
|
if (error)
|
||||||
return(error);
|
return(error);
|
||||||
@ -1717,10 +1718,10 @@ xfs_attr_leaf_toosmall(xfs_da_state_t *state, int *action)
|
|||||||
*/
|
*/
|
||||||
memcpy(&state->altpath, &state->path, sizeof(state->path));
|
memcpy(&state->altpath, &state->path, sizeof(state->path));
|
||||||
if (blkno < blk->blkno) {
|
if (blkno < blk->blkno) {
|
||||||
error = xfs_da_path_shift(state, &state->altpath, forward,
|
error = xfs_da3_path_shift(state, &state->altpath, forward,
|
||||||
0, &retval);
|
0, &retval);
|
||||||
} else {
|
} else {
|
||||||
error = xfs_da_path_shift(state, &state->path, forward,
|
error = xfs_da3_path_shift(state, &state->path, forward,
|
||||||
0, &retval);
|
0, &retval);
|
||||||
}
|
}
|
||||||
if (error)
|
if (error)
|
||||||
@ -2783,7 +2784,7 @@ xfs_attr_root_inactive(xfs_trans_t **trans, xfs_inode_t *dp)
|
|||||||
* the extents in reverse order the extent containing
|
* the extents in reverse order the extent containing
|
||||||
* block 0 must still be there.
|
* block 0 must still be there.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK);
|
error = xfs_da3_node_read(*trans, dp, 0, -1, &bp, XFS_ATTR_FORK);
|
||||||
if (error)
|
if (error)
|
||||||
return(error);
|
return(error);
|
||||||
blkno = XFS_BUF_ADDR(bp);
|
blkno = XFS_BUF_ADDR(bp);
|
||||||
@ -2836,6 +2837,7 @@ xfs_attr_node_inactive(
|
|||||||
xfs_daddr_t parent_blkno, child_blkno;
|
xfs_daddr_t parent_blkno, child_blkno;
|
||||||
int error, count, i;
|
int error, count, i;
|
||||||
struct xfs_buf *child_bp;
|
struct xfs_buf *child_bp;
|
||||||
|
struct xfs_da_node_entry *btree;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since this code is recursive (gasp!) we must protect ourselves.
|
* Since this code is recursive (gasp!) we must protect ourselves.
|
||||||
@ -2853,7 +2855,8 @@ xfs_attr_node_inactive(
|
|||||||
xfs_trans_brelse(*trans, bp);
|
xfs_trans_brelse(*trans, bp);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
child_fsb = be32_to_cpu(node->btree[0].before);
|
btree = xfs_da3_node_tree_p(node);
|
||||||
|
child_fsb = be32_to_cpu(btree[0].before);
|
||||||
xfs_trans_brelse(*trans, bp); /* no locks for later trans */
|
xfs_trans_brelse(*trans, bp); /* no locks for later trans */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -2868,7 +2871,7 @@ xfs_attr_node_inactive(
|
|||||||
* traversal of the tree so we may deal with many blocks
|
* traversal of the tree so we may deal with many blocks
|
||||||
* before we come back to this one.
|
* before we come back to this one.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_read(*trans, dp, child_fsb, -2, &child_bp,
|
error = xfs_da3_node_read(*trans, dp, child_fsb, -2, &child_bp,
|
||||||
XFS_ATTR_FORK);
|
XFS_ATTR_FORK);
|
||||||
if (error)
|
if (error)
|
||||||
return(error);
|
return(error);
|
||||||
@ -2909,11 +2912,11 @@ xfs_attr_node_inactive(
|
|||||||
* child block number.
|
* child block number.
|
||||||
*/
|
*/
|
||||||
if ((i+1) < count) {
|
if ((i+1) < count) {
|
||||||
error = xfs_da_node_read(*trans, dp, 0, parent_blkno,
|
error = xfs_da3_node_read(*trans, dp, 0, parent_blkno,
|
||||||
&bp, XFS_ATTR_FORK);
|
&bp, XFS_ATTR_FORK);
|
||||||
if (error)
|
if (error)
|
||||||
return(error);
|
return(error);
|
||||||
child_fsb = be32_to_cpu(node->btree[i+1].before);
|
child_fsb = be32_to_cpu(btree[i+1].before);
|
||||||
xfs_trans_brelse(*trans, bp);
|
xfs_trans_brelse(*trans, bp);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include "xfs_sb.h"
|
#include "xfs_sb.h"
|
||||||
#include "xfs_ag.h"
|
#include "xfs_ag.h"
|
||||||
#include "xfs_dir2.h"
|
#include "xfs_dir2.h"
|
||||||
|
#include "xfs_mount.h"
|
||||||
#include "xfs_da_btree.h"
|
#include "xfs_da_btree.h"
|
||||||
#include "xfs_bmap_btree.h"
|
#include "xfs_bmap_btree.h"
|
||||||
#include "xfs_alloc_btree.h"
|
#include "xfs_alloc_btree.h"
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000,2002,2005 Silicon Graphics, Inc.
|
* Copyright (c) 2000,2002,2005 Silicon Graphics, Inc.
|
||||||
|
* Copyright (c) 2013 Red Hat, Inc.
|
||||||
* All Rights Reserved.
|
* All Rights Reserved.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
@ -20,7 +21,6 @@
|
|||||||
|
|
||||||
struct xfs_bmap_free;
|
struct xfs_bmap_free;
|
||||||
struct xfs_inode;
|
struct xfs_inode;
|
||||||
struct xfs_mount;
|
|
||||||
struct xfs_trans;
|
struct xfs_trans;
|
||||||
struct zone;
|
struct zone;
|
||||||
|
|
||||||
@ -50,8 +50,11 @@ typedef struct xfs_da_blkinfo {
|
|||||||
* CRC enabled directory structure types
|
* CRC enabled directory structure types
|
||||||
*
|
*
|
||||||
* The headers change size for the additional verification information, but
|
* The headers change size for the additional verification information, but
|
||||||
* otherwise the tree layouts and contents are unchanged.
|
* otherwise the tree layouts and contents are unchanged. Hence the da btree
|
||||||
|
* code can use the struct xfs_da_blkinfo for manipulating the tree links and
|
||||||
|
* magic numbers without modification for both v2 and v3 nodes.
|
||||||
*/
|
*/
|
||||||
|
#define XFS_DA3_NODE_MAGIC 0x3ebe /* magic number: non-leaf blocks */
|
||||||
#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */
|
#define XFS_DIR3_LEAF1_MAGIC 0x3df1 /* magic number: v2 dirlf single blks */
|
||||||
#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */
|
#define XFS_DIR3_LEAFN_MAGIC 0x3dff /* magic number: v2 dirlf multi blks */
|
||||||
|
|
||||||
@ -80,19 +83,76 @@ struct xfs_da3_blkinfo {
|
|||||||
*/
|
*/
|
||||||
#define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */
|
#define XFS_DA_NODE_MAXDEPTH 5 /* max depth of Btree */
|
||||||
|
|
||||||
|
typedef struct xfs_da_node_hdr {
|
||||||
|
struct xfs_da_blkinfo info; /* block type, links, etc. */
|
||||||
|
__be16 count; /* count of active entries */
|
||||||
|
__be16 __level; /* level above leaves (leaf == 0) */
|
||||||
|
} xfs_da_node_hdr_t;
|
||||||
|
|
||||||
|
struct xfs_da3_node_hdr {
|
||||||
|
struct xfs_da3_blkinfo info; /* block type, links, etc. */
|
||||||
|
__be16 count; /* count of active entries */
|
||||||
|
__be16 __level; /* level above leaves (leaf == 0) */
|
||||||
|
__be32 __pad32;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define XFS_DA3_NODE_CRC_OFF (offsetof(struct xfs_da3_node_hdr, info.crc))
|
||||||
|
|
||||||
|
typedef struct xfs_da_node_entry {
|
||||||
|
__be32 hashval; /* hash value for this descendant */
|
||||||
|
__be32 before; /* Btree block before this key */
|
||||||
|
} xfs_da_node_entry_t;
|
||||||
|
|
||||||
typedef struct xfs_da_intnode {
|
typedef struct xfs_da_intnode {
|
||||||
struct xfs_da_node_hdr { /* constant-structure header block */
|
struct xfs_da_node_hdr hdr;
|
||||||
xfs_da_blkinfo_t info; /* block type, links, etc. */
|
struct xfs_da_node_entry __btree[];
|
||||||
__be16 count; /* count of active entries */
|
|
||||||
__be16 level; /* level above leaves (leaf == 0) */
|
|
||||||
} hdr;
|
|
||||||
struct xfs_da_node_entry {
|
|
||||||
__be32 hashval; /* hash value for this descendant */
|
|
||||||
__be32 before; /* Btree block before this key */
|
|
||||||
} btree[1]; /* variable sized array of keys */
|
|
||||||
} xfs_da_intnode_t;
|
} xfs_da_intnode_t;
|
||||||
typedef struct xfs_da_node_hdr xfs_da_node_hdr_t;
|
|
||||||
typedef struct xfs_da_node_entry xfs_da_node_entry_t;
|
struct xfs_da3_intnode {
|
||||||
|
struct xfs_da3_node_hdr hdr;
|
||||||
|
struct xfs_da_node_entry __btree[];
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In-core version of the node header to abstract the differences in the v2 and
|
||||||
|
* v3 disk format of the headers. Callers need to convert to/from disk format as
|
||||||
|
* appropriate.
|
||||||
|
*/
|
||||||
|
struct xfs_da3_icnode_hdr {
|
||||||
|
__uint32_t forw;
|
||||||
|
__uint32_t back;
|
||||||
|
__uint16_t magic;
|
||||||
|
__uint16_t count;
|
||||||
|
__uint16_t level;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern void xfs_da3_node_hdr_from_disk(struct xfs_da3_icnode_hdr *to,
|
||||||
|
struct xfs_da_intnode *from);
|
||||||
|
extern void xfs_da3_node_hdr_to_disk(struct xfs_da_intnode *to,
|
||||||
|
struct xfs_da3_icnode_hdr *from);
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
xfs_da3_node_hdr_size(struct xfs_da_intnode *dap)
|
||||||
|
{
|
||||||
|
if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC))
|
||||||
|
return sizeof(struct xfs_da3_node_hdr);
|
||||||
|
return sizeof(struct xfs_da_node_hdr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline struct xfs_da_node_entry *
|
||||||
|
xfs_da3_node_tree_p(struct xfs_da_intnode *dap)
|
||||||
|
{
|
||||||
|
if (dap->hdr.info.magic == cpu_to_be16(XFS_DA3_NODE_MAGIC)) {
|
||||||
|
struct xfs_da3_intnode *dap3 = (struct xfs_da3_intnode *)dap;
|
||||||
|
return dap3->__btree;
|
||||||
|
}
|
||||||
|
return dap->__btree;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern void xfs_da3_intnode_from_disk(struct xfs_da3_icnode_hdr *to,
|
||||||
|
struct xfs_da_intnode *from);
|
||||||
|
extern void xfs_da3_intnode_to_disk(struct xfs_da_intnode *to,
|
||||||
|
struct xfs_da3_icnode_hdr *from);
|
||||||
|
|
||||||
#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize
|
#define XFS_LBSIZE(mp) (mp)->m_sb.sb_blocksize
|
||||||
|
|
||||||
@ -214,29 +274,29 @@ struct xfs_nameops {
|
|||||||
/*
|
/*
|
||||||
* Routines used for growing the Btree.
|
* Routines used for growing the Btree.
|
||||||
*/
|
*/
|
||||||
int xfs_da_node_create(xfs_da_args_t *args, xfs_dablk_t blkno, int level,
|
int xfs_da3_node_create(struct xfs_da_args *args, xfs_dablk_t blkno,
|
||||||
struct xfs_buf **bpp, int whichfork);
|
int level, struct xfs_buf **bpp, int whichfork);
|
||||||
int xfs_da_split(xfs_da_state_t *state);
|
int xfs_da3_split(xfs_da_state_t *state);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routines used for shrinking the Btree.
|
* Routines used for shrinking the Btree.
|
||||||
*/
|
*/
|
||||||
int xfs_da_join(xfs_da_state_t *state);
|
int xfs_da3_join(xfs_da_state_t *state);
|
||||||
void xfs_da_fixhashpath(xfs_da_state_t *state,
|
void xfs_da3_fixhashpath(struct xfs_da_state *state,
|
||||||
xfs_da_state_path_t *path_to_to_fix);
|
struct xfs_da_state_path *path_to_to_fix);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Routines used for finding things in the Btree.
|
* Routines used for finding things in the Btree.
|
||||||
*/
|
*/
|
||||||
int xfs_da_node_lookup_int(xfs_da_state_t *state, int *result);
|
int xfs_da3_node_lookup_int(xfs_da_state_t *state, int *result);
|
||||||
int xfs_da_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path,
|
int xfs_da3_path_shift(xfs_da_state_t *state, xfs_da_state_path_t *path,
|
||||||
int forward, int release, int *result);
|
int forward, int release, int *result);
|
||||||
/*
|
/*
|
||||||
* Utility routines.
|
* Utility routines.
|
||||||
*/
|
*/
|
||||||
int xfs_da_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk,
|
int xfs_da3_blk_link(xfs_da_state_t *state, xfs_da_state_blk_t *old_blk,
|
||||||
xfs_da_state_blk_t *new_blk);
|
xfs_da_state_blk_t *new_blk);
|
||||||
int xfs_da_node_read(struct xfs_trans *tp, struct xfs_inode *dp,
|
int xfs_da3_node_read(struct xfs_trans *tp, struct xfs_inode *dp,
|
||||||
xfs_dablk_t bno, xfs_daddr_t mappedbno,
|
xfs_dablk_t bno, xfs_daddr_t mappedbno,
|
||||||
struct xfs_buf **bpp, int which_fork);
|
struct xfs_buf **bpp, int which_fork);
|
||||||
|
|
||||||
|
@ -1371,7 +1371,7 @@ xfs_dir2_leafn_split(
|
|||||||
* block into the leaves.
|
* block into the leaves.
|
||||||
*/
|
*/
|
||||||
xfs_dir2_leafn_rebalance(state, oldblk, newblk);
|
xfs_dir2_leafn_rebalance(state, oldblk, newblk);
|
||||||
error = xfs_da_blk_link(state, oldblk, newblk);
|
error = xfs_da3_blk_link(state, oldblk, newblk);
|
||||||
if (error) {
|
if (error) {
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
@ -1452,7 +1452,7 @@ xfs_dir2_leafn_toosmall(
|
|||||||
*/
|
*/
|
||||||
forward = (leafhdr.forw != 0);
|
forward = (leafhdr.forw != 0);
|
||||||
memcpy(&state->altpath, &state->path, sizeof(state->path));
|
memcpy(&state->altpath, &state->path, sizeof(state->path));
|
||||||
error = xfs_da_path_shift(state, &state->altpath, forward, 0,
|
error = xfs_da3_path_shift(state, &state->altpath, forward, 0,
|
||||||
&rval);
|
&rval);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
@ -1514,10 +1514,10 @@ xfs_dir2_leafn_toosmall(
|
|||||||
*/
|
*/
|
||||||
memcpy(&state->altpath, &state->path, sizeof(state->path));
|
memcpy(&state->altpath, &state->path, sizeof(state->path));
|
||||||
if (blkno < blk->blkno)
|
if (blkno < blk->blkno)
|
||||||
error = xfs_da_path_shift(state, &state->altpath, forward, 0,
|
error = xfs_da3_path_shift(state, &state->altpath, forward, 0,
|
||||||
&rval);
|
&rval);
|
||||||
else
|
else
|
||||||
error = xfs_da_path_shift(state, &state->path, forward, 0,
|
error = xfs_da3_path_shift(state, &state->path, forward, 0,
|
||||||
&rval);
|
&rval);
|
||||||
if (error) {
|
if (error) {
|
||||||
return error;
|
return error;
|
||||||
@ -1614,7 +1614,7 @@ xfs_dir2_node_addname(
|
|||||||
* Look up the name. We're not supposed to find it, but
|
* Look up the name. We're not supposed to find it, but
|
||||||
* this gives us the insertion point.
|
* this gives us the insertion point.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_lookup_int(state, &rval);
|
error = xfs_da3_node_lookup_int(state, &rval);
|
||||||
if (error)
|
if (error)
|
||||||
rval = error;
|
rval = error;
|
||||||
if (rval != ENOENT) {
|
if (rval != ENOENT) {
|
||||||
@ -1640,7 +1640,7 @@ xfs_dir2_node_addname(
|
|||||||
* It worked, fix the hash values up the btree.
|
* It worked, fix the hash values up the btree.
|
||||||
*/
|
*/
|
||||||
if (!(args->op_flags & XFS_DA_OP_JUSTCHECK))
|
if (!(args->op_flags & XFS_DA_OP_JUSTCHECK))
|
||||||
xfs_da_fixhashpath(state, &state->path);
|
xfs_da3_fixhashpath(state, &state->path);
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* It didn't work, we need to split the leaf block.
|
* It didn't work, we need to split the leaf block.
|
||||||
@ -1652,7 +1652,7 @@ xfs_dir2_node_addname(
|
|||||||
/*
|
/*
|
||||||
* Split the leaf block and insert the new entry.
|
* Split the leaf block and insert the new entry.
|
||||||
*/
|
*/
|
||||||
rval = xfs_da_split(state);
|
rval = xfs_da3_split(state);
|
||||||
}
|
}
|
||||||
done:
|
done:
|
||||||
xfs_da_state_free(state);
|
xfs_da_state_free(state);
|
||||||
@ -2030,7 +2030,7 @@ xfs_dir2_node_addname_int(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Lookup an entry in a node-format directory.
|
* Lookup an entry in a node-format directory.
|
||||||
* All the real work happens in xfs_da_node_lookup_int.
|
* All the real work happens in xfs_da3_node_lookup_int.
|
||||||
* The only real output is the inode number of the entry.
|
* The only real output is the inode number of the entry.
|
||||||
*/
|
*/
|
||||||
int /* error */
|
int /* error */
|
||||||
@ -2055,7 +2055,7 @@ xfs_dir2_node_lookup(
|
|||||||
/*
|
/*
|
||||||
* Fill in the path to the entry in the cursor.
|
* Fill in the path to the entry in the cursor.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_lookup_int(state, &rval);
|
error = xfs_da3_node_lookup_int(state, &rval);
|
||||||
if (error)
|
if (error)
|
||||||
rval = error;
|
rval = error;
|
||||||
else if (rval == ENOENT && args->cmpresult == XFS_CMP_CASE) {
|
else if (rval == ENOENT && args->cmpresult == XFS_CMP_CASE) {
|
||||||
@ -2110,7 +2110,7 @@ xfs_dir2_node_removename(
|
|||||||
/*
|
/*
|
||||||
* Look up the entry we're deleting, set up the cursor.
|
* Look up the entry we're deleting, set up the cursor.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_lookup_int(state, &rval);
|
error = xfs_da3_node_lookup_int(state, &rval);
|
||||||
if (error)
|
if (error)
|
||||||
rval = error;
|
rval = error;
|
||||||
/*
|
/*
|
||||||
@ -2134,12 +2134,12 @@ xfs_dir2_node_removename(
|
|||||||
/*
|
/*
|
||||||
* Fix the hash values up the btree.
|
* Fix the hash values up the btree.
|
||||||
*/
|
*/
|
||||||
xfs_da_fixhashpath(state, &state->path);
|
xfs_da3_fixhashpath(state, &state->path);
|
||||||
/*
|
/*
|
||||||
* If we need to join leaf blocks, do it.
|
* If we need to join leaf blocks, do it.
|
||||||
*/
|
*/
|
||||||
if (rval && state->path.active > 1)
|
if (rval && state->path.active > 1)
|
||||||
error = xfs_da_join(state);
|
error = xfs_da3_join(state);
|
||||||
/*
|
/*
|
||||||
* If no errors so far, try conversion to leaf format.
|
* If no errors so far, try conversion to leaf format.
|
||||||
*/
|
*/
|
||||||
@ -2181,7 +2181,7 @@ xfs_dir2_node_replace(
|
|||||||
/*
|
/*
|
||||||
* Lookup the entry to change in the btree.
|
* Lookup the entry to change in the btree.
|
||||||
*/
|
*/
|
||||||
error = xfs_da_node_lookup_int(state, &rval);
|
error = xfs_da3_node_lookup_int(state, &rval);
|
||||||
if (error) {
|
if (error) {
|
||||||
rval = error;
|
rval = error;
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,6 @@
|
|||||||
#include "xfs_trans.h"
|
#include "xfs_trans.h"
|
||||||
#include "xfs_sb.h"
|
#include "xfs_sb.h"
|
||||||
#include "xfs_ag.h"
|
#include "xfs_ag.h"
|
||||||
#include "xfs_da_btree.h"
|
|
||||||
#include "xfs_bmap_btree.h"
|
#include "xfs_bmap_btree.h"
|
||||||
#include "xfs_alloc_btree.h"
|
#include "xfs_alloc_btree.h"
|
||||||
#include "xfs_ialloc_btree.h"
|
#include "xfs_ialloc_btree.h"
|
||||||
@ -30,6 +29,7 @@
|
|||||||
#include "xfs_inode.h"
|
#include "xfs_inode.h"
|
||||||
#include "xfs_btree.h"
|
#include "xfs_btree.h"
|
||||||
#include "xfs_mount.h"
|
#include "xfs_mount.h"
|
||||||
|
#include "xfs_da_btree.h"
|
||||||
#include "xfs_ialloc.h"
|
#include "xfs_ialloc.h"
|
||||||
#include "xfs_itable.h"
|
#include "xfs_itable.h"
|
||||||
#include "xfs_alloc.h"
|
#include "xfs_alloc.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user