Lars Ellenberg c12e9c8964 drbd: fix potential access after free
Occasionally, if we disconnect, we triggered this assert:
  block drbd7: ASSERT FAILED tl_hash[27] == c30b0f04, expected NULL

hlist_del() happens only on master bio completion.

We used to wait for pending IO to complete before freeing tl_hash
on disconnect. We no longer do so, since we learned to "freeze"
IO on disconnect.

If the local disk is too slow, we may reach C_STANDALONE early,
and there are still some requests pending locally when we call
drbd_free_tl_hash().

If we now free the tl_hash, and later the local IO completion completes
the master bio, which then does hlist_del() and clobbers freed memory.

Do hlist_del_init() and hlist_add_fake() before kfree(tl_hash),
so the hlist_del() on master bio completion is harmless.

Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
2012-07-24 14:15:16 +02:00
..
2012-05-26 12:22:27 -07:00
2012-06-20 14:39:36 -07:00
2012-05-24 16:22:53 -04:00
2012-05-26 12:42:29 -07:00
2012-07-16 09:20:33 -07:00
2012-07-04 15:55:19 +08:00
2012-07-13 09:56:26 -07:00
2012-07-11 12:44:25 -07:00
2012-07-10 19:16:25 +10:00
2012-07-13 09:54:26 -07:00
2012-07-11 16:17:14 -07:00
2012-05-26 12:42:29 -07:00
2012-06-15 17:17:15 -07:00
2012-05-26 12:22:27 -07:00