diff options
author | Christoph Hellwig <hch@lst.de> | 2017-11-16 22:11:35 -0600 |
---|---|---|
committer | Eric Sandeen <sandeen@redhat.com> | 2017-11-16 22:11:35 -0600 |
commit | 546f38321d86b92d20e204d65ade99779b3d897b (patch) | |
tree | 5c8aa27cdaf2941f42cbec9099da67c31cab6630 | |
parent | 373c077ae6be36e92ea5924623a112007886653d (diff) | |
download | xfsprogs-dev-546f38321d86b92d20e204d65ade99779b3d897b.tar.gz |
xfs: handle zero entries case in xfs_iext_rebalance_leaf
Source kernel commit: ae82968ee9b404b9fc101f9d75e171c78797a4d1
And also rename fill to nr_entries to match the rest of the code.
Reported-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
-rw-r--r-- | libxfs/xfs_iext_tree.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/libxfs/xfs_iext_tree.c b/libxfs/xfs_iext_tree.c index 31e907bf95..3954341af5 100644 --- a/libxfs/xfs_iext_tree.c +++ b/libxfs/xfs_iext_tree.c @@ -787,13 +787,21 @@ xfs_iext_rebalance_leaf( struct xfs_iext_cursor *cur, struct xfs_iext_leaf *leaf, xfs_fileoff_t offset, - int fill) + int nr_entries) { + /* + * If the neighbouring nodes are completely full we might never be able + * to merge our node, and will only delete it once the number of + * entries hits zero. + */ + if (nr_entries == 0) + goto remove_node; + if (leaf->prev) { int nr_prev = xfs_iext_leaf_nr_entries(ifp, leaf->prev, 0), i; - if (nr_prev + fill <= RECS_PER_LEAF) { - for (i = 0; i < fill; i++) + if (nr_prev + nr_entries <= RECS_PER_LEAF) { + for (i = 0; i < nr_entries; i++) leaf->prev->recs[nr_prev + i] = leaf->recs[i]; if (cur->leaf == leaf) { @@ -807,18 +815,20 @@ xfs_iext_rebalance_leaf( if (leaf->next) { int nr_next = xfs_iext_leaf_nr_entries(ifp, leaf->next, 0), i; - if (fill + nr_next <= RECS_PER_LEAF) { + if (nr_entries + nr_next <= RECS_PER_LEAF) { /* * Merge the next node into this node so that we don't * have to do an additional update of the keys in the * higher levels. */ - for (i = 0; i < nr_next; i++) - leaf->recs[fill + i] = leaf->next->recs[i]; + for (i = 0; i < nr_next; i++) { + leaf->recs[nr_entries + i] = + leaf->next->recs[i]; + } if (cur->leaf == leaf->next) { cur->leaf = leaf; - cur->pos += fill; + cur->pos += nr_entries; } offset = xfs_iext_leaf_key(leaf->next, 0); |