ffs: wait for trims earlier during unmount to avoid panic
All softdep processing is supposed to be completed by softdep_flushfiles() and no more deps are supposed to be created after that, but if a pending trim completes after softdep_flushfiles() and before softdep_unmount() then the blkfree that is performed by ffs_blkfree_trim_task() will create a dep when none should exist, and if softdep_unmount() is called before that dep is freed then the kernel will panic. Prevent this by waiting for trims to complete earlier in the unmount process, in ffs_flushfiles(), so that any deps will be freed and any modified CG buffers will be flushed by the final fsync of the devvp in ffs_flushfiles() as intended. Reviewed by: mckusick, kib Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D34806
This commit is contained in:
parent
aa597d4049
commit
3dc5f8e19d
@ -1423,9 +1423,7 @@ ffs_unmount(mp, mntflags)
|
||||
if (susp)
|
||||
vfs_write_resume(mp, VR_START_WRITE);
|
||||
if (ump->um_trim_tq != NULL) {
|
||||
while (ump->um_trim_inflight != 0)
|
||||
pause("ufsutr", hz);
|
||||
taskqueue_drain_all(ump->um_trim_tq);
|
||||
MPASS(ump->um_trim_inflight == 0);
|
||||
taskqueue_free(ump->um_trim_tq);
|
||||
free (ump->um_trimhash, M_TRIM);
|
||||
}
|
||||
@ -1539,6 +1537,20 @@ ffs_flushfiles(mp, flags, td)
|
||||
if (qerror == 0 && (error = vflush(mp, 0, flags, td)) != 0)
|
||||
return (error);
|
||||
|
||||
/*
|
||||
* If this is a forcible unmount and there were any files that
|
||||
* were unlinked but still open, then vflush() will have
|
||||
* truncated and freed those files, which might have started
|
||||
* some trim work. Wait here for any trims to complete
|
||||
* and process the blkfrees which follow the trims.
|
||||
* This may create more dirty devvp buffers and softdep deps.
|
||||
*/
|
||||
if (ump->um_trim_tq != NULL) {
|
||||
while (ump->um_trim_inflight != 0)
|
||||
pause("ufsutr", hz);
|
||||
taskqueue_drain_all(ump->um_trim_tq);
|
||||
}
|
||||
|
||||
/*
|
||||
* Flush filesystem metadata.
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user