|
@@ -973,16 +973,20 @@ static ssize_t resume_show(struct kobject *kobj, struct kobj_attribute *attr,
|
|
|
static ssize_t resume_store(struct kobject *kobj, struct kobj_attribute *attr,
|
|
|
const char *buf, size_t n)
|
|
|
{
|
|
|
- unsigned int maj, min;
|
|
|
dev_t res;
|
|
|
- int ret = -EINVAL;
|
|
|
+ int len = n;
|
|
|
+ char *name;
|
|
|
|
|
|
- if (sscanf(buf, "%u:%u", &maj, &min) != 2)
|
|
|
- goto out;
|
|
|
+ if (len && buf[len-1] == '\n')
|
|
|
+ len--;
|
|
|
+ name = kstrndup(buf, len, GFP_KERNEL);
|
|
|
+ if (!name)
|
|
|
+ return -ENOMEM;
|
|
|
|
|
|
- res = MKDEV(maj,min);
|
|
|
- if (maj != MAJOR(res) || min != MINOR(res))
|
|
|
- goto out;
|
|
|
+ res = name_to_dev_t(name);
|
|
|
+ kfree(name);
|
|
|
+ if (!res)
|
|
|
+ return -EINVAL;
|
|
|
|
|
|
lock_system_sleep();
|
|
|
swsusp_resume_device = res;
|
|
@@ -990,9 +994,7 @@ static ssize_t resume_store(struct kobject *kobj, struct kobj_attribute *attr,
|
|
|
printk(KERN_INFO "PM: Starting manual resume from disk\n");
|
|
|
noresume = 0;
|
|
|
software_resume();
|
|
|
- ret = n;
|
|
|
- out:
|
|
|
- return ret;
|
|
|
+ return n;
|
|
|
}
|
|
|
|
|
|
power_attr(resume);
|