PM / sleep: move SNAPSHOT_SET_SWAP_AREA handling into a helper
Move the handling of the SNAPSHOT_SET_SWAP_AREA ioctl from the main ioctl helper into a helper function. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
committed by
Rafael J. Wysocki
parent
7e63420847
commit
88a77559cc
@@ -196,6 +196,34 @@ unlock:
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int snapshot_set_swap_area(struct snapshot_data *data,
|
||||||
|
void __user *argp)
|
||||||
|
{
|
||||||
|
struct resume_swap_area swap_area;
|
||||||
|
sector_t offset;
|
||||||
|
dev_t swdev;
|
||||||
|
|
||||||
|
if (swsusp_swap_in_use())
|
||||||
|
return -EPERM;
|
||||||
|
if (copy_from_user(&swap_area, argp, sizeof(swap_area)))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* User space encodes device types as two-byte values,
|
||||||
|
* so we need to recode them
|
||||||
|
*/
|
||||||
|
swdev = new_decode_dev(swap_area.dev);
|
||||||
|
if (!swdev) {
|
||||||
|
data->swap = -1;
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
offset = swap_area.offset;
|
||||||
|
data->swap = swap_type_of(swdev, offset, NULL);
|
||||||
|
if (data->swap < 0)
|
||||||
|
return -ENODEV;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static long snapshot_ioctl(struct file *filp, unsigned int cmd,
|
static long snapshot_ioctl(struct file *filp, unsigned int cmd,
|
||||||
unsigned long arg)
|
unsigned long arg)
|
||||||
{
|
{
|
||||||
@@ -351,34 +379,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case SNAPSHOT_SET_SWAP_AREA:
|
case SNAPSHOT_SET_SWAP_AREA:
|
||||||
if (swsusp_swap_in_use()) {
|
error = snapshot_set_swap_area(data, (void __user *)arg);
|
||||||
error = -EPERM;
|
|
||||||
} else {
|
|
||||||
struct resume_swap_area swap_area;
|
|
||||||
dev_t swdev;
|
|
||||||
|
|
||||||
error = copy_from_user(&swap_area, (void __user *)arg,
|
|
||||||
sizeof(struct resume_swap_area));
|
|
||||||
if (error) {
|
|
||||||
error = -EFAULT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* User space encodes device types as two-byte values,
|
|
||||||
* so we need to recode them
|
|
||||||
*/
|
|
||||||
swdev = new_decode_dev(swap_area.dev);
|
|
||||||
if (swdev) {
|
|
||||||
offset = swap_area.offset;
|
|
||||||
data->swap = swap_type_of(swdev, offset, NULL);
|
|
||||||
if (data->swap < 0)
|
|
||||||
error = -ENODEV;
|
|
||||||
} else {
|
|
||||||
data->swap = -1;
|
|
||||||
error = -EINVAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|||||||
Reference in New Issue
Block a user