There are a couple of bugs in the grub-mkconfig and zfs-linux-git packages.
The zfs mkinitcpio documentation is unclear about the meaning of the zfs= kernel parameter.
I took it to mean listing the pools to be mounted. This is wrong, it is the dataset containing
the root. So by quoting zfs=rpool, rather than zfs=rpool/root/arch, this explains why it mounted
the wrong dataset(s).
grub-mkconfig doesn't know about the zfs= parameter, only about root=zfs=. And then it gets it wrong,
missing out the pool name. This is a known bug (
https://github.com/zfsonlinux/grub/issues/22).
There is another issue with the zfs init hook, which attempts to mount all pools (zfs import -aN),
and ignores the cachefile that it has copied into the initcpio. Add -c <cachefilename> is necessary
when there are devices attached with pools that should not be imported (e.g. if they have conflicting
mounts). Such conflicts are likely if copying entire pools between physical devices using zfs send & recv.