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");