Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd5d666b authored by Shaohua Li's avatar Shaohua Li Committed by Linus Torvalds
Browse files

[PATCH] swsusp: add locking to software_resume



It is trying to protect swsusp_resume_device and software_resume() from two
users banging it from userspace at the same time.

Signed-off-by: default avatarShaohua Li <shaohua.li@intel.com>
Signed-off-by: default avatarPavel Machek <pavel@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 6ed9fcec
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -233,9 +233,12 @@ static int software_resume(void)
{
	int error;

	down(&pm_sem);
	if (!swsusp_resume_device) {
		if (!strlen(resume_file))
		if (!strlen(resume_file)) {
			up(&pm_sem);
			return -ENOENT;
		}
		swsusp_resume_device = name_to_dev_t(resume_file);
		pr_debug("swsusp: Resume From Partition %s\n", resume_file);
	} else {
@@ -248,6 +251,7 @@ static int software_resume(void)
		 * FIXME: If noresume is specified, we need to find the partition
		 * and reset it back to normal swap space.
		 */
		up(&pm_sem);
		return 0;
	}

@@ -284,6 +288,8 @@ static int software_resume(void)
 Cleanup:
	unprepare_processes();
 Done:
	/* For success case, the suspend path will release the lock */
	up(&pm_sem);
	pr_debug("PM: Resume from disk failed.\n");
	return 0;
}
@@ -390,7 +396,9 @@ static ssize_t resume_store(struct subsystem * subsys, const char * buf, size_t
	if (sscanf(buf, "%u:%u", &maj, &min) == 2) {
		res = MKDEV(maj,min);
		if (maj == MAJOR(res) && min == MINOR(res)) {
			down(&pm_sem);
			swsusp_resume_device = res;
			up(&pm_sem);
			printk("Attempting manual resume\n");
			noresume = 0;
			software_resume();