diff options
Diffstat (limited to 'drivers/block/drbd/drbd_main.c')
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 2be5355dede2..e58239cf7ec1 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -2487,8 +2487,9 @@ void conn_free_crypto(struct drbd_connection *connection) connection->int_dig_vv = NULL; } -int set_resource_options(struct drbd_connection *connection, struct res_opts *res_opts) +int set_resource_options(struct drbd_resource *resource, struct res_opts *res_opts) { + struct drbd_connection *connection; cpumask_var_t new_cpu_mask; int err; @@ -2510,13 +2511,15 @@ int set_resource_options(struct drbd_connection *connection, struct res_opts *re goto fail; } } - connection->res_opts = *res_opts; - if (!cpumask_equal(connection->cpu_mask, new_cpu_mask)) { - cpumask_copy(connection->cpu_mask, new_cpu_mask); - drbd_calc_cpu_mask(connection); - connection->receiver.reset_cpu_mask = 1; - connection->asender.reset_cpu_mask = 1; - connection->worker.reset_cpu_mask = 1; + resource->res_opts = *res_opts; + for_each_connection_rcu(connection, resource) { + if (!cpumask_equal(connection->cpu_mask, new_cpu_mask)) { + cpumask_copy(connection->cpu_mask, new_cpu_mask); + drbd_calc_cpu_mask(connection); + connection->receiver.reset_cpu_mask = 1; + connection->asender.reset_cpu_mask = 1; + connection->worker.reset_cpu_mask = 1; + } } err = 0; @@ -2563,9 +2566,6 @@ struct drbd_connection *conn_create(const char *name, struct res_opts *res_opts) if (!zalloc_cpumask_var(&connection->cpu_mask, GFP_KERNEL)) goto fail; - if (set_resource_options(connection, res_opts)) - goto fail; - connection->current_epoch = kzalloc(sizeof(struct drbd_epoch), GFP_KERNEL); if (!connection->current_epoch) goto fail; @@ -2602,19 +2602,24 @@ struct drbd_connection *conn_create(const char *name, struct res_opts *res_opts) kref_init(&connection->kref); - kref_get(&resource->kref); connection->resource = resource; - list_add_tail_rcu(&connection->connections, &resource->connections); + if (set_resource_options(resource, res_opts)) + goto fail_resource; + + kref_get(&resource->kref); + list_add_tail_rcu(&connection->connections, &resource->connections); return connection; +fail_resource: + list_del(&resource->resources); + drbd_free_resource(resource); fail: kfree(connection->current_epoch); free_cpumask_var(connection->cpu_mask); drbd_free_socket(&connection->meta); drbd_free_socket(&connection->data); kfree(connection); - return NULL; } |