diff options
author | Johann Latocha | 2012-03-06 19:27:21 +0100 |
---|---|---|
committer | Johann Latocha | 2012-03-06 19:27:21 +0100 |
commit | 7358f2786564e9a9960779e23ae36a26313f9bf3 (patch) | |
tree | bd18bcddbcd4dccc51631ebcb8e706627392e2ce /src/server/utils.c | |
parent | [SERVER] Support device files as input (diff) | |
download | dnbd3-7358f2786564e9a9960779e23ae36a26313f9bf3.tar.gz dnbd3-7358f2786564e9a9960779e23ae36a26313f9bf3.tar.xz dnbd3-7358f2786564e9a9960779e23ae36a26313f9bf3.zip |
[SERVER] Cache images on hdd
Diffstat (limited to 'src/server/utils.c')
-rw-r--r-- | src/server/utils.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/server/utils.c b/src/server/utils.c index f2f5e35..54ebda9 100644 --- a/src/server/utils.c +++ b/src/server/utils.c @@ -22,6 +22,7 @@ #include <fcntl.h> #include <sys/stat.h> #include <pthread.h> +#include <string.h> #include "server.h" #include "utils.h" @@ -49,6 +50,7 @@ void dnbd3_load_config(char *file) _images[i].servers = g_key_file_get_string_list(gkf, groups[i], "servers", &_images[i].num_servers, NULL); _images[i].vid = g_key_file_get_integer(gkf, groups[i], "vid", NULL); _images[i].rid = g_key_file_get_integer(gkf, groups[i], "rid", NULL); + _images[i].cache_file = g_key_file_get_string(gkf, groups[i], "cache", NULL); _images[i].atime = 0; if (_images[i].num_servers > NUMBER_SERVERS) @@ -61,6 +63,30 @@ void dnbd3_load_config(char *file) printf("ERROR: Image not found: %s\n", _images[i].file); close(fd); + + if (_images[i].cache_file) + { + // read cache map from file + _images[i].cache_map = calloc(_images[i].filesize >> 15, sizeof(char)); + memset(_images[i].cache_map, 0, (_images[i].filesize >> 15) * sizeof(char)); + char tmp[strlen(_images[i].cache_file)+4]; + strcpy(tmp, _images[i].cache_file); + strcat(tmp, ".map"); + fd = open(tmp, O_RDONLY); + if (fd > 0) + read(fd, _images[i].cache_map, (_images[i].filesize >> 15) * sizeof(char)); + close(fd); + + // open cache file + fd = open(_images[i].cache_file, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); + if (fd < 1) + printf("ERROR: Could't create cache file\n"); + + if (_images[i].filesize != lseek(fd, 0, SEEK_END)) + fallocate(fd, 0, 0, _images[i].filesize); + + close(fd); + } } g_strfreev(groups); @@ -69,6 +95,7 @@ void dnbd3_load_config(char *file) void dnbd3_reload_config(char* config_file_name) { + int i, fd; pthread_spin_lock(&_spinlock); GSList *iterator = NULL; for (iterator = _dnbd3_clients; iterator; iterator = iterator->next) @@ -77,6 +104,24 @@ void dnbd3_reload_config(char* config_file_name) pthread_spin_lock(&client->spinlock); client->image = NULL; } + + // save cache maps + for (i = 0; i < _num_images; i++) + { + if (_images[i].cache_file) + { + char tmp[strlen(_images[i].cache_file)+4]; + strcpy(tmp, _images[i].cache_file); + strcat(tmp, ".map"); + fd = open(tmp, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); + + if (fd > 0) + write(fd, _images[i].cache_map, (_images[i].filesize >> 15) * sizeof(char)); + + close(fd); + } + } + _num_images = 0; free(_images); dnbd3_load_config(config_file_name); |