[Cluster-devel] cluster/dlm/lib libdlm.c libdlm.h

teigland at sourceware.org teigland at sourceware.org
Wed May 30 18:18:03 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	teigland at sourceware.org	2007-05-30 18:18:02

Modified files:
	dlm/lib        : libdlm.c libdlm.h 

Log message:
	Add dlm_ls_deadlock_cancel() that allows a system daemon to cancel
	an application's deadlocked lock.  This requires the latest dlm
	kernel headers.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm/lib/libdlm.c.diff?cvsroot=cluster&r1=1.34&r2=1.35
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/dlm/lib/libdlm.h.diff?cvsroot=cluster&r1=1.14&r2=1.15

--- cluster/dlm/lib/libdlm.c	2007/05/18 16:35:15	1.34
+++ cluster/dlm/lib/libdlm.c	2007/05/30 18:18:02	1.35
@@ -1006,8 +1006,8 @@
  * All the ways to unlock/cancel a lock
  */
 
-static int ls_unlock_v5(struct dlm_ls_info *lsinfo, uint32_t lkid, uint32_t flags,
-			struct dlm_lksb *lksb, void *astarg)
+static int ls_unlock_v5(struct dlm_ls_info *lsinfo, uint32_t lkid,
+			uint32_t flags, struct dlm_lksb *lksb, void *astarg)
 {
 	struct dlm_write_request_v5 req;
 
@@ -1027,8 +1027,8 @@
 		return write(lsinfo->fd, &req, sizeof(req));
 }
 
-static int ls_unlock_v6(struct dlm_ls_info *lsinfo, uint32_t lkid, uint32_t flags,
-			struct dlm_lksb *lksb, void *astarg)
+static int ls_unlock_v6(struct dlm_ls_info *lsinfo, uint32_t lkid,
+			uint32_t flags, struct dlm_lksb *lksb, void *astarg)
 {
 	struct dlm_write_request req;
 
@@ -1091,6 +1091,34 @@
 	return dlm_ls_unlock(default_ls, lkid, flags, lksb, astarg);
 }
 
+int dlm_ls_deadlock_cancel(dlm_lshandle_t ls, uint32_t lkid, uint32_t flags)
+{
+	struct dlm_ls_info *lsinfo = (struct dlm_ls_info *)ls;
+	struct dlm_write_request req;
+
+	if (kernel_version.version[0] < 6) {
+		errno = ENOSYS;
+		return -1;
+	}
+
+	if (ls == NULL) {
+		errno = ENOTCONN;
+		return -1;
+	}
+
+	if (!lkid) {
+		errno = EINVAL;
+		return -1;
+	}
+
+	set_version_v6(&req);
+	req.cmd = DLM_USER_DEADLOCK;
+	req.i.lock.lkid = lkid;
+	req.i.lock.flags = flags;
+
+	return write(lsinfo->fd, &req, sizeof(req));
+}
+
 
 /*
  * Purge
@@ -1130,7 +1158,7 @@
  * do their own fd handling.
  * This allows a non-threaded app to use the DLM.
  */
-int dlm_get_fd()
+int dlm_get_fd(void)
 {
     if (default_ls)
     {
--- cluster/dlm/lib/libdlm.h	2007/05/18 16:35:16	1.14
+++ cluster/dlm/lib/libdlm.h	2007/05/30 18:18:02	1.15
@@ -159,6 +159,7 @@
  * dlm_ls_unlock()
  * dlm_ls_lock_wait()
  * dlm_ls_unlock_wait()
+ * dlm_ls_deadlock_cancel()
  * dlm_ls_purge()
  */
 
@@ -209,6 +210,10 @@
 		uint32_t flags,
 		struct dlm_lksb *lksb);
 
+extern int dlm_ls_deadlock_cancel(dlm_lshandle_t ls,
+		uint32_t lkid,
+		uint32_t flags);
+
 extern int dlm_ls_purge(dlm_lshandle_t lockspace,
 		int nodeid,
 		int pid);




More information about the Cluster-devel mailing list