The COW block driver is a major enhancement to UML. It allows a block device to exist in two files - a readonly shared backing file and a read-write private COW file.
Modified blocks are stored in the COW file and unmodified blocks are in the backing file. All writes are made to the COW file, and reads are made from either depending on whether the block to be read has been modified or not.
This allows changes to be rolled back by throwing out the COW file containing the changes. A special case of this is avoiding fscks on boot after a UML crash. The inconsistent filesystem data will be in the COW file. The backing file contains a consistent filesystem. So, deleting the COW file and starting with a new one will avoid fscking the filesystem on the next boot.
The ability for UMLs to shared filesystems also increases the capacity of the host to host virtual machines since it reduces the file caching requirements. Instead of fully caching a filesystem for each running UML, it is only necessary to cache one copy of the shared filesystem, plus the modified data for each UML.
Merging a COW and backing file is possible with the ul_noo utility.