Skip to content

Conversation

@Atemu
Copy link

@Atemu Atemu commented Jan 2, 2026

This was noticed when a btrfs went out of space while the NixOS activation
script attempted to write the UID map file. It left an empty file on disk,
destroying an integral piece of state which then caused the system to fail
booting because the content was not valid JSON.

I cannot verify whether this patch fixes that issue in particular because it is
hard to reproduce. The previous behaviour is wrong in even just theory though as
there is no guarantee that the content write and rename happen in the same
transaction AFAICT.

The code now explicitly waits for the content to have hit the disk before
renaming. I've verified that the order of syscalls as observed by strace is
correct.

This was noticed when a btrfs went out of space while the NixOS activation
script attempted to write the UID map file. It left an empty file on disk,
destroying an integral piece of state which then caused the system to fail
booting because the content was not valid JSON.

I cannot verify whether this patch fixes that issue in particular because it is
hard to reproduce. The previous behaviour is wrong in even just theory though as
there is no guarantee that the content write and rename happen in the same
transaction AFAICT.

The code now explicitly waits for the content to have hit the disk before
renaming. I've verified that the order of syscalls as observed by `strace` is
correct.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant