diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-05-04 09:47:01 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 10:55:47 -0500 |
commit | ec0bddbc5574ea5903cec8f30ed57777f14d86a8 (patch) | |
tree | 681645e03c7c526e8ecc990d90d75d6e7a5f77a7 /drivers/block/drbd/drbd_main.c | |
parent | 81fa2e675ccf88035d9308a3c98fe2c2928ace00 (diff) |
drbd: Use RCU for the drbd_tconns list
Preparing removal of drbd_cfg_rwsem
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_main.c')
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 8da0e99ee7e6..771b53ece970 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -2341,7 +2341,7 @@ static void drbd_cleanup(void) | |||
2341 | } | 2341 | } |
2342 | 2342 | ||
2343 | list_for_each_entry_safe(tconn, tmp, &drbd_tconns, all_tconn) { | 2343 | list_for_each_entry_safe(tconn, tmp, &drbd_tconns, all_tconn) { |
2344 | list_del(&tconn->all_tconn); | 2344 | list_del_rcu(&tconn->all_tconn); |
2345 | synchronize_rcu(); | 2345 | synchronize_rcu(); |
2346 | kref_put(&tconn->kref, &conn_destroy); | 2346 | kref_put(&tconn->kref, &conn_destroy); |
2347 | } | 2347 | } |
@@ -2409,7 +2409,7 @@ struct drbd_tconn *conn_get_by_name(const char *name) | |||
2409 | return NULL; | 2409 | return NULL; |
2410 | 2410 | ||
2411 | down_read(&drbd_cfg_rwsem); | 2411 | down_read(&drbd_cfg_rwsem); |
2412 | list_for_each_entry(tconn, &drbd_tconns, all_tconn) { | 2412 | list_for_each_entry_rcu(tconn, &drbd_tconns, all_tconn) { |
2413 | if (!strcmp(tconn->name, name)) { | 2413 | if (!strcmp(tconn->name, name)) { |
2414 | kref_get(&tconn->kref); | 2414 | kref_get(&tconn->kref); |
2415 | goto found; | 2415 | goto found; |
@@ -2459,6 +2459,7 @@ void conn_free_crypto(struct drbd_tconn *tconn) | |||
2459 | tconn->int_dig_vv = NULL; | 2459 | tconn->int_dig_vv = NULL; |
2460 | } | 2460 | } |
2461 | 2461 | ||
2462 | /* caller must be under genl_lock() */ | ||
2462 | struct drbd_tconn *conn_create(const char *name) | 2463 | struct drbd_tconn *conn_create(const char *name) |
2463 | { | 2464 | { |
2464 | struct drbd_tconn *tconn; | 2465 | struct drbd_tconn *tconn; |
@@ -2503,7 +2504,7 @@ struct drbd_tconn *conn_create(const char *name) | |||
2503 | 2504 | ||
2504 | down_write(&drbd_cfg_rwsem); | 2505 | down_write(&drbd_cfg_rwsem); |
2505 | kref_init(&tconn->kref); | 2506 | kref_init(&tconn->kref); |
2506 | list_add_tail(&tconn->all_tconn, &drbd_tconns); | 2507 | list_add_tail_rcu(&tconn->all_tconn, &drbd_tconns); |
2507 | up_write(&drbd_cfg_rwsem); | 2508 | up_write(&drbd_cfg_rwsem); |
2508 | 2509 | ||
2509 | return tconn; | 2510 | return tconn; |