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
This commit is contained in:
parent
7f8c266da5
commit
9454b4fd78
@ -1998,7 +1998,13 @@ ffs_use_bwrite(void *devfd, off_t loc, void *buf, int size)
|
||||
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user