* the attr fork to leaf format and will restart with the leaf
         * add.
         */
+       trace_xfs_attr_sf_addname_return(XFS_DAS_UNINIT, args->dp);
        dac->flags |= XFS_DAC_DEFER_FINISH;
        return -EAGAIN;
 }
                                 * handling code below
                                 */
                                dac->flags |= XFS_DAC_DEFER_FINISH;
+                               trace_xfs_attr_set_iter_return(
+                                       dac->dela_state, args->dp);
                                return -EAGAIN;
                        } else if (error) {
                                return error;
 
                        dac->dela_state = XFS_DAS_FOUND_NBLK;
                }
+               trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
                return -EAGAIN;
        case XFS_DAS_FOUND_LBLK:
                /*
                        error = xfs_attr_rmtval_set_blk(dac);
                        if (error)
                                return error;
+                       trace_xfs_attr_set_iter_return(dac->dela_state,
+                                                      args->dp);
                        return -EAGAIN;
                }
 
                 * series.
                 */
                dac->dela_state = XFS_DAS_FLIP_LFLAG;
+               trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
                return -EAGAIN;
        case XFS_DAS_FLIP_LFLAG:
                /*
                dac->dela_state = XFS_DAS_RM_LBLK;
                if (args->rmtblkno) {
                        error = __xfs_attr_rmtval_remove(dac);
+                       if (error == -EAGAIN)
+                               trace_xfs_attr_set_iter_return(
+                                       dac->dela_state, args->dp);
                        if (error)
                                return error;
 
                        dac->dela_state = XFS_DAS_RD_LEAF;
+                       trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
                        return -EAGAIN;
                }
 
                                error = xfs_attr_rmtval_set_blk(dac);
                                if (error)
                                        return error;
+                               trace_xfs_attr_set_iter_return(
+                                       dac->dela_state, args->dp);
                                return -EAGAIN;
                        }
 
                 * series
                 */
                dac->dela_state = XFS_DAS_FLIP_NFLAG;
+               trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
                return -EAGAIN;
 
        case XFS_DAS_FLIP_NFLAG:
                dac->dela_state = XFS_DAS_RM_NBLK;
                if (args->rmtblkno) {
                        error = __xfs_attr_rmtval_remove(dac);
+                       if (error == -EAGAIN)
+                               trace_xfs_attr_set_iter_return(
+                                       dac->dela_state, args->dp);
+
                        if (error)
                                return error;
 
                        dac->dela_state = XFS_DAS_CLR_FLAG;
+                       trace_xfs_attr_set_iter_return(dac->dela_state, args->dp);
                        return -EAGAIN;
                }
 
                         * this point.
                         */
                        dac->flags |= XFS_DAC_DEFER_FINISH;
+                       trace_xfs_attr_node_addname_return(
+                                       dac->dela_state, args->dp);
                        return -EAGAIN;
                }
 
                         * blocks are removed.
                         */
                        error = __xfs_attr_rmtval_remove(dac);
-                       if (error == -EAGAIN)
+                       if (error == -EAGAIN) {
+                               trace_xfs_attr_remove_iter_return(
+                                               dac->dela_state, args->dp);
                                return error;
-                       else if (error)
+                       } else if (error) {
                                goto out;
+                       }
 
                        /*
                         * Refill the state structure with buffers (the prior
                                goto out;
                        dac->dela_state = XFS_DAS_RM_NAME;
                        dac->flags |= XFS_DAC_DEFER_FINISH;
+                       trace_xfs_attr_remove_iter_return(dac->dela_state, args->dp);
                        return -EAGAIN;
                }
 
 
                        dac->flags |= XFS_DAC_DEFER_FINISH;
                        dac->dela_state = XFS_DAS_RM_SHRINK;
+                       trace_xfs_attr_remove_iter_return(
+                                       dac->dela_state, args->dp);
                        return -EAGAIN;
                }
 
 
 DEFINE_ICLOG_EVENT(xlog_iclog_wait_on);
 DEFINE_ICLOG_EVENT(xlog_iclog_write);
 
+DECLARE_EVENT_CLASS(xfs_das_state_class,
+       TP_PROTO(int das, struct xfs_inode *ip),
+       TP_ARGS(das, ip),
+       TP_STRUCT__entry(
+               __field(int, das)
+               __field(xfs_ino_t, ino)
+       ),
+       TP_fast_assign(
+               __entry->das = das;
+               __entry->ino = ip->i_ino;
+       ),
+       TP_printk("state change %d ino 0x%llx",
+                 __entry->das, __entry->ino)
+)
+
+#define DEFINE_DAS_STATE_EVENT(name) \
+DEFINE_EVENT(xfs_das_state_class, name, \
+       TP_PROTO(int das, struct xfs_inode *ip), \
+       TP_ARGS(das, ip))
+DEFINE_DAS_STATE_EVENT(xfs_attr_sf_addname_return);
+DEFINE_DAS_STATE_EVENT(xfs_attr_set_iter_return);
+DEFINE_DAS_STATE_EVENT(xfs_attr_node_addname_return);
+DEFINE_DAS_STATE_EVENT(xfs_attr_remove_iter_return);
+DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_remove_return);
 #endif /* _TRACE_XFS_H */
 
 #undef TRACE_INCLUDE_PATH