Out of inodes while the disk is half empty
df -h showed half the disk free, but touch /tmp/x failed with No space left on device. The partition was not read-only and there were no quotas.
df -i told the real story: the inode table was 100% used. Space was available; there were simply no index nodes left to allocate.
The usual cause is a pile of small files — sessions, thumbnail caches, a program writing one temporary file per request and never cleaning up. find / -xdev -type f | cut -d/ -f2-3 | sort | uniq -c | sort -rn | head finds the directory with the most files far faster than du.
Then fix the cleanup. A bigger disk only postpones the next outage.