static int get_trunk_sha1(uint32_t epoch, unsigned char *outsha1) { int i, nr_logs = -1, ret = -1; struct snap_log *log_buf, *log_free = NULL; void *snap_buf = NULL; struct sha1_file_hdr hdr; log_free = log_buf = snap_log_read(&nr_logs); sd_dprintf("%d", nr_logs); if (nr_logs < 0) goto out; for (i = 0; i < nr_logs; i++, log_buf++) { if (log_buf->epoch != epoch) continue; snap_buf = snap_file_read(log_buf->sha1, &hdr); if (!snap_buf) goto out; memcpy(outsha1, snap_buf, SHA1_LEN); ret = 0; break; } out: free(log_free); free(snap_buf); return ret; }
static int farm_snapshot(struct siocb *iocb) { unsigned char snap_sha1[SHA1_LEN]; unsigned char trunk_sha1[SHA1_LEN]; void *buffer; int log_nr, ret = SD_RES_EIO, epoch; buffer = snap_log_read(&log_nr, 1); if (!buffer) goto out; epoch = log_nr + 1; dprintf("user epoch %d\n", epoch); if (trunk_file_write(trunk_sha1, 1) < 0) goto out; if (snap_file_write(epoch, trunk_sha1, snap_sha1, 1) < 0) goto out; if (snap_log_write(epoch, snap_sha1, 1) < 0) goto out; ret = SD_RES_SUCCESS; out: free(buffer); return ret; }
static int farm_snapshot(const struct siocb *iocb) { unsigned char snap_sha1[SHA1_LEN]; unsigned char trunk_sha1[SHA1_LEN]; struct sd_node nodes[SD_MAX_NODES]; int nr_nodes; void *buffer; int log_nr, ret = SD_RES_EIO, epoch; buffer = snap_log_read(&log_nr); if (!buffer) goto out; epoch = log_nr + 1; sd_dprintf("user epoch %d", epoch); nr_nodes = epoch_log_read(sys->epoch, nodes, sizeof(nodes)); if (nr_nodes < 0) goto out; if (trunk_file_write(trunk_sha1) < 0) goto out; if (snap_file_write(sys->epoch, nodes, nr_nodes, trunk_sha1, snap_sha1) < 0) goto out; if (snap_log_write(epoch, snap_sha1) < 0) goto out; ret = SD_RES_SUCCESS; out: free(buffer); return ret; }
static int farm_cleanup_sys_obj(struct siocb *iocb) { int i, ret = SD_RES_SUCCESS; int epoch = iocb->epoch; struct snap_log *log_pos, *log_free = NULL; int nr_logs; if (iocb->epoch <= 0) return ret; for (i = 1; i <= epoch; i++) cleanup_trunk(i); log_free = log_pos = snap_log_read(&nr_logs, 0); if (snap_log_truncate() < 0) { dprintf("snap reset fail\n"); ret = SD_RES_EIO; goto out; } for (i = epoch + 1; i < nr_logs; i++, log_pos++) { if (snap_log_write(log_pos->epoch, log_pos->sha1, 0) < 0) { dprintf("snap write fail %d, %s\n", log_pos->epoch, sha1_to_hex(log_pos->sha1)); ret = SD_RES_EIO; goto out; } } out: free(log_free); return ret; }
static int farm_get_snap_file(struct siocb *iocb) { int ret = SD_RES_EIO; void *buffer = NULL; size_t size; int nr; sd_dprintf("try get snap file"); buffer = snap_log_read(&nr); if (!buffer) goto out; size = nr * sizeof(struct snap_log); memcpy(iocb->buf, buffer, size); iocb->length = size; ret = SD_RES_SUCCESS; out: free(buffer); return ret; }