Commit 91cca5df authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Lachlan McIlroy

[XFS] implement generic xfs_btree_delete/delrec

Make the btree delete code generic. Based on a patch from David Chinner
with lots of changes to follow the original btree implementations more
closely. While this loses some of the generic helper routines for
inserting/moving/removing records it also solves some of the one off bugs
in the original code and makes it easier to verify.

SGI-PV: 985583

SGI-Modid: xfs-linux-melb:xfs-kern:32205a
Signed-off-by: default avatarChristoph Hellwig <hch@infradead.org>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
Signed-off-by: default avatarBill O'Donnell <billodo@sgi.com>
Signed-off-by: default avatarDavid Chinner <david@fromorbit.com>
parent d4b3a4b7
...@@ -398,7 +398,7 @@ xfs_alloc_fixup_trees( ...@@ -398,7 +398,7 @@ xfs_alloc_fixup_trees(
/* /*
* Delete the entry from the by-size btree. * Delete the entry from the by-size btree.
*/ */
if ((error = xfs_alloc_delete(cnt_cur, &i))) if ((error = xfs_btree_delete(cnt_cur, &i)))
return error; return error;
XFS_WANT_CORRUPTED_RETURN(i == 1); XFS_WANT_CORRUPTED_RETURN(i == 1);
/* /*
...@@ -427,7 +427,7 @@ xfs_alloc_fixup_trees( ...@@ -427,7 +427,7 @@ xfs_alloc_fixup_trees(
/* /*
* No remaining freespace, just delete the by-block tree entry. * No remaining freespace, just delete the by-block tree entry.
*/ */
if ((error = xfs_alloc_delete(bno_cur, &i))) if ((error = xfs_btree_delete(bno_cur, &i)))
return error; return error;
XFS_WANT_CORRUPTED_RETURN(i == 1); XFS_WANT_CORRUPTED_RETURN(i == 1);
} else { } else {
...@@ -1651,7 +1651,7 @@ xfs_free_ag_extent( ...@@ -1651,7 +1651,7 @@ xfs_free_ag_extent(
if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i))) if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i)))
goto error0; goto error0;
XFS_WANT_CORRUPTED_GOTO(i == 1, error0); XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
if ((error = xfs_alloc_delete(cnt_cur, &i))) if ((error = xfs_btree_delete(cnt_cur, &i)))
goto error0; goto error0;
XFS_WANT_CORRUPTED_GOTO(i == 1, error0); XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
/* /*
...@@ -1660,13 +1660,13 @@ xfs_free_ag_extent( ...@@ -1660,13 +1660,13 @@ xfs_free_ag_extent(
if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i))) if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i)))
goto error0; goto error0;
XFS_WANT_CORRUPTED_GOTO(i == 1, error0); XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
if ((error = xfs_alloc_delete(cnt_cur, &i))) if ((error = xfs_btree_delete(cnt_cur, &i)))
goto error0; goto error0;
XFS_WANT_CORRUPTED_GOTO(i == 1, error0); XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
/* /*
* Delete the old by-block entry for the right block. * Delete the old by-block entry for the right block.
*/ */
if ((error = xfs_alloc_delete(bno_cur, &i))) if ((error = xfs_btree_delete(bno_cur, &i)))
goto error0; goto error0;
XFS_WANT_CORRUPTED_GOTO(i == 1, error0); XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
/* /*
...@@ -1711,7 +1711,7 @@ xfs_free_ag_extent( ...@@ -1711,7 +1711,7 @@ xfs_free_ag_extent(
if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i))) if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i)))
goto error0; goto error0;
XFS_WANT_CORRUPTED_GOTO(i == 1, error0); XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
if ((error = xfs_alloc_delete(cnt_cur, &i))) if ((error = xfs_btree_delete(cnt_cur, &i)))
goto error0; goto error0;
XFS_WANT_CORRUPTED_GOTO(i == 1, error0); XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
/* /*
...@@ -1737,7 +1737,7 @@ xfs_free_ag_extent( ...@@ -1737,7 +1737,7 @@ xfs_free_ag_extent(
if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i))) if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i)))
goto error0; goto error0;
XFS_WANT_CORRUPTED_GOTO(i == 1, error0); XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
if ((error = xfs_alloc_delete(cnt_cur, &i))) if ((error = xfs_btree_delete(cnt_cur, &i)))
goto error0; goto error0;
XFS_WANT_CORRUPTED_GOTO(i == 1, error0); XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
/* /*
......
This diff is collapsed.
...@@ -94,13 +94,6 @@ typedef struct xfs_btree_sblock xfs_alloc_block_t; ...@@ -94,13 +94,6 @@ typedef struct xfs_btree_sblock xfs_alloc_block_t;
#define XFS_ALLOC_PTR_ADDR(bb,i,cur) \ #define XFS_ALLOC_PTR_ADDR(bb,i,cur) \
XFS_BTREE_PTR_ADDR(xfs_alloc, bb, i, XFS_ALLOC_BLOCK_MAXRECS(1, cur)) XFS_BTREE_PTR_ADDR(xfs_alloc, bb, i, XFS_ALLOC_BLOCK_MAXRECS(1, cur))
/*
* Delete the record pointed to by cur.
* The cursor refers to the place where the record was (could be inserted)
* when the operation returns.
*/
extern int xfs_alloc_delete(struct xfs_btree_cur *cur, int *stat);
/* /*
* Get the data from the pointed-to record. * Get the data from the pointed-to record.
*/ */
......
...@@ -864,7 +864,7 @@ xfs_bmap_add_extent_delay_real( ...@@ -864,7 +864,7 @@ xfs_bmap_add_extent_delay_real(
RIGHT.br_blockcount, &i))) RIGHT.br_blockcount, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_bmbt_delete(cur, &i))) if ((error = xfs_btree_delete(cur, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_btree_decrement(cur, 0, &i))) if ((error = xfs_btree_decrement(cur, 0, &i)))
...@@ -1425,13 +1425,13 @@ xfs_bmap_add_extent_unwritten_real( ...@@ -1425,13 +1425,13 @@ xfs_bmap_add_extent_unwritten_real(
RIGHT.br_blockcount, &i))) RIGHT.br_blockcount, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_bmbt_delete(cur, &i))) if ((error = xfs_btree_delete(cur, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_btree_decrement(cur, 0, &i))) if ((error = xfs_btree_decrement(cur, 0, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_bmbt_delete(cur, &i))) if ((error = xfs_btree_delete(cur, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_btree_decrement(cur, 0, &i))) if ((error = xfs_btree_decrement(cur, 0, &i)))
...@@ -1474,7 +1474,7 @@ xfs_bmap_add_extent_unwritten_real( ...@@ -1474,7 +1474,7 @@ xfs_bmap_add_extent_unwritten_real(
&i))) &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_bmbt_delete(cur, &i))) if ((error = xfs_btree_delete(cur, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_btree_decrement(cur, 0, &i))) if ((error = xfs_btree_decrement(cur, 0, &i)))
...@@ -1517,7 +1517,7 @@ xfs_bmap_add_extent_unwritten_real( ...@@ -1517,7 +1517,7 @@ xfs_bmap_add_extent_unwritten_real(
RIGHT.br_blockcount, &i))) RIGHT.br_blockcount, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_bmbt_delete(cur, &i))) if ((error = xfs_btree_delete(cur, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_btree_decrement(cur, 0, &i))) if ((error = xfs_btree_decrement(cur, 0, &i)))
...@@ -2152,7 +2152,7 @@ xfs_bmap_add_extent_hole_real( ...@@ -2152,7 +2152,7 @@ xfs_bmap_add_extent_hole_real(
right.br_blockcount, &i))) right.br_blockcount, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_bmbt_delete(cur, &i))) if ((error = xfs_btree_delete(cur, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
if ((error = xfs_btree_decrement(cur, 0, &i))) if ((error = xfs_btree_decrement(cur, 0, &i)))
...@@ -3216,7 +3216,7 @@ xfs_bmap_del_extent( ...@@ -3216,7 +3216,7 @@ xfs_bmap_del_extent(
flags |= XFS_ILOG_FEXT(whichfork); flags |= XFS_ILOG_FEXT(whichfork);
break; break;
} }
if ((error = xfs_bmbt_delete(cur, &i))) if ((error = xfs_btree_delete(cur, &i)))
goto done; goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done); XFS_WANT_CORRUPTED_GOTO(i == 1, done);
break; break;
......
This diff is collapsed.
...@@ -237,10 +237,7 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t; ...@@ -237,10 +237,7 @@ typedef struct xfs_btree_lblock xfs_bmbt_block_t;
* Prototypes for xfs_bmap.c to call. * Prototypes for xfs_bmap.c to call.
*/ */
extern void xfs_bmdr_to_bmbt(xfs_bmdr_block_t *, int, xfs_bmbt_block_t *, int); extern void xfs_bmdr_to_bmbt(xfs_bmdr_block_t *, int, xfs_bmbt_block_t *, int);
extern int xfs_bmbt_delete(struct xfs_btree_cur *, int *);
extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s); extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s);
extern xfs_bmbt_block_t *xfs_bmbt_get_block(struct xfs_btree_cur *cur,
int, struct xfs_buf **bpp);
extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r); extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r);
extern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_host_t *r); extern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_host_t *r);
extern xfs_fileoff_t xfs_bmbt_get_startoff(xfs_bmbt_rec_host_t *r); extern xfs_fileoff_t xfs_bmbt_get_startoff(xfs_bmbt_rec_host_t *r);
......
This diff is collapsed.
...@@ -192,6 +192,8 @@ struct xfs_btree_ops { ...@@ -192,6 +192,8 @@ struct xfs_btree_ops {
/* update btree root pointer */ /* update btree root pointer */
void (*set_root)(struct xfs_btree_cur *cur, void (*set_root)(struct xfs_btree_cur *cur,
union xfs_btree_ptr *nptr, int level_change); union xfs_btree_ptr *nptr, int level_change);
int (*kill_root)(struct xfs_btree_cur *cur, struct xfs_buf *bp,
int level, union xfs_btree_ptr *newroot);
/* block allocation / freeing */ /* block allocation / freeing */
int (*alloc_block)(struct xfs_btree_cur *cur, int (*alloc_block)(struct xfs_btree_cur *cur,
...@@ -207,6 +209,7 @@ struct xfs_btree_ops { ...@@ -207,6 +209,7 @@ struct xfs_btree_ops {
int ptr, int reason); int ptr, int reason);
/* records in block/level */ /* records in block/level */
int (*get_minrecs)(struct xfs_btree_cur *cur, int level);
int (*get_maxrecs)(struct xfs_btree_cur *cur, int level); int (*get_maxrecs)(struct xfs_btree_cur *cur, int level);
/* records on disk. Matter for the root in inode case. */ /* records on disk. Matter for the root in inode case. */
...@@ -251,6 +254,7 @@ struct xfs_btree_ops { ...@@ -251,6 +254,7 @@ struct xfs_btree_ops {
*/ */
#define LASTREC_UPDATE 0 #define LASTREC_UPDATE 0
#define LASTREC_INSREC 1 #define LASTREC_INSREC 1
#define LASTREC_DELREC 2
/* /*
...@@ -562,6 +566,7 @@ int xfs_btree_new_root(struct xfs_btree_cur *, int *); ...@@ -562,6 +566,7 @@ int xfs_btree_new_root(struct xfs_btree_cur *, int *);
int xfs_btree_new_iroot(struct xfs_btree_cur *, int *, int *); int xfs_btree_new_iroot(struct xfs_btree_cur *, int *, int *);
int xfs_btree_kill_iroot(struct xfs_btree_cur *); int xfs_btree_kill_iroot(struct xfs_btree_cur *);
int xfs_btree_insert(struct xfs_btree_cur *, int *); int xfs_btree_insert(struct xfs_btree_cur *, int *);
int xfs_btree_delete(struct xfs_btree_cur *, int *);
/* /*
* Helpers. * Helpers.
......
...@@ -1168,8 +1168,8 @@ xfs_difree( ...@@ -1168,8 +1168,8 @@ xfs_difree(
xfs_trans_mod_sb(tp, XFS_TRANS_SB_ICOUNT, -ilen); xfs_trans_mod_sb(tp, XFS_TRANS_SB_ICOUNT, -ilen);
xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -(ilen - 1)); xfs_trans_mod_sb(tp, XFS_TRANS_SB_IFREE, -(ilen - 1));
if ((error = xfs_inobt_delete(cur, &i))) { if ((error = xfs_btree_delete(cur, &i))) {
cmn_err(CE_WARN, "xfs_difree: xfs_inobt_delete returned an error %d on %s.\n", cmn_err(CE_WARN, "xfs_difree: xfs_btree_delete returned an error %d on %s.\n",
error, mp->m_fsname); error, mp->m_fsname);
goto error0; goto error0;
} }
......
This diff is collapsed.
...@@ -116,13 +116,6 @@ typedef struct xfs_btree_sblock xfs_inobt_block_t; ...@@ -116,13 +116,6 @@ typedef struct xfs_btree_sblock xfs_inobt_block_t;
(XFS_BTREE_PTR_ADDR(xfs_inobt, bb, \ (XFS_BTREE_PTR_ADDR(xfs_inobt, bb, \
i, XFS_INOBT_BLOCK_MAXRECS(1, cur))) i, XFS_INOBT_BLOCK_MAXRECS(1, cur)))
/*
* Delete the record pointed to by cur.
* The cursor refers to the place where the record was (could be inserted)
* when the operation returns.
*/
extern int xfs_inobt_delete(struct xfs_btree_cur *cur, int *stat);
/* /*
* Get the data from the pointed-to record. * Get the data from the pointed-to record.
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment