zone access should be refcounted and locked, merge zone{data|contents} ?
Reasoning
Zone and zone contents are separated. This is to allow zone pointer to stay the same while the content changes (reload/transfer). But there is still a problem, that zone may change change as well when it is added/removed it is just not so exposed by the fact that this doesn't occur frequently.
Proposal
Each zone fetch from zonedb should increase it's reference count and the caller should be responsible for disposing of the reference as soon as his work is done. One must also lock RCU during refcount increase as for the zone not to change when reloading.
Another problem is event scheduling. It is not so good for the pending events to work on the old zone. For example when a transfer is pending, at the same time zone reloads and changes, the transfer finishes ON THE OLD ZONE and writes to the journal. This could produce garbage content. It is diminished by checking for zone DISCARDED
state, but there should probably be a short time when zone is locked for reloads or leverage RCU in some clever way?