/* * Copy dump using mmap (copy HSA first) */ static int copy_dump(const char *in, const char *out, unsigned long offset) { struct copy_table_entry table[COPY_TABLE_ENTRY_COUNT]; char busy_str[] = "zfcpdump busy"; int fdout, fdin, i, rc = -1; fdin = open(in, O_RDONLY); if (fdin < 0) { PRINT_ERR("Open %s failed\n", in); return -1; } g.vmcore_size = lseek(fdin, (off_t) 0, SEEK_END); lseek(fdin, 0L, SEEK_SET); if (g.vmcore_size > dump_sb.dump_size) { PRINT_ERR("Disk too small: dump=%lldMB (diskspace=%lldMB)\n", TO_MIB(g.vmcore_size), TO_MIB(dump_sb.dump_size)); goto out_close_fdin; } fdout = open(out, O_WRONLY); if (fdout < 0) { PRINT_ERR("Open %s failed\n", out); goto out_close_fdin; } /* Overwrite old header */ if (lseek(fdout, offset, SEEK_SET) < 0) goto out_close_fdin; if (write(fdout, busy_str, sizeof(busy_str)) == -1) goto out_close_fdin; if (csum_update(fdout)) goto out_close_fdin; if (copy_table_init(fdin, table)) goto out_close_fdin; show_progress(0); for (i = 0; i < COPY_TABLE_ENTRY_COUNT; i++) { if (copy_table_entry_write(fdin, fdout, &table[i], offset)) goto out_close_fdout; if (i == 0) /* 0 is the HSA */ release_hsa(); } rc = 0; out_close_fdout: if (csum_update(fdout)) rc = -1; fsync(fdout); close(fdout); out_close_fdin: close(fdin); return rc; }
static void nkfs_btree_node_calc_sum(struct nkfs_btree_node *node, struct csum *sum, int write) { struct csum_ctx ctx; struct nkfs_btree_header_page *header; int i; header = page_address(node->header); KLOG(KL_DBG3, "node %llu leaf %d nr_keys %d sig1 %x sig2 %x", node->block, header->leaf, header->nr_keys, header->sig1, header->sig2); csum_reset(&ctx); KLOG_BUF_SUM(KL_DBG3, page_address(node->header), offsetof(struct nkfs_btree_header_page, sum)); csum_update(&ctx, page_address(node->header), offsetof(struct nkfs_btree_header_page, sum)); for (i = 0; i < ARRAY_SIZE(node->keys); i++) { csum_update(&ctx, page_address(node->keys[i]), PAGE_SIZE); KLOG_BUF_SUM(KL_DBG3, page_address(node->keys[i]), PAGE_SIZE); } for (i = 0; i < ARRAY_SIZE(node->childs); i++) { csum_update(&ctx, page_address(node->childs[i]), PAGE_SIZE); KLOG_BUF_SUM(KL_DBG3, page_address(node->childs[i]), PAGE_SIZE); } for (i = 0; i < ARRAY_SIZE(node->values); i++) { csum_update(&ctx, page_address(node->values[i]), PAGE_SIZE); KLOG_BUF_SUM(KL_DBG3, page_address(node->values[i]), PAGE_SIZE); } csum_digest(&ctx, sum); KLOG(KL_DBG3, "node block %llu sum %llx write %d nr_keys %d leaf %d", node->block, csum_u64(sum), write, node->nr_keys, node->leaf); }