On Wed, Feb 13, 2019 at 12:50:53PM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@xxxxxxxxxx> > > When XFS creates an O_TMPFILE file, the inode is created with nlink = 1, > put on the unlinked list, and then the VFS sets nlink = 0 in d_tmpfile. > If we crash before anything logs the inode (it's dirty incore but the > vfs doesn't tell us it's dirty so we never log that change), the iunlink > processing part of recovery will then explode with a pile of: > > XFS: Assertion failed: VFS_I(ip)->i_nlink == 0, file: > fs/xfs/xfs_log_recover.c, line: 5072 > > Worse yet, since nlink is nonzero, the inodes also don't get cleaned up > and they just leak until the next xfs_repair run. > > Therefore, change xfs_iunlink to require that inodes being put on the > unlinked list have nlink == 0, change the tmpfile callers to instantiate > nodes that way, and set the nlink to 1 just prior to calling d_tmpfile. > Fix the comment for xfs_iunlink while we're at it. Looks good for a quick fix, even if I think we should fix it different in the long term: Reviewed-by: Christoph Hellwig <hch@xxxxxx>