aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block
diff options
context:
space:
mode:
authorLars Ellenberg <lars.ellenberg@linbit.com>2014-05-14 15:35:21 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2014-07-10 12:35:09 -0400
commitc2258ffc56f2b34573c2917937190c1491620334 (patch)
treeb202e9693aa3520a622bae29e85efbf3f70a9312 /drivers/block
parent45d2933c921c51ddd2780a806193ab00e03fe215 (diff)
drbd: poison free'd device, resource and connection structs
Now that we have additional asynchronous kref_get/kref_put via debugfs, make sure we catch access after free. Poison struct drbd_device, drbd_connection and drbd_resource before kfree() with 0xfd, 0xfc, and 0xf2, respectively. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/drbd/drbd_main.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 686c5a59edeb..92547d16b2c7 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -2192,6 +2192,7 @@ void drbd_destroy_device(struct kref *kref)
2192 blk_cleanup_queue(device->rq_queue); 2192 blk_cleanup_queue(device->rq_queue);
2193 kfree(device->rs_plan_s); 2193 kfree(device->rs_plan_s);
2194 kfree(first_peer_device(device)); 2194 kfree(first_peer_device(device));
2195 memset(device, 0xfd, sizeof(*device));
2195 kfree(device); 2196 kfree(device);
2196 2197
2197 for_each_connection(connection, resource) 2198 for_each_connection(connection, resource)
@@ -2285,6 +2286,7 @@ void drbd_destroy_resource(struct kref *kref)
2285 idr_destroy(&resource->devices); 2286 idr_destroy(&resource->devices);
2286 free_cpumask_var(resource->cpu_mask); 2287 free_cpumask_var(resource->cpu_mask);
2287 kfree(resource->name); 2288 kfree(resource->name);
2289 memset(resource, 0xf2, sizeof(*resource));
2288 kfree(resource); 2290 kfree(resource);
2289} 2291}
2290 2292
@@ -2665,6 +2667,7 @@ void drbd_destroy_connection(struct kref *kref)
2665 drbd_free_socket(&connection->data); 2667 drbd_free_socket(&connection->data);
2666 kfree(connection->int_dig_in); 2668 kfree(connection->int_dig_in);
2667 kfree(connection->int_dig_vv); 2669 kfree(connection->int_dig_vv);
2670 memset(connection, 0xfc, sizeof(*connection));
2668 kfree(connection); 2671 kfree(connection);
2669 kref_put(&resource->kref, drbd_destroy_resource); 2672 kref_put(&resource->kref, drbd_destroy_resource);
2670} 2673}