## 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
```text
"disk quota exceeded" vs "no space left on device": how to tell apart
```

## Use 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
