Just a word of warning: you need to be very, very, very, careful if you decide to enable Integrity Streams.
Short Version
Integrity Streams disables all resiliency, and will cause ReFS to delete files that have a read error.
Long Version
With Integrity Streams enabled, and there is a read error, ReFS will delete the bad file.
- if you have a 300 GB file (e.g. WindowsSever2012R2_prod.vhdx)
- and ReFS detects even a single uncorrectable bit
- it will delete the entire file
No confirmation. No warning. No appeal.
One unrecoverable read error, and all the data is gone. And if you didn't like it: you shouldn't have enabled integrity streams.
This behavior is very quietly documented, using very innocuious terminology:
Key Benefits
Resiliency
- Salvaging data - If a volume becomes corrupted and an alternate copy of the corrupted data doesn't exist,
ReFS removes the corrupt data from the namespace
. ReFS keeps the volume online while it handles most non-correctable corruptions, but there are rare cases that require ReFS to take the volume offline.
(emphasis mine).
Storage Spaces will log to the Windows event log that your data is now gone:
- Source: Microsoft-Windows-ReFS
- Event ID: 513
(Warning): The file system detected a corruption on a file. The file has been removed from the file system namespace
. The name of the file is "M:\VirtualDisks\WindowsServer2012R2_Prod.vhdx".
So, "warning", we deleted a virtual server, and everything on it, because we found one bad bit.
By enabling Integrity streams you are specifically opting-in to this *un-*resilient feature.
It's possible the data isn't actually deleted
The documentation notes:
ReFS removes the corrupt data from the namespace
And that is true; you don't find the file anywhere - it's gone. If you had a 1.2 TB database file, and there was a single unrecoverable bit, your 1.2 TB of data is gone - just like deleting a file.
But the file continues to use up space in the storage space. In other words, it seems the file is actually still kept around, but it is "inaccessible".
But given that there is no documented or known way to make the file "accessible" again (i.e. "undelete" it), the result is the same - your data is deleted.
So just be aware
A fundamental design goal of integrity streams is:
- we would rather delete your data
- than expose a read error
If you enable integrity streams: then you are agreeing that you're in a case where you would rather data be deleted than risk returning partial data.
I can't think of any situation, anywhere, in any industry, in any part of the world, where someone would want their "resilient" filesystem to intentionally delete EVERYTHING in the case of one read error.
But that's what you're asking for.
I guess it somewhat makes sense:
- "i valid integrity"
- "over resiliency"
How to simulate it
Run HxD as an Administrator, open the \.\PhysicalDiskx for writing:
flip one bit, and save.

I'm not going to actually do it for this demo, because on my 3-way mirror i have integrity streams enabled; and i don't want to lose all my data.
Update: Maybe you can opt-out of losing all your data
I was running commands to make sure i had fully disabled any accidental use anywhere of Integrity Streams, and the output of the Get-FileIntegrity
had something odd:
PS M:\> Get-Item . | Get-FileIntegrity
FileName Enabled Enforced
-------- ------- --------
M:\ False True
What the hell could "Enforced" possibly mean? How could Integrity Streams be "enforced on", but not enabled? As usual, the documentation of Get-FileIntegrity
contains no documentation.
So i tried checking the documentation of Set-FileIntegrity
; and it has something!
-Enforce
Indicates whether to enable blocking access to a file if integrity streams indicate data corruption.
If you specify a value of $True for this parameter, the cmdlet also enables integrity for the file.
That's it!
- That's the broken by default feature,
- that will cause you complete data loss
- in the event of the tiniest un-correctable read error
Mother forking shirt-balls. Who's the forking bench that came up with that one.
And it's on by default! That feature should absolutely not be enabled by default! The feature shouldn't even exist!
So now i'm running a command to recursively set the options:
- integrity streams: disabled
- silently delete all your data: disabled
Commands
First is the command to find any files with integrity Enabled:
PS M:\> Get-ChildItem -Recurse | Get-FileIntegrity | Where {$_.Enabled -EQ $true}
FileName Enabled Enforced
-------- ------- --------
M:\Folder1\Folder 2\The Video File 102.mkv True True
M:\Folder1\Folder 2\The Video File 101.mkv True True
M:\Folder1\Folder 2\The Video File 103.mkv True True
M:\Folder1\Folder 2\The Video File 104.mkv True True
M:\Folder1\Folder 2\The Video File 108.mkv True True
M:\Folder1\Folder 2\The Video File 109.mkv True True
M:\Folder1\Folder 2\The Video File 105.mkv True True
M:\Folder1\Folder 2\The Video File 111.mkv True True
M:\Folder1\Folder 2\The Video File 106.mkv True True
M:\Folder1\Folder 2\The Video File 107.mkv True True
M:\Folder1\Folder 2\The Video File 112.mkv True True
M:\Folder1\Folder 2\The Video File 110.mkv True True
So, yes, i had some data at risk. Now we want to turn it off:
PS M:\> Get-ChildItem -Recurse | Get-FileIntegrity | Where {$_.Enabled -EQ $true} | Set-FileIntegrity -Enable $False
Bonus Reading