No, you're not missing anything :-)
What's missing is that unmounting needs to invalidate inodes, and
invalidate_list() needs to be more aggressive (i.e. at least call
truncate_inode_pages()).
At least this much seems to help with some of the weirdness, but I
thinks there's still a problem lurking ...
Regards,
Bill