# Pre11 Batch E: Mount Device Argument Cleanup

## Scope

This batch consolidates caller-owned `device.N` argument cleanup in
`erofs_mount()` and removes two impossible allocation checks. It does not
change mount option semantics, GEOM ownership, device slot validation, mount
error text, or any filesystem behavior.

Modified files:

- `src/super.c`
- `docs/pre11-batch-e.md`

## Changes

After `erofs_parse_device_options()` succeeds, every exit from
`erofs_mount()` now reaches one `out_args` label. Parse failure still returns
directly because no caller-owned argument array has been transferred.

The operation order remains:

1. `erofs_parse_device_options()`
2. `vfs_filteropt()`
3. `vfs_getopt()`
4. `erofs_open_device()`
5. `erofs_update_iosize_max()`
6. `erofs_mountfs()`
7. `erofs_free_device_args()`
8. `vfs_mountedfrom()`
9. `erofs_statfs()`

`out_args` only frees copied device arguments. It does not inspect or release
`primary`. The existing `erofs_mountfs()` ownership transfer and all GEOM
cleanup paths remain unchanged.

The checks for `NULL` immediately following allocation of `packed_inode` and
`metabox_en` were removed. Both allocations retain `M_WAITOK | M_ZERO`, so a
successful return cannot produce `NULL`. No other allocation checks or flags
were changed.

## Ownership Paths

| Path | Copied arguments | Primary device | Result |
| --- | --- | --- | --- |
| Parse failure | No caller ownership | Not opened | Return parser error directly |
| Option filter failure | Freed at `out_args` | Not opened | Return `EINVAL` |
| Invalid or missing `from` | Freed at `out_args` | Not opened | Return `EINVAL` |
| Primary open failure | Freed at `out_args` | Open helper retains its existing cleanup contract | Return open error |
| Mount setup failure | Freed at `out_args` | Ownership already transferred at `erofs_mountfs()` entry | Return mount error |
| Success | Freed at `out_args` | Owned by the mounted filesystem | Publish mounted-from and run `statfs()` |

## Static Verification

- `erofs_free_device_args()` has one caller after the change.
- `erofs_mountfs()` and `erofs_sb_free()` are unchanged.
- The relative order of option filtering, option access, primary open, I/O
  sizing, mount setup, argument cleanup, mounted-from publication, and statfs
  is unchanged.
- Existing errno values and mount error strings are unchanged.
- Duplicate and missing external-device slot behavior is unchanged.
- `git diff --check` passes.
- The diff is restricted to the two declared Batch E files.

## Validation Status

No build, QEMU smoke test, or feature test was run for this batch. Runtime
validation is deferred to the final Pre11 build and targeted smoke test.
