secdiscard: should call fsync to avoid reordering IOs

Don't make stale zero'ing IO in block device after unlink, since filesystem
can reuse the block addresses and issue some IOs. If block layer reordered
two IOs, filesystem will see zero data, which crashes filesystem consistency.

Bug: 136964285
Test: run cts -m CtsDevicePolicyManagerTestCases -t com.android.cts.devicepolicy.CrossProfileAppsHostSideTest
Change-Id: I43c13622d094cecda1c53468adc240002111d605
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
This commit is contained in:
Jaegeuk Kim 2019-08-08 09:07:58 -07:00
parent 7d43cb0ae9
commit 6c5e453f9e

View file

@ -147,6 +147,10 @@ bool secdiscard_path(const std::string& path) {
if (!overwrite_with_zeros(fs_fd.get(), range[0], range[1])) return false;
}
}
// Should wait for overwrites completion. Otherwise after unlink(),
// filesystem can allocate these blocks and IO can be reordered, resulting
// in making zero blocks to filesystem blocks.
fsync(fs_fd.get());
return true;
}