On Sat, Apr 25, 2020 at 11:13:07AM -0700, Christoph Hellwig wrote: > > + > > +/* Sorting hat for log items as they're read in. */ > > +enum xlog_recover_reorder { > > + XLOG_REORDER_UNKNOWN, > > + XLOG_REORDER_BUFFER_LIST, > > + XLOG_REORDER_CANCEL_LIST, > > + XLOG_REORDER_INODE_BUFFER_LIST, > > + XLOG_REORDER_INODE_LIST, > > XLOG_REORDER_INODE_LIST seems a bit misnamed as it really is the > "misc" or "no reorder" list. I guess the naming comes from the > local inode_list variable, but maybe we need to fix that as well? Yes, thanks for the series fixing that. > > +typedef enum xlog_recover_reorder (*xlog_recover_reorder_fn)( > > + struct xlog_recover_item *item); > > This typedef doesn't actually seem to help with anything (neither > with just thіs patch nor the final tree). Fair enough. > > + > > +struct xlog_recover_item_type { > > + /* > > + * These two items decide how to sort recovered log items during > > + * recovery. If reorder_fn is non-NULL it will be called; otherwise, > > + * reorder will be used to decide. See the comment above > > + * xlog_recover_reorder_trans for more details about what the values > > + * mean. > > + */ > > + enum xlog_recover_reorder reorder; > > + xlog_recover_reorder_fn reorder_fn; > > I'd just use reorder_fn and skip the simple field. Just one way to do > things even if it adds a tiny amount of boilerplate code. <nod> > > + case XFS_LI_INODE: > > + return &xlog_inode_item_type; > > + case XFS_LI_DQUOT: > > + return &xlog_dquot_item_type; > > + case XFS_LI_QUOTAOFF: > > + return &xlog_quotaoff_item_type; > > + case XFS_LI_IUNLINK: > > + /* Not implemented? */ > > Not implemented! I think we need a prep patch to remove this first. The thing I can't tell is if XFS_LI_IUNLINK is a code point reserved from some long-ago log item that fell out, or reserved for some future project? Either way, this case doesn't need to be there. > > @@ -1851,41 +1890,34 @@ xlog_recover_reorder_trans( > > > > list_splice_init(&trans->r_itemq, &sort_list); > > list_for_each_entry_safe(item, n, &sort_list, ri_list) { > > - xfs_buf_log_format_t *buf_f = item->ri_buf[0].i_addr; > > + enum xlog_recover_reorder fate = XLOG_REORDER_UNKNOWN; > > + > > + item->ri_type = xlog_item_for_type(ITEM_TYPE(item)); > > I wonder if just passing the whole item to xlog_item_for_type would > make more sense. It would then need a different name, of course. xlog_set_item_type(item); yes. > > + if (item->ri_type) { > > + if (item->ri_type->reorder_fn) > > + fate = item->ri_type->reorder_fn(item); > > + else > > + fate = item->ri_type->reorder; > > + } > > I think for the !item->ri_type we should immediately jump to what > currently is the XLOG_REORDER_UNKNOWN case, and thus avoid even > adding XLOG_REORDER_UNKNOWN to the enum. The added benefit is that > any item without a reorder_fn could then be treated as on what > currently is the inode_list, but needs a btter name. Ok. --D