aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_bmap.c
diff options
context:
space:
mode:
authorLachlan McIlroy <lachlan@sgi.com>2008-06-23 13:25:53 +1000
committerNiv Sardi <xaiki@debian.org>2008-07-28 16:59:03 +1000
commitddea2d5246b4ffbe49bbfb700aa3dbe717eb0915 (patch)
tree9b3041590c9a6f2a15ab15682605d796d7ba9d19 /fs/xfs/xfs_bmap.c
parent6bd8fc8a55cba263bab0b1c24786e95c5a2dc720 (diff)
downloadkernel_samsung_aries-ddea2d5246b4ffbe49bbfb700aa3dbe717eb0915.zip
kernel_samsung_aries-ddea2d5246b4ffbe49bbfb700aa3dbe717eb0915.tar.gz
kernel_samsung_aries-ddea2d5246b4ffbe49bbfb700aa3dbe717eb0915.tar.bz2
[XFS] Always reset btree cursor after an insert
After a btree insert operation a cursor can be invalid due to block splits and a maybe a new root block. We reset the cursor in xfs_bmbt_insert() in the cases where we think we need to but it isn't enough as we still see assertions. Just do what we do elsewhere and reset the cursor unconditionally. Also remove the fix to revalidate the original cursor in xfs_bmbt_insert(). SGI-PV: 983336 SGI-Modid: xfs-linux-melb:xfs-kern:31342a Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: David Chinner <dgc@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_bmap.c')
-rw-r--r--fs/xfs/xfs_bmap.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c
index c21e01a..cf4dee0 100644
--- a/fs/xfs/xfs_bmap.c
+++ b/fs/xfs/xfs_bmap.c
@@ -1746,11 +1746,18 @@ xfs_bmap_add_extent_unwritten_real(
if ((error = xfs_bmbt_insert(cur, &i)))
goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done);
- if ((error = xfs_bmbt_increment(cur, 0, &i)))
+ /*
+ * Reset the cursor to the position of the new extent
+ * we are about to insert as we can't trust it after
+ * the previous insert.
+ */
+ if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff,
+ new->br_startblock, new->br_blockcount,
+ &i)))
goto done;
- XFS_WANT_CORRUPTED_GOTO(i == 1, done);
+ XFS_WANT_CORRUPTED_GOTO(i == 0, done);
/* new middle extent - newext */
- cur->bc_rec.b = *new;
+ cur->bc_rec.b.br_state = new->br_state;
if ((error = xfs_bmbt_insert(cur, &i)))
goto done;
XFS_WANT_CORRUPTED_GOTO(i == 1, done);