summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dlm/dlm_load.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/dlm/dlm_load.c b/dlm/dlm_load.c
index 3b967ef..cb5c2d4 100644
--- a/dlm/dlm_load.c
+++ b/dlm/dlm_load.c
@@ -25,6 +25,7 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/errno.h>
+#include <sys/utsname.h>
#include "libdlm.h"
@@ -37,6 +38,8 @@
#define DEFAULT_SLEEP_ITER 10
#define DEFAULT_SLEEP_TIME 200000 /* usecs */
+static struct utsname utsname;
+
static dlm_lshandle_t *dh;
static int libdlm_fd;
static uint32_t iterations = 0;
@@ -83,8 +86,11 @@ struct lk {
int last_status;
int bast;
int cancel_busy;
+ int use_lvb;
+ int valnotvalid;
time_t wait_start;
struct dlm_lksb lksb;
+ char lvb[32];
};
static struct lk *locks;
@@ -196,6 +202,11 @@ static void dump_lk(int num)
printf("done\n");
}
+ if (lk->use_lvb) {
+ printf("vb %03u %s %s\n", num, lk->lvb,
+ lk->valnotvalid ? "[VALNOTVALID]" : "");
+ }
+
fflush(stdout);
}
@@ -228,6 +239,12 @@ static void astfn(void *arg)
switch (status) {
case 0:
+ if (lk->lksb.sb_flags & DLM_SBF_VALNOTVALID) {
+ log_debug("lk %03u cast 0 VALNOTVALID", num);
+ lk->valnotvalid = 1;
+ } else {
+ lk->valnotvalid = 0;
+ }
case EAGAIN:
if (lk->wait_request || lk->wait_convert) {
if (lk->wait_request && (status == EAGAIN)) {
@@ -441,6 +458,8 @@ static int do_request(int num, int mode, int noqueue)
if (noqueue)
flags |= LKF_NOQUEUE;
+ if (lk->use_lvb)
+ flags |= LKF_VALBLK;
memset(name, 0, sizeof(name));
snprintf(name, sizeof(name), "test%d", (num % maxr));
@@ -483,6 +502,13 @@ static int do_convert(int num, int mode, int noqueue, int quecvt)
flags |= LKF_NOQUEUE;
if (quecvt)
flags |= LKF_QUECVT;
+ if (lk->use_lvb)
+ flags |= LKF_VALBLK;
+
+ if (lk->use_lvb && lk->grmode >= LKM_PWMODE) {
+ sprintf(lk->lvb, "%s %llu",
+ utsname.nodename, (unsigned long long)time(NULL));
+ }
memset(name, 0, sizeof(name));
snprintf(name, sizeof(name), "test%d", (num % maxr));
@@ -535,6 +561,14 @@ static int do_unlock(int num)
return;
}
+ if (lk->use_lvb)
+ flags |= LKF_VALBLK;
+
+ if (lk->use_lvb && lk->grmode >= LKM_PWMODE) {
+ sprintf(lk->lvb, "%s %llu",
+ utsname.nodename, (unsigned long long)time(NULL));
+ }
+
log_pre("lk %03u unlock", num);
rv = dlm_ls_unlock(dh, lk->lksb.sb_lkid, flags, &lk->lksb, lk);
@@ -564,6 +598,21 @@ static int do_unlock(int num)
return rv;
}
+static int lvb_on(int num)
+{
+ struct lk *lk;
+ int rv;
+
+ lk = get_lock(num);
+ if (!lk) {
+ printf("unknown lk %d\n", num);
+ return;
+ }
+
+ lk->use_lvb = 1;
+ lk->lksb.sb_lvbptr = lk->lvb;
+}
+
/* The op following a cancel can return -EBUSY. I don't think there is any
way to know in this case when we can do the next op without getting
EBUSY back. See lk->cancel_busy. Without the cancel_busy check we get
@@ -766,6 +815,10 @@ static void user_cmd(int *quit)
do_convert(num, x, y, 1);
}
+ else if (!strcmp(cmd, "lvb_on")) {
+ lvb_on(num);
+ }
+
else if (!strcmp(cmd, "unlock")) {
do_unlock(num);
}
@@ -921,6 +974,8 @@ int main(int argc, char *argv[])
srandom(time(NULL));
+ uname(&utsname);
+
decode_arguments(argc, argv);
if (maxn < maxr) {