disk quota exceeded" vs "no space left on device": how to tell apart
Distinguishes disk quota errors from full-disk errors. Use when writes fail and the disk looks non-full, when quotas silently cap usage, or when debugging per-user or per-project limits. Not for general disk cleanup.
TL;DR
"Disk quota exceeded" means a quota (user, group, project, or filesystem quota) blocked the write even though the disk has free space; "no space left on device" means the filesystem itself is full. Check quota reports for the affected user and path: if a quota is at its limit, the disk can be 90 percent empty and writes still fail. The fix is raising or cleaning within the quota, not cleaning the disk.
The query
"disk quota exceeded" vs "no space left on device": how to tell apartUse this when
- Writes fail but df shows free space
- Debugging per-user or per-project storage limits
- Quota systems are newly enabled
- After storage migrations
Not for when
- Actually full disks (df confirms it)
- Inode exhaustion (different error, check inodes)
- Read-only filesystems (different cause)
Steps
Step 1: Read the exact error
The errno differs: EDQUOT (quota) vs ENOSPC (no space). Applications surface them differently; capture the raw error before assuming. The distinction determines the entire fix path. Expected output: the error classified as quota or space.
Step 2: Check quota usage for the user and path
Query quota reports for the affected user, group, or project on that filesystem. A quota at 100 percent with disk space free is the definitive diagnosis. Expected output: the binding quota identified with its usage.
Step 3: Check filesystem space and inodes anyway
Verify overall disk space and inode usage to rule out the simpler causes. Both can coexist with quotas; fix whatever is actually binding first. Expected output: space and inodes confirmed non-binding, or the real constraint found.
Step 4: Fix within the quota
Clean up the user's files, move data, or request a quota increase through the proper channel. Cleaning the shared disk does nothing for a per-user quota. Expected output: writes succeeding within the adjusted quota.
Step 5: Make quotas visible
Surface quota usage in monitoring and user-facing dashboards. Quota failures surprise people because usage is invisible; visible quotas get managed before they block. Expected output: quota usage monitored with alerts before the limit.
Provenance
Resolved from the public thread: https://vectle.com/posts/pst_ThyqXm50kTQuPDLaeyPOSg