diff options
author | Andreas Gruenbacher <agruen@linbit.com> | 2011-06-16 15:58:02 (GMT) |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 15:57:46 (GMT) |
commit | afbbfa88bc506bc13b957c3811bce299de1d31d5 (patch) | |
tree | edb0be8cfb2ecc1fcd4c8bd93bce96f852be4b59 /drivers/block/drbd/drbd_main.c | |
parent | 089c075d88ac9407b8d7c5c8fc4b21c0d940bd82 (diff) | |
download | linux-fsl-qoriq-afbbfa88bc506bc13b957c3811bce299de1d31d5.tar.xz |
drbd: Allow to pass resource options to the new-resource command
This is equivalent to how the attach and connect commands work.
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 | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 79f275d..933d476 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -2479,8 +2479,47 @@ void conn_free_crypto(struct drbd_tconn *tconn) tconn->int_dig_vv = NULL; } +int set_resource_options(struct drbd_tconn *tconn, struct res_opts *res_opts) +{ + cpumask_var_t new_cpu_mask; + int err; + + if (!zalloc_cpumask_var(&new_cpu_mask, GFP_KERNEL)) + return -ENOMEM; + /* + retcode = ERR_NOMEM; + drbd_msg_put_info("unable to allocate cpumask"); + */ + + /* silently ignore cpu mask on UP kernel */ + if (nr_cpu_ids > 1 && res_opts->cpu_mask[0] != 0) { + /* FIXME: Get rid of constant 32 here */ + err = __bitmap_parse(res_opts->cpu_mask, 32, 0, + cpumask_bits(new_cpu_mask), nr_cpu_ids); + if (err) { + conn_warn(tconn, "__bitmap_parse() failed with %d\n", err); + /* retcode = ERR_CPU_MASK_PARSE; */ + goto fail; + } + } + tconn->res_opts = *res_opts; + if (!cpumask_equal(tconn->cpu_mask, new_cpu_mask)) { + cpumask_copy(tconn->cpu_mask, new_cpu_mask); + drbd_calc_cpu_mask(tconn); + tconn->receiver.reset_cpu_mask = 1; + tconn->asender.reset_cpu_mask = 1; + tconn->worker.reset_cpu_mask = 1; + } + err = 0; + +fail: + free_cpumask_var(new_cpu_mask); + return err; + +} + /* caller must be under genl_lock() */ -struct drbd_tconn *conn_create(const char *name) +struct drbd_tconn *conn_create(const char *name, struct res_opts *res_opts) { struct drbd_tconn *tconn; @@ -2500,6 +2539,9 @@ struct drbd_tconn *conn_create(const char *name) if (!zalloc_cpumask_var(&tconn->cpu_mask, GFP_KERNEL)) goto fail; + if (set_resource_options(tconn, res_opts)) + goto fail; + if (!tl_init(tconn)) goto fail; @@ -2520,8 +2562,6 @@ struct drbd_tconn *conn_create(const char *name) drbd_thread_init(tconn, &tconn->worker, drbd_worker, "worker"); drbd_thread_init(tconn, &tconn->asender, drbd_asender, "asender"); - drbd_set_res_opts_defaults(&tconn->res_opts); - kref_init(&tconn->kref); list_add_tail_rcu(&tconn->all_tconn, &drbd_tconns); |