> +static inline void > +xfs_defer_recover_work_item( > + struct xfs_defer_pending *dfp, > + struct list_head *work) > +{ > + list_add_tail(work, &dfp->dfp_work); > + dfp->dfp_count++; > +} The same (arguably trivial) logic is also duplicated in xfs_defer_add. Maybe give the helper a more generic name and use it there as well? > + INIT_LIST_HEAD(&attr->xattri_list); No need to initialize this (and all the other list_heads in the items) as we're only adding them to the work list, but never actualy using them as the head of a list or do list_empty checks on them. > + xfs_defer_recover_work_item(dfp, &bi->bi_list); Does this commit on it's own actually work? We add the items to the work list, but I don't think we ever take it off without the next patch? > - struct xfs_bmap_intent fake = { }; > struct xfs_trans_res resv; > struct xfs_log_item *lip = dfp->dfp_intent; > struct xfs_bui_log_item *buip = BUI_ITEM(lip); > @@ -498,6 +520,7 @@ xfs_bui_item_recover( > struct xfs_mount *mp = lip->li_log->l_mp; > struct xfs_map_extent *map; > struct xfs_bud_log_item *budp; > + struct xfs_bmap_intent *fake; So this patch moves the intent structures off the stack, and the next one then renames it to work. Maybe do the renames here so that we don't have to touch every single use of them twice? Otherwise this looks nice, and I really like the better structure of the recovery code that this is leading towards.