return xfs_attr3_leaf_setflag(args);
 }
 
+/*
+ * Initial setup for xfs_attr_node_removename.  Make sure the attr is there and
+ * the blocks are valid.  Attr keys with remote blocks will be marked
+ * incomplete.
+ */
+STATIC
+int xfs_attr_node_removename_setup(
+       struct xfs_da_args      *args,
+       struct xfs_da_state     **state)
+{
+       int                     error;
+
+       error = xfs_attr_node_hasname(args, state);
+       if (error != -EEXIST)
+               return error;
+
+       ASSERT((*state)->path.blk[(*state)->path.active - 1].bp != NULL);
+       ASSERT((*state)->path.blk[(*state)->path.active - 1].magic ==
+               XFS_ATTR_LEAF_MAGIC);
+
+       if (args->rmtblkno > 0) {
+               error = xfs_attr_leaf_mark_incomplete(args, *state);
+               if (error)
+                       return error;
+
+               return xfs_attr_rmtval_invalidate(args);
+       }
+
+       return 0;
+}
+
 /*
  * Remove a name from a B-tree attribute list.
  *
 
        trace_xfs_attr_node_removename(args);
 
-       error = xfs_attr_node_hasname(args, &state);
-       if (error != -EEXIST)
+       error = xfs_attr_node_removename_setup(args, &state);
+       if (error)
                goto out;
 
        /*
         * This is done before we remove the attribute so that we don't
         * overflow the maximum size of a transaction and/or hit a deadlock.
         */
-       blk = &state->path.blk[ state->path.active-1 ];
-       ASSERT(blk->bp != NULL);
-       ASSERT(blk->magic == XFS_ATTR_LEAF_MAGIC);
        if (args->rmtblkno > 0) {
-               error = xfs_attr_leaf_mark_incomplete(args, state);
-               if (error)
-                       goto out;
-
-               error = xfs_attr_rmtval_invalidate(args);
-               if (error)
-                       return error;
-
                error = xfs_attr_rmtval_remove(args);
                if (error)
                        goto out;