[Ocfs2-tools-devel] [PATCH 4/6] libo2dlm: Don't drop locks at unlock.
Joel Becker
joel.becker at oracle.com
Wed Feb 10 01:34:24 PST 2010
Currently, libo2dlm unlinks files from dlmfs when a lock is unlocked.
This drops the lock in the DLM, losing the contents of the LVB and
removing any lock caching. While o2dlm holds onto a lock for a few
seconds, no DLM guarantees this will happen. We don't want that!
Instead, we change o2dlm_unlock() to leave the lock file around in
dlmfs. This is a truly cached lock. The calling program can explicitly
drop the lock with o2dlm_drop_lock(). Otherwise, the lock is dropped
when the domain is shut down.
lvb_torture now passes with fsdlm.
Signed-off-by: Joel Becker <joel.becker at oracle.com>
---
include/o2dlm/o2dlm.h | 4 ++++
libo2dlm/o2dlm.c | 44 ++++++++++++++++++++++++++++++++++----------
2 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/include/o2dlm/o2dlm.h b/include/o2dlm/o2dlm.h
index bb9aca8..2919b23 100644
--- a/include/o2dlm/o2dlm.h
+++ b/include/o2dlm/o2dlm.h
@@ -94,6 +94,10 @@ errcode_t o2dlm_lock_with_bast(struct o2dlm_ctxt *ctxt,
errcode_t o2dlm_unlock(struct o2dlm_ctxt *ctxt,
const char *lockid);
+/* Remove an unlocked lock from the domain */
+errcode_t o2dlm_drop_lock(struct o2dlm_ctxt *ctxt, const char *lockid);
+
+
/* Read the LVB out of a lock.
* 'len' is the amount to read into 'lvb'
*
diff --git a/libo2dlm/o2dlm.c b/libo2dlm/o2dlm.c
index ee7f34c..dbc642b 100644
--- a/libo2dlm/o2dlm.c
+++ b/libo2dlm/o2dlm.c
@@ -509,24 +509,23 @@ static errcode_t o2dlm_lock_classic(struct o2dlm_ctxt *ctxt,
return 0;
}
-static errcode_t o2dlm_unlock_lock_res_classic(struct o2dlm_ctxt *ctxt,
- struct o2dlm_lock_res *lockres)
+static errcode_t o2dlm_drop_lock_classic(struct o2dlm_ctxt *ctxt,
+ const char *lockid)
{
int ret, len = PATH_MAX + 1;
char *path;
- /* This does the actual unlock. */
- close(lockres->l_fd);
-
- /* From here on down, we're trying to unlink the lockres file
- * from the dlm file system. Note that EBUSY from unlink is
- * not a fatal error here -- it simply means that the lock is
- * in use by some other process. */
+ /*
+ * We're trying to unlink the lockres file from the dlm file
+ * system. Note that EBUSY from unlink is not a fatal error here
+ * -- it simply means that the lock is in use by some other
+ * process.
+ * */
path = malloc(len);
if (!path)
return O2DLM_ET_NO_MEMORY;
- ret = o2dlm_full_path(path, ctxt, lockres->l_id);
+ ret = o2dlm_full_path(path, ctxt, lockid);
if (ret) {
free(path);
return ret;
@@ -542,6 +541,13 @@ static errcode_t o2dlm_unlock_lock_res_classic(struct o2dlm_ctxt *ctxt,
return 0;
}
+static errcode_t o2dlm_unlock_lock_res_classic(struct o2dlm_ctxt *ctxt,
+ struct o2dlm_lock_res *lockres)
+{
+ close(lockres->l_fd);
+ return 0;
+}
+
static errcode_t o2dlm_read_lvb_classic(struct o2dlm_ctxt *ctxt,
char *lockid,
char *lvb,
@@ -1260,6 +1266,24 @@ static errcode_t o2dlm_unlock_lock_res(struct o2dlm_ctxt *ctxt,
return o2dlm_unlock_lock_res_fsdlm(ctxt, lockres);
}
+/*
+ * Dropping locks is only available on dlmfs. No one should be using
+ * libdlm if they can help it.
+ */
+errcode_t o2dlm_drop_lock(struct o2dlm_ctxt *ctxt, const char *lockid)
+{
+ if (!ctxt || !lockid)
+ return O2DLM_ET_INVALID_ARGS;
+
+ if (o2dlm_find_lock_res(ctxt, lockid))
+ return O2DLM_ET_BUSY_LOCK;
+
+ if (ctxt->ct_classic)
+ return o2dlm_drop_lock_classic(ctxt, lockid);
+ else
+ return O2DLM_ET_SERVICE_UNAVAILABLE;
+}
+
errcode_t o2dlm_unlock(struct o2dlm_ctxt *ctxt,
const char *lockid)
{
--
1.6.6.1
More information about the Ocfs2-tools-devel
mailing list