All pastes #393789 Raw Edit

Something

public text v1 · immutable
·published 2007-03-13 21:12 UTC
rendered paste body
--- suspend.c   2006-11-07 22:13:33.000000000 +0100
+++ ../../suspend-0.5/suspend.c 2007-03-13 21:50:13.000000000 +0100
@@ -10,7 +10,8 @@
  */

 #define _LARGEFILE64_SOURCE
-
+//#define O_DIRECT 040000
+#define O_DIRECT 0
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
@@ -33,6 +34,7 @@
 #include <signal.h>
 #include <termios.h>
 #include <getopt.h>
+#include <aio.h>
 #ifdef CONFIG_COMPRESS
 #include <lzf.h>
 #else
@@ -83,6 +85,8 @@
 static struct vt_mode orig_vtm;
 static int vfd;

+static struct aiocb acb;
+
 static struct config_par parameters[PARAM_NO] = {
        {
                .name = "snapshot device",
@@ -220,11 +224,12 @@
  *     @size:          The number of bytes to save
  */

-static int write_area(int fd, void *buf, loff_t offset, unsigned int size)
+static int write_area(int fd, void *buf, loff_t offset, unsigned int size, void *aiob)
 {
        int res = -EINVAL;
-       ssize_t cnt = 0;

+       ssize_t cnt = 0;
+/*
        if (offset) {
                if (lseek64(fd, offset, SEEK_SET) == offset)
                        cnt = write(fd, buf, size);
@@ -233,7 +238,19 @@
                else
                        res = cnt < 0 ? cnt : -EIO;
        }
-       return res;
+       return res;*/
+       while(aio_error(&acb) == EINPROGRESS) {
+       //      struct aiocb * list[1] = {&acb};
+       //      aio_suspend(list,1,NULL);
+       };
+       memcpy(aiob,buf,size);
+       memset(&acb,0,sizeof(struct aiocb));
+       acb.aio_fildes = fd;
+       acb.aio_buf  = aiob;
+       acb.aio_nbytes = size;
+       acb.aio_offset = offset;
+       aio_write(&acb);
+       return 0; /* HACK */
 }

 /*
@@ -244,6 +261,7 @@
 struct swap_map_handle {
        char *page_buffer;
        char *write_buffer;
+       char *aio_buffer;
        struct swap_area *areas;
        unsigned short areas_per_page;
        loff_t *next_swap;
@@ -269,8 +287,9 @@
        handle->next_swap = (loff_t *)(handle->areas + handle->areas_per_page);
        handle->page_buffer = (char *)buf + page_size;
        handle->write_buffer = handle->page_buffer + page_size;
+       handle->aio_buffer = handle->write_buffer + buffer_size;
 #ifdef CONFIG_ENCRYPT
-       handle->encrypt_buffer = (unsigned char *)(handle->write_buffer +
+       handle->encrypt_buffer = (unsigned char *)(handle->aio_buffer +
                                buffer_size);
 #endif
        memset(handle->areas, 0, page_size);
@@ -349,7 +368,7 @@
 #endif
        if (!error)
                error = write_area(handle->fd, src, handle->cur_area.offset,
-                               handle->cur_area.size);
+                               handle->cur_area.size,handle->aio_buffer);
        if (error)
                return error;
        handle->areas[handle->k].offset = handle->cur_area.offset;
@@ -409,7 +428,7 @@
                        return -ENOSPC;
                *handle->next_swap = offset;
                error = write_area(handle->fd, handle->areas, handle->cur_swap,
-                               page_size);
+                               page_size,handle->aio_buffer);
                if (error)
                        return error;
                memset(handle->areas, 0, page_size);
@@ -431,7 +450,7 @@
        if (!error)
                /* Save the last swap map page */
                error = write_area(handle->fd, handle->areas, handle->cur_swap,
-                               page_size);
+                               page_size,handle->aio_buffer);

        return error;
 }
@@ -663,7 +682,7 @@
                header->writeout_time = end.tv_usec / 1000000.0 + end.tv_sec;
        }
        if (!error)
-               error = write_area(resume_fd, header, start, page_size);
+               error = write_area(resume_fd, header, start, page_size,handle.aio_buffer);
        if (!error) {
                if (compress) {
                        double delta = header->size - compr_diff;
@@ -674,6 +693,10 @@
                printf( "S" );
                error = mark_swap(resume_fd, start);
        }
+       while(aio_error(&acb) == EINPROGRESS) {
+//                             struct aiocb * list[1] = {&acb};
+//                                             aio_suspend(list,1,NULL);
+                                                       };
        fsync(resume_fd);
        if (!error)
                printf( "|" );
@@ -1296,7 +1319,7 @@
        page_size = getpagesize();
        buffer_size = BUFFER_PAGES * page_size;

-       mem_size = 3 * page_size + buffer_size;
+       mem_size = 3 * page_size + 2*buffer_size;
 #ifdef CONFIG_ENCRYPT
        if (encrypt)
                mem_size += buffer_size;
@@ -1367,7 +1390,7 @@
                        chroot_path, "resume");
                goto Umount;
        }
-       resume_fd = open("resume", O_RDWR);
+       resume_fd = open("resume", O_RDWR | O_DIRECT);
        if (resume_fd < 0) {
                ret = errno;
                fprintf(stderr, "suspend: Could not open the resume device\n");