From: Andreas Gruenbacher Date: Tue, 21 Jun 2011 14:11:28 +0000 (+0200) Subject: drbd: Move resource options from connection to resource X-Git-Tag: next-20140306~49^2~5^2~36 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=eb6bea673f884c037fd5358b5f17bfca18038708;p=karo-tx-linux.git drbd: Move resource options from connection to resource Signed-off-by: Andreas Gruenbacher Signed-off-by: Philipp Reisner --- diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 1bca8ec5f65b..c88336c64b6b 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -542,6 +542,7 @@ struct drbd_resource { struct idr devices; /* volume number to device mapping */ struct list_head connections; struct list_head resources; + struct res_opts res_opts; }; struct drbd_connection { @@ -560,7 +561,6 @@ struct drbd_connection { struct net_conf *net_conf; /* content protected by rcu */ struct mutex conf_update; /* mutex for ready-copy-update of net_conf and disk_conf */ wait_queue_head_t ping_wait; /* Woken upon reception of a ping, and a state change */ - struct res_opts res_opts; struct sockaddr_storage my_addr; int my_addr_len; @@ -1208,7 +1208,7 @@ extern void drbd_delete_minor(struct drbd_device *mdev); extern struct drbd_resource *drbd_create_resource(const char *name); extern void drbd_free_resource(struct drbd_resource *resource); -extern int set_resource_options(struct drbd_connection *connection, struct res_opts *res_opts); +extern int set_resource_options(struct drbd_resource *resource, struct res_opts *res_opts); extern struct drbd_connection *conn_create(const char *name, struct res_opts *res_opts); extern void drbd_destroy_connection(struct kref *kref); extern struct drbd_connection *conn_get_by_addrs(void *my_addr, int my_addr_len, 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; } diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index cb241d1d4668..49a0f2ae6454 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -2520,7 +2520,6 @@ int drbd_adm_resize(struct sk_buff *skb, struct genl_info *info) int drbd_adm_resource_opts(struct sk_buff *skb, struct genl_info *info) { enum drbd_ret_code retcode; - struct drbd_connection *connection; struct res_opts res_opts; int err; @@ -2529,9 +2528,8 @@ int drbd_adm_resource_opts(struct sk_buff *skb, struct genl_info *info) return retcode; if (retcode != NO_ERROR) goto fail; - connection = adm_ctx.connection; - res_opts = connection->res_opts; + res_opts = adm_ctx.resource->res_opts; if (should_set_defaults(info)) set_res_opts_defaults(&res_opts); @@ -2542,7 +2540,7 @@ int drbd_adm_resource_opts(struct sk_buff *skb, struct genl_info *info) goto fail; } - err = set_resource_options(connection, &res_opts); + err = set_resource_options(adm_ctx.resource, &res_opts); if (err) { retcode = ERR_INVALID_REQUEST; if (err == -ENOMEM) @@ -2802,7 +2800,7 @@ static int nla_put_status_info(struct sk_buff *skb, struct drbd_device *device, if (nla_put_drbd_cfg_context(skb, first_peer_device(device)->connection, device->vnr)) goto nla_put_failure; - if (res_opts_to_skb(skb, &first_peer_device(device)->connection->res_opts, exclude_sensitive)) + if (res_opts_to_skb(skb, &device->resource->res_opts, exclude_sensitive)) goto nla_put_failure; rcu_read_lock(); diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c index bb3d5947904d..64937536be0f 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c @@ -871,7 +871,7 @@ static union drbd_state sanitize_state(struct drbd_device *device, union drbd_st (ns.role == R_PRIMARY && ns.conn < C_CONNECTED && ns.pdsk > D_OUTDATED)) ns.susp_fen = 1; /* Suspend IO while fence-peer handler runs (peer lost) */ - if (first_peer_device(device)->connection->res_opts.on_no_data == OND_SUSPEND_IO && + if (device->resource->res_opts.on_no_data == OND_SUSPEND_IO && (ns.role == R_PRIMARY && ns.disk < D_UP_TO_DATE && ns.pdsk < D_UP_TO_DATE)) ns.susp_nod = 1; /* Suspend IO while no data available (no accessible data available) */