[Drbd-dev] [PATCH] drbdadm: Fix does not allocate bitmap for stacked res
Nick Wang
nwang at suse.com
Mon Jan 29 06:01:40 CET 2018
Hi Philipp,
Your fix working perfectly in my test scenario.
Best regards,
Nick
>>> On 1/26/2018 at 11:26 下午, in message <1621611.JSGMFM0nhf at fat-tyre>, Philipp
Reisner <philipp.reisner at linbit.com> wrote:
> Hi Nick,
>
> regarding you proposed patch, instead of special casing
> the code we should rather fix the data structure.
>
> I will give it a bit more testing before I push it to the master.
> Please let me know if that works for your test-cases.
>
> best regards,
> Phil
>
> From b5eab810ded459792c24a4bc5db5ce272ea1ee15 Mon Sep 17 00:00:00 2001
> From: Philipp Reisner <philipp.reisner at linbit.com>
> Date: Fri, 26 Jan 2018 16:09:01 +0100
> Subject: [PATCH] v9,drbdadm,stacking: Fix setting the disk in stacked host
> sections
>
> This got broken on the long way from drbd-8.4 to 9.
> ---
> user/v9/drbdadm_postparse.c | 73 ++++++++++++++++++++++-----------------------
> 1 file changed, 36 insertions(+), 37 deletions(-)
>
> diff --git a/user/v9/drbdadm_postparse.c b/user/v9/drbdadm_postparse.c
> index dde0a5e..f223dbe 100644
> --- a/user/v9/drbdadm_postparse.c
> +++ b/user/v9/drbdadm_postparse.c
> @@ -514,9 +514,9 @@ void set_peer_in_resource(struct d_resource* res, int
> peer_required)
> add_no_bitmap_opt(res);
> }
>
> -void set_disk_in_res(struct d_resource *res)
> +void set_stacked_disk_in_res(struct d_resource *res)
> {
> - struct d_host_info *host;
> + struct d_host_info *host, *lower_host;
> struct d_volume *a, *b;
>
> if (res->ignore)
> @@ -526,41 +526,40 @@ void set_disk_in_res(struct d_resource *res)
> if (!host->lower)
> continue;
>
> - if (host->lower->ignore)
> - continue;
> -
> - check_volume_sets_equal(res, host, host->lower->me);
> - if (!config_valid)
> - /* don't even bother for broken config. */
> - continue;
> + for_each_host(lower_host, &host->lower->all_hosts) {
> + check_volume_sets_equal(res, host, lower_host);
> + if (!config_valid)
> + /* don't even bother for broken config. */
> + continue;
>
> - /* volume lists are sorted on vnr */
> - a = STAILQ_FIRST(&host->volumes);
> - b = STAILQ_FIRST(&host->lower->me->volumes);
> - while (a) {
> - while (b && a->vnr > b->vnr) {
> - /* Lower resource has more volumes.
> - * Probably unusual, but we decided
> - * that it should be legal.
> - * Skip those that do not match */
> - b = STAILQ_NEXT(b, link);
> - }
> - if (a && b && a->vnr == b->vnr) {
> - if (b->device)
> - m_asprintf(&a->disk, "%s", b->device);
> - else
> - m_asprintf(&a->disk, "/dev/drbd%u",
> b->device_minor);
> - /* stacked implicit volumes need internal
> meta data, too */
> - if (!a->meta_disk)
> - m_asprintf(&a->meta_disk, "internal");
> - if (!a->meta_index)
> - m_asprintf(&a->meta_index, "internal");
> - a = STAILQ_NEXT(a, link);
> - b = STAILQ_NEXT(b, link);
> - } else {
> - /* config_invalid should have been set
> - * by check_volume_sets_equal */
> - assert(0);
> + /* volume lists are sorted on vnr */
> + a = STAILQ_FIRST(&host->volumes);
> + b = STAILQ_FIRST(&lower_host->volumes);
> + while (a) {
> + while (b && a->vnr > b->vnr) {
> + /* Lower resource has more volumes.
> + * Probably unusual, but we decided
> + * that it should be legal.
> + * Skip those that do not match */
> + b = STAILQ_NEXT(b, link);
> + }
> + if (a && b && a->vnr == b->vnr) {
> + if (b->device)
> + m_asprintf(&a->disk, "%s",
> b->device);
> + else
> + m_asprintf(&a->disk,
> "/dev/drbd%u", b->device_minor);
> + /* stacked implicit volumes need
> internal meta data, too */
> + if (!a->meta_disk)
> + m_asprintf(&a->meta_disk,
> "internal");
> + if (!a->meta_index)
> + m_asprintf(&a->meta_index,
> "internal");
> + a = STAILQ_NEXT(a, link);
> + b = STAILQ_NEXT(b, link);
> + } else {
> + /* config_invalid should have been
> set
> + * by check_volume_sets_equal */
> + assert(0);
> + }
> }
> }
> }
> @@ -1161,7 +1160,7 @@ void post_parse(struct resources *resources, enum
> pp_flags flags)
> // Needs "me" set already
> for_each_resource(res, resources)
> if (res->stacked_on_one)
> - set_disk_in_res(res);
> + set_stacked_disk_in_res(res);
>
> for_each_resource(res, resources)
> fixup_peer_devices(res);
More information about the drbd-dev
mailing list