]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - kernel/power/user.c
Hibernation: Introduce SNAPSHOT_GET_IMAGE_SIZE ioctl
[karo-tx-linux.git] / kernel / power / user.c
index bd0723a7df3f99cf811834f9cc1d107202d46947..88aac26e598acd3afb536fd59d80ffe128e573f6 100644 (file)
@@ -133,7 +133,7 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
 {
        int error = 0;
        struct snapshot_data *data;
-       loff_t avail;
+       loff_t size;
        sector_t offset;
 
        if (_IOC_TYPE(cmd) != SNAPSHOT_IOC_MAGIC)
@@ -153,6 +153,10 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
                mutex_lock(&pm_mutex);
                error = pm_notifier_call_chain(PM_HIBERNATION_PREPARE);
                if (!error) {
+                       printk("Syncing filesystems ... ");
+                       sys_sync();
+                       printk("done.\n");
+
                        error = freeze_processes();
                        if (error)
                                thaw_processes();
@@ -206,10 +210,20 @@ static int snapshot_ioctl(struct inode *inode, struct file *filp,
                image_size = arg;
                break;
 
+       case SNAPSHOT_GET_IMAGE_SIZE:
+               if (!data->ready) {
+                       error = -ENODATA;
+                       break;
+               }
+               size = snapshot_get_image_size();
+               size <<= PAGE_SHIFT;
+               error = put_user(size, (loff_t __user *)arg);
+               break;
+
        case SNAPSHOT_AVAIL_SWAP:
-               avail = count_swap_pages(data->swap, 1);
-               avail <<= PAGE_SHIFT;
-               error = put_user(avail, (loff_t __user *)arg);
+               size = count_swap_pages(data->swap, 1);
+               size <<= PAGE_SHIFT;
+               error = put_user(size, (loff_t __user *)arg);
                break;
 
        case SNAPSHOT_GET_SWAP_PAGE: