static void lock(int i, int mode) { char name[DLM_RESNAME_MAXLEN]; struct lk *lk; int flags = 0; int rv; uint64_t *timeout_arg = NULL; lk = get_lock(i); if (!lk) return; if (noqueue) flags |= LKF_NOQUEUE; if (persistent) flags |= LKF_PERSISTENT; if (timeout) { flags |= LKF_TIMEOUT; timeout_arg = &timeout; } if (lk->lksb.sb_lkid) flags |= LKF_CONVERT; memset(name, 0, sizeof(name)); snprintf(name, sizeof(name), "test%d", (i % maxr)); log_verbose("lock: %d grmode %d rqmode %d flags %x lkid %x %s\n", i, lk->grmode, mode, flags, lk->lksb.sb_lkid, name); #if 0 rv = dlm_ls_lock(dh, mode, &lk->lksb, flags, name, strlen(name), 0, astfn, (void *) lk, bastfn, NULL); #else rv = dlm_ls_lockx(dh, mode, &lk->lksb, flags, name, strlen(name), 0, astfn, (void *) lk, bastfn, &our_xid, timeout_arg); #endif if (!rv) { lk->wait_ast = 1; lk->rqmode = mode; gettimeofday(&lk->begin, NULL); } else if (rv == -1 && errno == EBUSY) { printf(" : lock %3d\t%x: EBUSY gr %d rq %d wait_ast %d\n", i, lk->lksb.sb_lkid, lk->grmode, lk->rqmode, lk->wait_ast); } else { printf(" : lock %3d\t%x: errno %d rv %d gr %d rq %d wait_ast %d\n", i, lk->lksb.sb_lkid, errno, rv, lk->grmode, lk->rqmode, lk->wait_ast); stress_stop = 1; } log_verbose("lock: %d rv %d sb_lkid %x sb_status %x\n", i, rv, lk->lksb.sb_lkid, lk->lksb.sb_status); lk->lastop = Op_lock; }
static int lm_adopt_dlm(struct lockspace *ls, struct resource *r, int ld_mode, struct val_blk *vb_out) { struct lm_dlm *lmd = (struct lm_dlm *)ls->lm_data; struct rd_dlm *rdd = (struct rd_dlm *)r->lm_data; struct dlm_lksb *lksb; uint32_t flags = 0; int mode; int rv; memset(vb_out, 0, sizeof(struct val_blk)); if (!r->lm_init) { rv = lm_add_resource_dlm(ls, r, 0); if (rv < 0) return rv; r->lm_init = 1; } lksb = &rdd->lksb; flags |= LKF_PERSISTENT; flags |= LKF_ORPHAN; if (rdd->vb) flags |= LKF_VALBLK; mode = to_dlm_mode(ld_mode); if (mode < 0) { log_error("adopt_dlm invalid mode %d", ld_mode); rv = -EINVAL; goto fail; } log_debug("S %s R %s adopt_dlm", ls->name, r->name); if (daemon_test) return 0; /* * 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_lockx(lmd->dh, mode, lksb, flags, r->name, strlen(r->name), 0, (void *)1, (void *)1, (void *)1, NULL, NULL); if (rv == -1 && errno == -EAGAIN) { log_debug("S %s R %s adopt_dlm adopt mode %d try other mode", ls->name, r->name, ld_mode); rv = -EUCLEAN; goto fail; } if (rv < 0) { 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; } /* * FIXME: For GL/VG locks we probably want to read the lvb, * especially if adopting an ex lock, because when we * release this adopted ex lock we may want to write new * lvb values based on the current lvb values (at lease * in the GL case where we increment the current values.) * * It should be possible to read the lvb by requesting * this lock in the same mode it's already in. */ return rv; fail: lm_rem_resource_dlm(ls, r); return rv; }