diff options
author | David Teigland <teigland@redhat.com> | 2012-11-16 12:03:56 -0600 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2012-11-16 12:03:56 -0600 |
commit | 5ee123197a97593263ea88a8cc0dbe8c3c9cc622 (patch) | |
tree | dc8a9cf89bd0e29b58cc83aaf93b3928470e5e05 /dlm | |
parent | 5de0b6b9ec25d081b101980c2d5c8e9a1f829779 (diff) | |
download | dct-stuff-master.tar.gz dct-stuff-master.tar.xz dct-stuff-master.zip |
Diffstat (limited to 'dlm')
-rw-r--r-- | dlm/dlm_load.c | 55 |
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) { |