]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commit
libxfs: retain ifork_ops when flushing inode
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 26 Apr 2019 20:41:59 +0000 (15:41 -0500)
committerEric Sandeen <sandeen@redhat.com>
Fri, 26 Apr 2019 20:41:59 +0000 (15:41 -0500)
commite0187d73c100eefa0af961d4aeb8080b135d53fd
tree40be1697269bd406ae87204c6dc738b2dd087208
parent1cdc777df735ca45f9b3aeb35613a06669b5c641
libxfs: retain ifork_ops when flushing inode

Retain the ifork ops used to validate the inode so that we can use the
same one to iflush it.  xfs_repair phase 6 can use multiple transactions
to fix various inode problems, which means that the inode might not be
fully fixed when each transaction commits.

This can be a particular problem if there's a shortform directory with
both invalid directory entries and incorrect i8count.  Phase 3 will set
the parent inode to "0" to signal to phase 6 that it needs to reset the
parent and i8count, but phase 6 starts a transaction to junk the bad
entries which fail to commit because the parent is invalid:

fixing i8count in inode 69022994673
Invalid inode number 0x0
xfs_dir_ino_validate: XFS_ERROR_REPORT
Metadata corruption detected at 0x464eb0, inode 0x10121750f1 data fork
xfs_repair: warning - iflush_int failed (-117)

And thus the inode fixes never get written out.

Reported-by: Arkadiusz Miskiewicz <arekm@maven.pl>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Bill O'Donnell <billodo@redhat.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
include/xfs_inode.h
libxfs/rdwr.c
libxfs/util.c