xfs
[Top] [All Lists]

[PATCH] Always reset btree cursor after an insert

To: xfs-dev <xfs-dev@xxxxxxx>, xfs-oss <xfs@xxxxxxxxxxx>
Subject: [PATCH] Always reset btree cursor after an insert
From: Lachlan McIlroy <lachlan@xxxxxxx>
Date: Mon, 16 Jun 2008 12:21:33 +1000
Reply-to: lachlan@xxxxxxx
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Thunderbird 2.0.0.14 (X11/20080421)
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.

Lachlan

--- fs/xfs/xfs_bmap.c_1.392     2008-06-03 12:20:14.000000000 +1000
+++ fs/xfs/xfs_bmap.c   2008-06-16 12:11:47.000000000 +1000
@@ -1745,11 +1745,17 @@ xfs_bmap_add_extent_unwritten_real(
                        if ((error = xfs_bmbt_insert(cur, &i)))
                                goto done;
                        ASSERT(i == 1);
-                       if ((error = xfs_bmbt_increment(cur, 0, &i)))
+                       /*
+                        * Reset the cursor, don't trust it after any insert
+                        * operation.
+                        */
+                       if ((error = xfs_bmbt_lookup_eq(cur, new->br_startoff,
+                                       new->br_startblock, new->br_blockcount,
+                                       &i)))
                                goto done;
-                       ASSERT(i == 1);
+                       ASSERT(i == 0);
                        /* 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;
                        ASSERT(i == 1);


<Prev in Thread] Current Thread [Next in Thread>