• Zhang Yi's avatar
    xfs: flush inode gc workqueue before clearing agi bucket · 04a98a03
    Zhang Yi authored
    In the procedure of recover AGI unlinked lists, if something bad
    happenes on one of the unlinked inode in the bucket list, we would call
    xlog_recover_clear_agi_bucket() to clear the whole unlinked bucket list,
    not the unlinked inodes after the bad one. If we have already added some
    inodes to the gc workqueue before the bad inode in the list, we could
    get below error when freeing those inodes, and finaly fail to complete
    the log recover procedure.
    
     XFS (ram0): Internal error xfs_iunlink_remove at line 2456 of file
     fs/xfs/xfs_inode.c.  Caller xfs_ifree+0xb0/0x360 [xfs]
    
    The problem is xlog_recover_clear_agi_bucket() clear the bucket list, so
    the gc worker fail to check the agino in xfs_verify_agino(). Fix this by
    flush workqueue before clearing the bucket.
    
    Fixes: ab23a776 ("xfs: per-cpu deferred inode inactivation queues")
    Signed-off-by: default avatarZhang Yi <yi.zhang@huawei.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    04a98a03
xfs_log_recover.c 97.2 KB