File suspend_evtchn_lock.patch of Package xen.openSUSE_11.4_Update

Index: xen-4.0.3-testing/tools/libxc/xc_suspend.c
===================================================================
--- xen-4.0.3-testing.orig/tools/libxc/xc_suspend.c
+++ xen-4.0.3-testing/tools/libxc/xc_suspend.c
@@ -6,14 +6,46 @@
 
 #include "xc_private.h"
 #include "xenguest.h"
+#include <signal.h>
+#include <signal.h>
+#ifdef __MINIOS__
+extern int kill (__pid_t __pid, int __sig);
+#endif
 
 #define SUSPEND_LOCK_FILE "/var/lib/xen/suspend_evtchn_lock.d"
+/* cleanup obsolete suspend lock file which is unlinked for any reason,
+so that current process can get lock */
+static void clean_obsolete_lock(void)
+{
+    int fd, pid, n;
+    char buf[128];
+    fd = open(SUSPEND_LOCK_FILE, O_RDWR);
+    if (fd < 0)
+        return;
+
+    n = read(fd, buf, 127);
+
+    close(fd);
+
+    if (n > 0)
+    {
+        sscanf(buf, "%d", &pid);
+	/* pid does not exist, this lock file is obsolete, just delete it */
+        if ( kill(pid,0) )
+        {
+            unlink(SUSPEND_LOCK_FILE);
+            return;
+        }
+    }
+}
+
 static int lock_suspend_event(void)
 {
     int fd, rc;
     mode_t mask;
     char buf[128];
 
+    clean_obsolete_lock();
     mask = umask(022);
     fd = open(SUSPEND_LOCK_FILE, O_CREAT | O_EXCL | O_RDWR, 0666);
     if (fd < 0)
@@ -27,6 +59,9 @@ static int lock_suspend_event(void)
     rc = write_exact(fd, buf, strlen(buf));
     close(fd);
 
+    if(rc)
+	unlink(SUSPEND_LOCK_FILE);
+
     return rc;
 }
 
@@ -110,8 +145,7 @@ int xc_suspend_evtchn_init(int xc, int x
     return suspend_evtchn;
 
 cleanup:
-    if (suspend_evtchn != -1)
-        xc_suspend_evtchn_release(xce, suspend_evtchn);
+    xc_suspend_evtchn_release(xce, suspend_evtchn);
 
     return -1;
 }
openSUSE Build Service is sponsored by