From f74b155fc37b70b88d33599749c5c7a33b19f2e4 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Thu, 2 Apr 2015 16:27:05 -0500 Subject: lvmlockd: fixes for adopting locks in dlm --- daemons/lvmlockd/lvmlockd-core.c | 6 ++++-- daemons/lvmlockd/lvmlockd-dlm.c | 31 ++++++++++++++++++++++++------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/daemons/lvmlockd/lvmlockd-core.c b/daemons/lvmlockd/lvmlockd-core.c index f2e514cba..dd34cdbf8 100644 --- a/daemons/lvmlockd/lvmlockd-core.c +++ b/daemons/lvmlockd/lvmlockd-core.c @@ -4358,7 +4358,8 @@ static int get_lockd_vgs(struct list_head *vg_lockd) r->type = LD_RT_LV; strncpy(r->name, lv_cn->key, MAX_NAME); - strncpy(r->lv_args, lock_args, MAX_ARGS); + if (lock_args) + strncpy(r->lv_args, lock_args, MAX_ARGS); list_add_tail(&r->list, &ls->resources); } } @@ -4366,7 +4367,7 @@ static int get_lockd_vgs(struct list_head *vg_lockd) daemon_reply_destroy(reply); log_debug("get_lockd_vgs %s lock_type %s lock_args %s", - ls->vg_name, lock_type, lock_args); + ls->vg_name, lock_type, lock_args ?: "none"); if (rv < 0) break; @@ -4552,6 +4553,7 @@ static void adopt_locks(void) if (!strcmp(ls1->name, gl_lsname_dlm)) { list_del(&ls1->list); free(ls1); + continue; } found = 0; diff --git a/daemons/lvmlockd/lvmlockd-dlm.c b/daemons/lvmlockd/lvmlockd-dlm.c index 30cd6d378..5d0ffb3de 100644 --- a/daemons/lvmlockd/lvmlockd-dlm.c +++ b/daemons/lvmlockd/lvmlockd-dlm.c @@ -311,6 +311,9 @@ int lm_rem_resource_dlm(struct lockspace *ls, struct resource *r) lksb = &rdd->lksb; + if (!lksb->sb_lkid) + goto out; + rv = dlm_ls_unlock_wait(lmd->dh, lksb->sb_lkid, 0, lksb); if (rv < 0) { log_error("S %s R %s rem_resource_dlm unlock error %d", ls->name, r->name, rv); @@ -365,7 +368,8 @@ static int lm_adopt_dlm(struct lockspace *ls, struct resource *r, int ld_mode, mode = to_dlm_mode(ld_mode); if (mode < 0) { log_error("adopt_dlm invalid mode %d", ld_mode); - return -EINVAL; + rv = -EINVAL; + goto fail; } log_debug("S %s R %s adopt_dlm", ls->name, r->name); @@ -376,20 +380,26 @@ static int lm_adopt_dlm(struct lockspace *ls, struct resource *r, int ld_mode, /* * dlm returns 0 for success, -EAGAIN if an orphan is * found with another mode, and -ENOENT if no orphan. + * + * cast/bast/param are (void *)1 because the kernel + * returns errors if some are null. */ - rv = dlm_ls_lock(lmd->dh, mode, lksb, flags, - r->name, strlen(r->name), - 0, NULL, NULL, NULL, NULL); + rv = dlm_ls_lockx(lmd->dh, mode, lksb, flags, + r->name, strlen(r->name), 0, + (void *)1, (void *)1, (void *)1, + NULL, NULL); if (rv == -EAGAIN) { log_debug("S %s R %s adopt_dlm adopt mode %d try other mode", ls->name, r->name, ld_mode); - return -EUCLEAN; + rv = -EUCLEAN; + goto fail; } if (rv < 0) { - log_debug("S %s R %s adopt_dlm error %d", ls->name, r->name, rv); - return rv; + log_debug("S %s R %s adopt_dlm mode %d flags %x error %d errno %d", + ls->name, r->name, mode, flags, rv, errno); + goto fail; } /* @@ -404,6 +414,10 @@ static int lm_adopt_dlm(struct lockspace *ls, struct resource *r, int ld_mode, */ return rv; + + fail: + lm_rem_resource_dlm(ls, r); + return rv; } /* @@ -620,6 +634,9 @@ int lm_get_lockspaces_dlm(struct list_head *ls_rejoin) if (de->d_name[0] == '.') continue; + if (strncmp(de->d_name, LVM_LS_PREFIX, strlen(LVM_LS_PREFIX))) + continue; + if (!(ls = alloc_lockspace())) { closedir(ls_dir); return -ENOMEM; -- cgit v1.2.1