This is right. Our journal is "wandering". We accumulate data in the journal, and then commit, which means we just update the indexing information. Then we pick different eraseblocks for the new journal.
Also, the journal is multi-headed. One head is for data, one head is for stuff like inode met-adata, truncation nodes etc - this nodes are likely to become obsolete soon. One head is for Garbage collector. This way we minimize the amount of Garbage collection.
Potentially, it is possible to dynamically allocate journal heads and separate data ford different inodes. That would optimize things even more, but we did not implement this.