+static int copy_data_forward(int fd_old, int fd_new, size_t block_size, void *buf)
+{
+ ssize_t s1, s2;
+ int j;
+
+ log_err("Reencrypting [");
+ j = 0;
+ while (rnc.device_offset < rnc.device_size) {
+ s1 = read(fd_old, buf, block_size);
+ if (s1 < 0 || (s1 != block_size && (rnc.device_offset + s1) != rnc.device_size)) {
+ log_err("Read error, expecting %d, got %d.\n", (int)block_size, (int)s1);
+ return -EIO;
+ }
+ s2 = write(fd_new, buf, s1);
+ if (s2 < 0) {
+ log_err("Write error, expecting %d, got %d.\n", (int)block_size, (int)s2);
+ return -EIO;
+ }
+ rnc.device_offset += s1;
+ if (write_log() < 0) {
+ log_err("Log write error, some data are perhaps lost.\n");
+ return -EIO;
+ }
+
+ if (rnc.device_offset > (j * (rnc.device_size / 10))) {
+ log_err("-");
+ j++;
+ }
+ }
+ log_err("] Done.\n");
+
+ return 0;
+}
+
+static int copy_data_backward(int fd_old, int fd_new, size_t block_size, void *buf)
+{
+ ssize_t s1, s2, working_offset, working_block;
+ int j;
+
+ log_err("Reencrypting [");
+ j = 10;
+
+ while (rnc.device_offset) {
+ if (rnc.device_offset < block_size) {
+ working_offset = 0;
+ working_block = rnc.device_offset;
+ } else {
+ working_offset = rnc.device_offset - block_size;
+ working_block = block_size;
+ }
+
+ if (lseek(fd_old, working_offset, SEEK_SET) < 0 ||
+ lseek(fd_new, working_offset, SEEK_SET) < 0)
+ return -EIO;
+//log_err("off: %06d, size %06d\n", working_offset, block_size);
+
+ s1 = read(fd_old, buf, working_block);
+ if (s1 < 0 || (s1 != working_block)) {
+ log_err("Read error, expecting %d, got %d.\n", (int)block_size, (int)s1);
+ return -EIO;
+ }
+ s2 = write(fd_new, buf, working_block);
+ if (s2 < 0) {
+ log_err("Write error, expecting %d, got %d.\n", (int)block_size, (int)s2);
+ return -EIO;
+ }
+ rnc.device_offset -= s1;
+ if (write_log() < 0) {
+ log_err("Log write error, some data are perhaps lost.\n");
+ return -EIO;
+ }
+
+ if (rnc.device_offset < (j * (rnc.device_size / 10))) {
+ log_err("-");
+ j--;
+ }
+ }
+ log_err("] Done.\n");
+
+ return 0;
+}
+