80e28a00ec
- unmodified_drivers: handle IRQF_SAMPLE_RANDOM, it was removed in 3.6-rc1 - bnc#778105 - first XEN-PV VM fails to spawn xend: Increase wait time for disk to appear in host bootloader Modified existing xen-domUloader.diff - Disable the snapshot patches. Snapshot only supported the qcow2 image format which was poorly implemented qemu 0.10.2. Snapshot support may be restored in the future when the newer upstream qemu is used by Xen. - bnc#776995 - attaching scsi control luns with pvscsi - xend/pvscsi: fix passing of SCSI control LUNs xen-bug776995-pvscsi-no-devname.patch - xend/pvscsi: fix usage of persistant device names for SCSI devices xen-bug776995-pvscsi-persistent-names.patch - xend/pvscsi: update sysfs parser for Linux 3.0 xen-bug776995-pvscsi-sysfs-parser.patch - Update to Xen 4.2.0 RC3+ c/s 25779 - Update to Xen 4.2.0 RC2+ c/s 25765 OBS-URL: https://build.opensuse.org/package/show/Virtualization/xen?expand=0&rev=199
85 lines
2.3 KiB
Diff
85 lines
2.3 KiB
Diff
Fix problems that suspend eventchannel lock file might be obselete for some reason
|
|
like segment fault or other abnormal exit, and once obselete lock file exists,
|
|
it might affact latter save process.
|
|
Have discussed with upstream, for some reason not accepted.
|
|
http://xen.1045712.n5.nabble.com/Re-PATCH-improve-suspend-evtchn-lock-processing-td3395229.html
|
|
|
|
Signed-off-by: Chunyan Liu <cyliu@suse.com>
|
|
|
|
Index: xen-4.2.0-testing/tools/libxc/xc_suspend.c
|
|
===================================================================
|
|
--- xen-4.2.0-testing.orig/tools/libxc/xc_suspend.c
|
|
+++ xen-4.2.0-testing/tools/libxc/xc_suspend.c
|
|
@@ -16,8 +16,43 @@
|
|
|
|
#include "xc_private.h"
|
|
#include "xenguest.h"
|
|
+#include <signal.h>
|
|
+#ifdef __MINIOS__
|
|
+extern int kill (__pid_t __pid, int __sig);
|
|
+#endif
|
|
|
|
#define SUSPEND_LOCK_FILE "/var/lib/xen/suspend_evtchn"
|
|
+/* cleanup obsolete suspend lock file which is unlinked for any reason,
|
|
+so that current process can get lock */
|
|
+static void clean_obsolete_lock(int domid)
|
|
+{
|
|
+ int fd, pid, n;
|
|
+ char buf[128];
|
|
+ char suspend_file[256];
|
|
+
|
|
+ snprintf(suspend_file, sizeof(suspend_file), "%s_%d_lock.d",
|
|
+ SUSPEND_LOCK_FILE, domid);
|
|
+ fd = open(suspend_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_file);
|
|
+ return;
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
static int lock_suspend_event(xc_interface *xch, int domid)
|
|
{
|
|
int fd, rc;
|
|
@@ -27,6 +62,7 @@ static int lock_suspend_event(xc_interfa
|
|
|
|
snprintf(suspend_file, sizeof(suspend_file), "%s_%d_lock.d",
|
|
SUSPEND_LOCK_FILE, domid);
|
|
+ clean_obsolete_lock(domid);
|
|
mask = umask(022);
|
|
fd = open(suspend_file, O_CREAT | O_EXCL | O_RDWR, 0666);
|
|
if (fd < 0)
|
|
@@ -41,6 +77,9 @@ static int lock_suspend_event(xc_interfa
|
|
rc = write_exact(fd, buf, strlen(buf));
|
|
close(fd);
|
|
|
|
+ if(rc)
|
|
+ unlink(suspend_file);
|
|
+
|
|
return rc;
|
|
}
|
|
|
|
@@ -127,8 +166,7 @@ int xc_suspend_evtchn_init(xc_interface
|
|
return suspend_evtchn;
|
|
|
|
cleanup:
|
|
- if (suspend_evtchn != -1)
|
|
- xc_suspend_evtchn_release(xch, xce, domid, suspend_evtchn);
|
|
+ xc_suspend_evtchn_release(xch, xce, domid, suspend_evtchn);
|
|
|
|
return -1;
|
|
}
|