checks in l2arc_evict could use some cleaning up
l2arc_evict() is strictly serialized with respect to
l2arc_write_buffers() are called from the same thread, so they can not be concurrent.
zio_wait() on the parent zio of all cache zio-s.
That ensures that
l2arc_write_done() is completed before
Finally, if a cache device is removed, then
l2arc_evict() is called under SCL_ALL in the exclusive mode.
That ensures that it can not be concurrent with the normal L2ARC accesses to the device (including writing and evicting buffers).
Given the above, some checks and actions in
l2arc_evict() do not make sense.
For instance, it must never encounter the write head header let alone remove it from the buffer list.