Beispiel #1
0
/*
 * 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;
}
Beispiel #2
0
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);
}