svn commit: r350651 - head/sys/ufs/ffs
Kirk McKusick
mckusick at FreeBSD.org
Tue Aug 6 18:10:35 UTC 2019
Author: mckusick
Date: Tue Aug 6 18:10:34 2019
New Revision: 350651
URL: https://svnweb.freebsd.org/changeset/base/350651
Log:
A race condition existed between the time a UFS/FFS superblock check
hash was computed and the time that the superblock was copied to a
buffer to be written to disk. The result was a failed superblock
check hash the next time that the superblock was read.
The fix is to compute the check hash after the superblock has been
copied to a buffer to be written.
PR: 236504
Reported by: Peter Holm
Tested by: Peter Holm
Sponsored by: Netflix
Modified:
head/sys/ufs/ffs/ffs_vfsops.c
Modified: head/sys/ufs/ffs/ffs_vfsops.c
==============================================================================
--- head/sys/ufs/ffs/ffs_vfsops.c Tue Aug 6 17:15:46 2019 (r350650)
+++ head/sys/ufs/ffs/ffs_vfsops.c Tue Aug 6 18:10:34 2019 (r350651)
@@ -1998,7 +1998,13 @@ ffs_use_bwrite(void *devfd, off_t loc, void *buf, int
if (MOUNTEDSOFTDEP(ump->um_mountp))
softdep_setup_sbupdate(ump, (struct fs *)bp->b_data, bp);
bcopy((caddr_t)fs, bp->b_data, (u_int)fs->fs_sbsize);
- ffs_oldfscompat_write((struct fs *)bp->b_data, ump);
+ fs = (struct fs *)bp->b_data;
+ ffs_oldfscompat_write(fs, ump);
+ /*
+ * Because we may have made changes to the superblock, we need to
+ * recompute its check-hash.
+ */
+ fs->fs_ckhash = ffs_calc_sbhash(fs);
if (devfdp->suspended)
bp->b_flags |= B_VALIDSUSPWRT;
if (devfdp->waitfor != MNT_WAIT)
More information about the svn-src-head
mailing list