diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-09 02:17:32 -0500 |
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-03-09 02:17:32 -0500 |
| commit | ce67eef6a112bb283c6db39f9195800f31f5599a (patch) | |
| tree | 34f2e7fbd0b9838abba482dbb1a7db09e6fbb53c /kernel/power | |
| parent | 776943fd6f104a6e8457dc95a17282e69e963666 (diff) | |
| parent | 57d54889cd00db2752994b389ba714138652e60c (diff) | |
Merge commit 'v2.6.34-rc1' into for-linus
Diffstat (limited to 'kernel/power')
| -rw-r--r-- | kernel/power/Kconfig | 19 | ||||
| -rw-r--r-- | kernel/power/hibernate.c | 9 | ||||
| -rw-r--r-- | kernel/power/main.c | 31 | ||||
| -rw-r--r-- | kernel/power/snapshot.c | 4 | ||||
| -rw-r--r-- | kernel/power/suspend.c | 3 | ||||
| -rw-r--r-- | kernel/power/swap.c | 4 | ||||
| -rw-r--r-- | kernel/power/swsusp.c | 58 | ||||
| -rw-r--r-- | kernel/power/user.c | 23 |
8 files changed, 82 insertions, 69 deletions
diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index 91e09d3b2eb2..5c36ea9d55d2 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig | |||
| @@ -27,6 +27,15 @@ config PM_DEBUG | |||
| 27 | code. This is helpful when debugging and reporting PM bugs, like | 27 | code. This is helpful when debugging and reporting PM bugs, like |
| 28 | suspend support. | 28 | suspend support. |
| 29 | 29 | ||
| 30 | config PM_ADVANCED_DEBUG | ||
| 31 | bool "Extra PM attributes in sysfs for low-level debugging/testing" | ||
| 32 | depends on PM_DEBUG | ||
| 33 | default n | ||
| 34 | ---help--- | ||
| 35 | Add extra sysfs attributes allowing one to access some Power Management | ||
| 36 | fields of device objects from user space. If you are not a kernel | ||
| 37 | developer interested in debugging/testing Power Management, say "no". | ||
| 38 | |||
| 30 | config PM_VERBOSE | 39 | config PM_VERBOSE |
| 31 | bool "Verbose Power Management debugging" | 40 | bool "Verbose Power Management debugging" |
| 32 | depends on PM_DEBUG | 41 | depends on PM_DEBUG |
| @@ -85,6 +94,11 @@ config PM_SLEEP | |||
| 85 | depends on SUSPEND || HIBERNATION || XEN_SAVE_RESTORE | 94 | depends on SUSPEND || HIBERNATION || XEN_SAVE_RESTORE |
| 86 | default y | 95 | default y |
| 87 | 96 | ||
| 97 | config PM_SLEEP_ADVANCED_DEBUG | ||
| 98 | bool | ||
| 99 | depends on PM_ADVANCED_DEBUG | ||
| 100 | default n | ||
| 101 | |||
| 88 | config SUSPEND | 102 | config SUSPEND |
| 89 | bool "Suspend to RAM and standby" | 103 | bool "Suspend to RAM and standby" |
| 90 | depends on PM && ARCH_SUSPEND_POSSIBLE | 104 | depends on PM && ARCH_SUSPEND_POSSIBLE |
| @@ -222,3 +236,8 @@ config PM_RUNTIME | |||
| 222 | and the bus type drivers of the buses the devices are on are | 236 | and the bus type drivers of the buses the devices are on are |
| 223 | responsible for the actual handling of the autosuspend requests and | 237 | responsible for the actual handling of the autosuspend requests and |
| 224 | wake-up events. | 238 | wake-up events. |
| 239 | |||
| 240 | config PM_OPS | ||
| 241 | bool | ||
| 242 | depends on PM_SLEEP || PM_RUNTIME | ||
| 243 | default y | ||
diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index bbfe472d7524..da5288ec2392 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c | |||
| @@ -323,6 +323,7 @@ static int create_image(int platform_mode) | |||
| 323 | int hibernation_snapshot(int platform_mode) | 323 | int hibernation_snapshot(int platform_mode) |
| 324 | { | 324 | { |
| 325 | int error; | 325 | int error; |
| 326 | gfp_t saved_mask; | ||
| 326 | 327 | ||
| 327 | error = platform_begin(platform_mode); | 328 | error = platform_begin(platform_mode); |
| 328 | if (error) | 329 | if (error) |
| @@ -334,6 +335,7 @@ int hibernation_snapshot(int platform_mode) | |||
| 334 | goto Close; | 335 | goto Close; |
| 335 | 336 | ||
| 336 | suspend_console(); | 337 | suspend_console(); |
| 338 | saved_mask = clear_gfp_allowed_mask(GFP_IOFS); | ||
| 337 | error = dpm_suspend_start(PMSG_FREEZE); | 339 | error = dpm_suspend_start(PMSG_FREEZE); |
| 338 | if (error) | 340 | if (error) |
| 339 | goto Recover_platform; | 341 | goto Recover_platform; |
| @@ -351,6 +353,7 @@ int hibernation_snapshot(int platform_mode) | |||
| 351 | 353 | ||
| 352 | dpm_resume_end(in_suspend ? | 354 | dpm_resume_end(in_suspend ? |
| 353 | (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE); | 355 | (error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE); |
| 356 | set_gfp_allowed_mask(saved_mask); | ||
| 354 | resume_console(); | 357 | resume_console(); |
| 355 | Close: | 358 | Close: |
| 356 | platform_end(platform_mode); | 359 | platform_end(platform_mode); |
| @@ -445,14 +448,17 @@ static int resume_target_kernel(bool platform_mode) | |||
| 445 | int hibernation_restore(int platform_mode) | 448 | int hibernation_restore(int platform_mode) |
| 446 | { | 449 | { |
| 447 | int error; | 450 | int error; |
| 451 | gfp_t saved_mask; | ||
| 448 | 452 | ||
| 449 | pm_prepare_console(); | 453 | pm_prepare_console(); |
| 450 | suspend_console(); | 454 | suspend_console(); |
| 455 | saved_mask = clear_gfp_allowed_mask(GFP_IOFS); | ||
| 451 | error = dpm_suspend_start(PMSG_QUIESCE); | 456 | error = dpm_suspend_start(PMSG_QUIESCE); |
| 452 | if (!error) { | 457 | if (!error) { |
| 453 | error = resume_target_kernel(platform_mode); | 458 | error = resume_target_kernel(platform_mode); |
| 454 | dpm_resume_end(PMSG_RECOVER); | 459 | dpm_resume_end(PMSG_RECOVER); |
| 455 | } | 460 | } |
| 461 | set_gfp_allowed_mask(saved_mask); | ||
| 456 | resume_console(); | 462 | resume_console(); |
| 457 | pm_restore_console(); | 463 | pm_restore_console(); |
| 458 | return error; | 464 | return error; |
| @@ -466,6 +472,7 @@ int hibernation_restore(int platform_mode) | |||
| 466 | int hibernation_platform_enter(void) | 472 | int hibernation_platform_enter(void) |
| 467 | { | 473 | { |
| 468 | int error; | 474 | int error; |
| 475 | gfp_t saved_mask; | ||
| 469 | 476 | ||
| 470 | if (!hibernation_ops) | 477 | if (!hibernation_ops) |
| 471 | return -ENOSYS; | 478 | return -ENOSYS; |
| @@ -481,6 +488,7 @@ int hibernation_platform_enter(void) | |||
| 481 | 488 | ||
| 482 | entering_platform_hibernation = true; | 489 | entering_platform_hibernation = true; |
| 483 | suspend_console(); | 490 | suspend_console(); |
| 491 | saved_mask = clear_gfp_allowed_mask(GFP_IOFS); | ||
| 484 | error = dpm_suspend_start(PMSG_HIBERNATE); | 492 | error = dpm_suspend_start(PMSG_HIBERNATE); |
| 485 | if (error) { | 493 | if (error) { |
| 486 | if (hibernation_ops->recover) | 494 | if (hibernation_ops->recover) |
| @@ -518,6 +526,7 @@ int hibernation_platform_enter(void) | |||
| 518 | Resume_devices: | 526 | Resume_devices: |
| 519 | entering_platform_hibernation = false; | 527 | entering_platform_hibernation = false; |
| 520 | dpm_resume_end(PMSG_RESTORE); | 528 | dpm_resume_end(PMSG_RESTORE); |
| 529 | set_gfp_allowed_mask(saved_mask); | ||
| 521 | resume_console(); | 530 | resume_console(); |
| 522 | 531 | ||
| 523 | Close: | 532 | Close: |
diff --git a/kernel/power/main.c b/kernel/power/main.c index 0998c7139053..b58800b21fc0 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c | |||
| @@ -44,6 +44,32 @@ int pm_notifier_call_chain(unsigned long val) | |||
| 44 | == NOTIFY_BAD) ? -EINVAL : 0; | 44 | == NOTIFY_BAD) ? -EINVAL : 0; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | /* If set, devices may be suspended and resumed asynchronously. */ | ||
| 48 | int pm_async_enabled = 1; | ||
| 49 | |||
| 50 | static ssize_t pm_async_show(struct kobject *kobj, struct kobj_attribute *attr, | ||
| 51 | char *buf) | ||
| 52 | { | ||
| 53 | return sprintf(buf, "%d\n", pm_async_enabled); | ||
| 54 | } | ||
| 55 | |||
| 56 | static ssize_t pm_async_store(struct kobject *kobj, struct kobj_attribute *attr, | ||
| 57 | const char *buf, size_t n) | ||
| 58 | { | ||
| 59 | unsigned long val; | ||
| 60 | |||
| 61 | if (strict_strtoul(buf, 10, &val)) | ||
| 62 | return -EINVAL; | ||
| 63 | |||
| 64 | if (val > 1) | ||
| 65 | return -EINVAL; | ||
| 66 | |||
| 67 | pm_async_enabled = val; | ||
| 68 | return n; | ||
| 69 | } | ||
| 70 | |||
| 71 | power_attr(pm_async); | ||
| 72 | |||
| 47 | #ifdef CONFIG_PM_DEBUG | 73 | #ifdef CONFIG_PM_DEBUG |
| 48 | int pm_test_level = TEST_NONE; | 74 | int pm_test_level = TEST_NONE; |
| 49 | 75 | ||
| @@ -208,9 +234,12 @@ static struct attribute * g[] = { | |||
| 208 | #ifdef CONFIG_PM_TRACE | 234 | #ifdef CONFIG_PM_TRACE |
| 209 | &pm_trace_attr.attr, | 235 | &pm_trace_attr.attr, |
| 210 | #endif | 236 | #endif |
| 211 | #if defined(CONFIG_PM_SLEEP) && defined(CONFIG_PM_DEBUG) | 237 | #ifdef CONFIG_PM_SLEEP |
| 238 | &pm_async_attr.attr, | ||
| 239 | #ifdef CONFIG_PM_DEBUG | ||
| 212 | &pm_test_attr.attr, | 240 | &pm_test_attr.attr, |
| 213 | #endif | 241 | #endif |
| 242 | #endif | ||
| 214 | NULL, | 243 | NULL, |
| 215 | }; | 244 | }; |
| 216 | 245 | ||
diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c index 36cb168e4330..830cadecbdfc 100644 --- a/kernel/power/snapshot.c +++ b/kernel/power/snapshot.c | |||
| @@ -1181,7 +1181,7 @@ static void free_unnecessary_pages(void) | |||
| 1181 | 1181 | ||
| 1182 | memory_bm_position_reset(©_bm); | 1182 | memory_bm_position_reset(©_bm); |
| 1183 | 1183 | ||
| 1184 | while (to_free_normal > 0 && to_free_highmem > 0) { | 1184 | while (to_free_normal > 0 || to_free_highmem > 0) { |
| 1185 | unsigned long pfn = memory_bm_next_pfn(©_bm); | 1185 | unsigned long pfn = memory_bm_next_pfn(©_bm); |
| 1186 | struct page *page = pfn_to_page(pfn); | 1186 | struct page *page = pfn_to_page(pfn); |
| 1187 | 1187 | ||
| @@ -1500,7 +1500,7 @@ asmlinkage int swsusp_save(void) | |||
| 1500 | { | 1500 | { |
| 1501 | unsigned int nr_pages, nr_highmem; | 1501 | unsigned int nr_pages, nr_highmem; |
| 1502 | 1502 | ||
| 1503 | printk(KERN_INFO "PM: Creating hibernation image: \n"); | 1503 | printk(KERN_INFO "PM: Creating hibernation image:\n"); |
| 1504 | 1504 | ||
| 1505 | drain_local_pages(NULL); | 1505 | drain_local_pages(NULL); |
| 1506 | nr_pages = count_data_pages(); | 1506 | nr_pages = count_data_pages(); |
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 6f10dfc2d3e9..44cce10b582d 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c | |||
| @@ -189,6 +189,7 @@ static int suspend_enter(suspend_state_t state) | |||
| 189 | int suspend_devices_and_enter(suspend_state_t state) | 189 | int suspend_devices_and_enter(suspend_state_t state) |
| 190 | { | 190 | { |
| 191 | int error; | 191 | int error; |
| 192 | gfp_t saved_mask; | ||
| 192 | 193 | ||
| 193 | if (!suspend_ops) | 194 | if (!suspend_ops) |
| 194 | return -ENOSYS; | 195 | return -ENOSYS; |
| @@ -199,6 +200,7 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
| 199 | goto Close; | 200 | goto Close; |
| 200 | } | 201 | } |
| 201 | suspend_console(); | 202 | suspend_console(); |
| 203 | saved_mask = clear_gfp_allowed_mask(GFP_IOFS); | ||
| 202 | suspend_test_start(); | 204 | suspend_test_start(); |
| 203 | error = dpm_suspend_start(PMSG_SUSPEND); | 205 | error = dpm_suspend_start(PMSG_SUSPEND); |
| 204 | if (error) { | 206 | if (error) { |
| @@ -215,6 +217,7 @@ int suspend_devices_and_enter(suspend_state_t state) | |||
| 215 | suspend_test_start(); | 217 | suspend_test_start(); |
| 216 | dpm_resume_end(PMSG_RESUME); | 218 | dpm_resume_end(PMSG_RESUME); |
| 217 | suspend_test_finish("resume devices"); | 219 | suspend_test_finish("resume devices"); |
| 220 | set_gfp_allowed_mask(saved_mask); | ||
| 218 | resume_console(); | 221 | resume_console(); |
| 219 | Close: | 222 | Close: |
| 220 | if (suspend_ops->end) | 223 | if (suspend_ops->end) |
diff --git a/kernel/power/swap.c b/kernel/power/swap.c index 09b2b0ae9e9d..1d575733d4e1 100644 --- a/kernel/power/swap.c +++ b/kernel/power/swap.c | |||
| @@ -657,10 +657,6 @@ int swsusp_read(unsigned int *flags_p) | |||
| 657 | struct swsusp_info *header; | 657 | struct swsusp_info *header; |
| 658 | 658 | ||
| 659 | *flags_p = swsusp_header->flags; | 659 | *flags_p = swsusp_header->flags; |
| 660 | if (IS_ERR(resume_bdev)) { | ||
| 661 | pr_debug("PM: Image device not initialised\n"); | ||
| 662 | return PTR_ERR(resume_bdev); | ||
| 663 | } | ||
| 664 | 660 | ||
| 665 | memset(&snapshot, 0, sizeof(struct snapshot_handle)); | 661 | memset(&snapshot, 0, sizeof(struct snapshot_handle)); |
| 666 | error = snapshot_write_next(&snapshot, PAGE_SIZE); | 662 | error = snapshot_write_next(&snapshot, PAGE_SIZE); |
diff --git a/kernel/power/swsusp.c b/kernel/power/swsusp.c deleted file mode 100644 index 5b3601bd1893..000000000000 --- a/kernel/power/swsusp.c +++ /dev/null | |||
| @@ -1,58 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * linux/kernel/power/swsusp.c | ||
| 3 | * | ||
| 4 | * This file provides code to write suspend image to swap and read it back. | ||
| 5 | * | ||
| 6 | * Copyright (C) 1998-2001 Gabor Kuti <seasons@fornax.hu> | ||
| 7 | * Copyright (C) 1998,2001-2005 Pavel Machek <pavel@suse.cz> | ||
| 8 | * | ||
| 9 | * This file is released under the GPLv2. | ||
| 10 | * | ||
| 11 | * I'd like to thank the following people for their work: | ||
| 12 | * | ||
| 13 | * Pavel Machek <pavel@ucw.cz>: | ||
| 14 | * Modifications, defectiveness pointing, being with me at the very beginning, | ||
| 15 | * suspend to swap space, stop all tasks. Port to 2.4.18-ac and 2.5.17. | ||
| 16 | * | ||
| 17 | * Steve Doddi <dirk@loth.demon.co.uk>: | ||
| 18 | * Support the possibility of hardware state restoring. | ||
| 19 | * | ||
| 20 | * Raph <grey.havens@earthling.net>: | ||
| 21 | * Support for preserving states of network devices and virtual console | ||
| 22 | * (including X and svgatextmode) | ||
| 23 | * | ||
| 24 | * Kurt Garloff <garloff@suse.de>: | ||
| 25 | * Straightened the critical function in order to prevent compilers from | ||
| 26 | * playing tricks with local variables. | ||
| 27 | * | ||
| 28 | * Andreas Mohr <a.mohr@mailto.de> | ||
| 29 | * | ||
| 30 | * Alex Badea <vampire@go.ro>: | ||
| 31 | * Fixed runaway init | ||
| 32 | * | ||
| 33 | * Rafael J. Wysocki <rjw@sisk.pl> | ||
| 34 | * Reworked the freeing of memory and the handling of swap | ||
| 35 | * | ||
| 36 | * More state savers are welcome. Especially for the scsi layer... | ||
| 37 | * | ||
| 38 | * For TODOs,FIXMEs also look in Documentation/power/swsusp.txt | ||
| 39 | */ | ||
| 40 | |||
| 41 | #include <linux/mm.h> | ||
| 42 | #include <linux/suspend.h> | ||
| 43 | #include <linux/spinlock.h> | ||
| 44 | #include <linux/kernel.h> | ||
| 45 | #include <linux/major.h> | ||
| 46 | #include <linux/swap.h> | ||
| 47 | #include <linux/pm.h> | ||
| 48 | #include <linux/swapops.h> | ||
| 49 | #include <linux/bootmem.h> | ||
| 50 | #include <linux/syscalls.h> | ||
| 51 | #include <linux/highmem.h> | ||
| 52 | #include <linux/time.h> | ||
| 53 | #include <linux/rbtree.h> | ||
| 54 | #include <linux/io.h> | ||
| 55 | |||
| 56 | #include "power.h" | ||
| 57 | |||
| 58 | int in_suspend __nosavedata = 0; | ||
diff --git a/kernel/power/user.c b/kernel/power/user.c index bf0014d6a5f0..4d2289626a84 100644 --- a/kernel/power/user.c +++ b/kernel/power/user.c | |||
| @@ -195,6 +195,15 @@ static ssize_t snapshot_write(struct file *filp, const char __user *buf, | |||
| 195 | return res; | 195 | return res; |
| 196 | } | 196 | } |
| 197 | 197 | ||
| 198 | static void snapshot_deprecated_ioctl(unsigned int cmd) | ||
| 199 | { | ||
| 200 | if (printk_ratelimit()) | ||
| 201 | printk(KERN_NOTICE "%pf: ioctl '%.8x' is deprecated and will " | ||
| 202 | "be removed soon, update your suspend-to-disk " | ||
| 203 | "utilities\n", | ||
| 204 | __builtin_return_address(0), cmd); | ||
| 205 | } | ||
| 206 | |||
| 198 | static long snapshot_ioctl(struct file *filp, unsigned int cmd, | 207 | static long snapshot_ioctl(struct file *filp, unsigned int cmd, |
| 199 | unsigned long arg) | 208 | unsigned long arg) |
| 200 | { | 209 | { |
| @@ -246,8 +255,9 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 246 | data->frozen = 0; | 255 | data->frozen = 0; |
| 247 | break; | 256 | break; |
| 248 | 257 | ||
| 249 | case SNAPSHOT_CREATE_IMAGE: | ||
| 250 | case SNAPSHOT_ATOMIC_SNAPSHOT: | 258 | case SNAPSHOT_ATOMIC_SNAPSHOT: |
| 259 | snapshot_deprecated_ioctl(cmd); | ||
| 260 | case SNAPSHOT_CREATE_IMAGE: | ||
| 251 | if (data->mode != O_RDONLY || !data->frozen || data->ready) { | 261 | if (data->mode != O_RDONLY || !data->frozen || data->ready) { |
| 252 | error = -EPERM; | 262 | error = -EPERM; |
| 253 | break; | 263 | break; |
| @@ -275,8 +285,9 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 275 | data->ready = 0; | 285 | data->ready = 0; |
| 276 | break; | 286 | break; |
| 277 | 287 | ||
| 278 | case SNAPSHOT_PREF_IMAGE_SIZE: | ||
| 279 | case SNAPSHOT_SET_IMAGE_SIZE: | 288 | case SNAPSHOT_SET_IMAGE_SIZE: |
| 289 | snapshot_deprecated_ioctl(cmd); | ||
| 290 | case SNAPSHOT_PREF_IMAGE_SIZE: | ||
| 280 | image_size = arg; | 291 | image_size = arg; |
| 281 | break; | 292 | break; |
| 282 | 293 | ||
| @@ -290,15 +301,17 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 290 | error = put_user(size, (loff_t __user *)arg); | 301 | error = put_user(size, (loff_t __user *)arg); |
| 291 | break; | 302 | break; |
| 292 | 303 | ||
| 293 | case SNAPSHOT_AVAIL_SWAP_SIZE: | ||
| 294 | case SNAPSHOT_AVAIL_SWAP: | 304 | case SNAPSHOT_AVAIL_SWAP: |
| 305 | snapshot_deprecated_ioctl(cmd); | ||
| 306 | case SNAPSHOT_AVAIL_SWAP_SIZE: | ||
| 295 | size = count_swap_pages(data->swap, 1); | 307 | size = count_swap_pages(data->swap, 1); |
| 296 | size <<= PAGE_SHIFT; | 308 | size <<= PAGE_SHIFT; |
| 297 | error = put_user(size, (loff_t __user *)arg); | 309 | error = put_user(size, (loff_t __user *)arg); |
| 298 | break; | 310 | break; |
| 299 | 311 | ||
| 300 | case SNAPSHOT_ALLOC_SWAP_PAGE: | ||
| 301 | case SNAPSHOT_GET_SWAP_PAGE: | 312 | case SNAPSHOT_GET_SWAP_PAGE: |
| 313 | snapshot_deprecated_ioctl(cmd); | ||
| 314 | case SNAPSHOT_ALLOC_SWAP_PAGE: | ||
| 302 | if (data->swap < 0 || data->swap >= MAX_SWAPFILES) { | 315 | if (data->swap < 0 || data->swap >= MAX_SWAPFILES) { |
| 303 | error = -ENODEV; | 316 | error = -ENODEV; |
| 304 | break; | 317 | break; |
| @@ -321,6 +334,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 321 | break; | 334 | break; |
| 322 | 335 | ||
| 323 | case SNAPSHOT_SET_SWAP_FILE: /* This ioctl is deprecated */ | 336 | case SNAPSHOT_SET_SWAP_FILE: /* This ioctl is deprecated */ |
| 337 | snapshot_deprecated_ioctl(cmd); | ||
| 324 | if (!swsusp_swap_in_use()) { | 338 | if (!swsusp_swap_in_use()) { |
| 325 | /* | 339 | /* |
| 326 | * User space encodes device types as two-byte values, | 340 | * User space encodes device types as two-byte values, |
| @@ -362,6 +376,7 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd, | |||
| 362 | break; | 376 | break; |
| 363 | 377 | ||
| 364 | case SNAPSHOT_PMOPS: /* This ioctl is deprecated */ | 378 | case SNAPSHOT_PMOPS: /* This ioctl is deprecated */ |
| 379 | snapshot_deprecated_ioctl(cmd); | ||
| 365 | error = -EINVAL; | 380 | error = -EINVAL; |
| 366 | 381 | ||
| 367 | switch (arg) { | 382 | switch (arg) { |
