Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12-SP2:Update
xen.5852
suspend_evtchn_lock.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File suspend_evtchn_lock.patch of Package xen.5852
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.7.0-testing/tools/libxc/xc_suspend.c =================================================================== --- xen-4.7.0-testing.orig/tools/libxc/xc_suspend.c +++ xen-4.7.0-testing/tools/libxc/xc_suspend.c @@ -20,6 +20,10 @@ #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 XEN_RUN_DIR "/suspend-evtchn-%d.lock" @@ -35,6 +39,37 @@ #define SUSPEND_FILE_BUFLEN (sizeof(SUSPEND_LOCK_FILE) + 10) +/* 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 void get_suspend_file(char buf[], int domid) { snprintf(buf, SUSPEND_FILE_BUFLEN, SUSPEND_LOCK_FILE, domid); @@ -48,6 +83,7 @@ static int lock_suspend_event(xc_interfa struct flock fl; get_suspend_file(suspend_file, domid); + clean_obsolete_lock(domid); *lockfd = -1; @@ -97,6 +133,8 @@ static int lock_suspend_event(xc_interfa if (fd >= 0) close(fd); + unlink(suspend_file); + return -1; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor