--- 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 #include #include @@ -33,6 +34,7 @@ #include #include #include +#include #ifdef CONFIG_COMPRESS #include #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");