The pool was full. Not "tidy up some old downloads" full, properly full, the kind where ZFS starts grumbling about fragmentation and write performance quietly tanks. I'd built it years ago with six 2TB drives in RAIDZ2, and the only sane way to grow that vdev without rebuilding from scratch is to replace every disk with a larger one, one at a time, and let it resilver between each.
The plan is simple and the execution is mostly waiting. Pull a disk, put in a 4TB, tell FreeNAS to replace, wait for the resilver. Repeat six times. Once the last old disk is gone, ZFS notices the vdev is bigger and (with autoexpand on) the pool grows. The catch is that during each resilver you're running with reduced redundancy, and a resilver on a near-full pool takes hours.
RAIDZ2 is what made this comfortable. With two parity disks I could lose a drive mid-resilver and still not lose data, which is a very different feeling from doing this on a mirror or, heaven forbid, RAIDZ1. I did the replacements by serial number, physically labelled, because the one genuine way to ruin your evening here is to pull the wrong disk.
zpool status tank
scan: resilver in progress since Fri Sep 1 09:14:02 2017
1.21T scanned at 89.4M/s, 1.18T issued
198G resilvered, 32.4% done
Each resilver ran about six to seven hours on the full pool. I kicked one off in the morning, let it run while I did other things, and started the next in the evening. Three days of this, mostly ignoring it, occasionally checking zpool status like a nervous parent.
The thing nobody tells you is how anticlimactic the payoff is. After the sixth resilver finished, the pool just quietly grew from 8TB usable to 16TB usable. No fanfare, no reboot, no celebration. A scrub afterwards to confirm everything was clean, and that was that. Two parity disks, a stack of labels, and patience. The boring approach is the one that keeps your data, which is rather the point.