15e5c12b0Sopenharmony_ci/**
25e5c12b0Sopenharmony_ci * fsck_debug.c
35e5c12b0Sopenharmony_ci *
45e5c12b0Sopenharmony_ci * Copyright (C) 2024 Huawei Ltd.
55e5c12b0Sopenharmony_ci *
65e5c12b0Sopenharmony_ci * This program is free software; you can redistribute it and/or modify
75e5c12b0Sopenharmony_ci * it under the terms of the GNU General Public License version 2 as
85e5c12b0Sopenharmony_ci * published by the Free Software Foundation.
95e5c12b0Sopenharmony_ci */
105e5c12b0Sopenharmony_ci#include "fsck_debug.h"
115e5c12b0Sopenharmony_ci
125e5c12b0Sopenharmony_civoid dump_sbi_info(struct f2fs_sb_info *sbi)
135e5c12b0Sopenharmony_ci{
145e5c12b0Sopenharmony_ci	if (sbi == NULL) {
155e5c12b0Sopenharmony_ci		MSG(0, "sbi is null\n");
165e5c12b0Sopenharmony_ci		return;
175e5c12b0Sopenharmony_ci	}
185e5c12b0Sopenharmony_ci
195e5c12b0Sopenharmony_ci	MSG(0, "\n");
205e5c12b0Sopenharmony_ci	MSG(0, "+--------------------------------------------------------+\n");
215e5c12b0Sopenharmony_ci	MSG(0, "| SBI                                                    |\n");
225e5c12b0Sopenharmony_ci	MSG(0, "+--------------------------------------------------------+\n");
235e5c12b0Sopenharmony_ci	MSG(0, "total_count %u\n", total_segments(sbi));
245e5c12b0Sopenharmony_ci	MSG(0, "resvd_segs %u\n", reserved_segments(sbi));
255e5c12b0Sopenharmony_ci	MSG(0, "overp_segs %u\n", overprov_segments(sbi));
265e5c12b0Sopenharmony_ci	MSG(0, "valid_count %u\n", of_valid_block_count(sbi));
275e5c12b0Sopenharmony_ci	MSG(0, "utilization %u\n", f2fs_utilization(sbi));
285e5c12b0Sopenharmony_ci	MSG(0, "\n");
295e5c12b0Sopenharmony_ci	hex_info_dump("f2fs_sb_info", sbi,
305e5c12b0Sopenharmony_ci		sizeof(struct f2fs_sb_info));
315e5c12b0Sopenharmony_ci	MSG(0, "\n");
325e5c12b0Sopenharmony_ci}
335e5c12b0Sopenharmony_ci
345e5c12b0Sopenharmony_ci#define LINE_MAX_LEN     80
355e5c12b0Sopenharmony_ci#define LINE_MAX_INTS    16
365e5c12b0Sopenharmony_ci#define BATCH_INTS       8
375e5c12b0Sopenharmony_ci#define HEX_SHIFT_12     12
385e5c12b0Sopenharmony_ci#define HEX_SHIFT_8      8
395e5c12b0Sopenharmony_ci#define HEX_SHIFT_4      4
405e5c12b0Sopenharmony_ci#define HEX_MASK         0x0F
415e5c12b0Sopenharmony_civoid hex_info_dump(const char *prompts, const unsigned char *buf,
425e5c12b0Sopenharmony_ci			unsigned int len)
435e5c12b0Sopenharmony_ci{
445e5c12b0Sopenharmony_ci	static const unsigned char hex_ascii[] = "0123456789abcdef";
455e5c12b0Sopenharmony_ci	unsigned char line[LINE_MAX_LEN];
465e5c12b0Sopenharmony_ci	unsigned int i, j, k, line_len;
475e5c12b0Sopenharmony_ci	unsigned int rest = len;
485e5c12b0Sopenharmony_ci
495e5c12b0Sopenharmony_ci	MSG(0, "===HEX DUMP START: %.25s, len %u===\n",
505e5c12b0Sopenharmony_ci		prompts, len);
515e5c12b0Sopenharmony_ci	for (i = 0; i < len; i += LINE_MAX_INTS) {
525e5c12b0Sopenharmony_ci		line_len = rest > LINE_MAX_INTS ? LINE_MAX_INTS : rest;
535e5c12b0Sopenharmony_ci		k = 0;
545e5c12b0Sopenharmony_ci		line[k++] = hex_ascii[(i >> HEX_SHIFT_12) & HEX_MASK];
555e5c12b0Sopenharmony_ci		line[k++] = hex_ascii[(i >> HEX_SHIFT_8) & HEX_MASK];
565e5c12b0Sopenharmony_ci		line[k++] = hex_ascii[(i >> HEX_SHIFT_4) & HEX_MASK];
575e5c12b0Sopenharmony_ci		line[k++] = hex_ascii[i & HEX_MASK];
585e5c12b0Sopenharmony_ci		line[k++] = ':';
595e5c12b0Sopenharmony_ci		for (j = 0; j < line_len; j++) {
605e5c12b0Sopenharmony_ci			j % BATCH_INTS == 0 ? line[k++] = ' ' : 1;
615e5c12b0Sopenharmony_ci			line[k++] = hex_ascii[(buf[i + j] >> HEX_SHIFT_4) & HEX_MASK];
625e5c12b0Sopenharmony_ci			line[k++] = hex_ascii[(buf[i + j] & HEX_MASK)];
635e5c12b0Sopenharmony_ci		}
645e5c12b0Sopenharmony_ci		line[k++] = '\0';
655e5c12b0Sopenharmony_ci		rest -= line_len;
665e5c12b0Sopenharmony_ci		MSG(0, "%s\n", line);
675e5c12b0Sopenharmony_ci	}
685e5c12b0Sopenharmony_ci	MSG(0, "===HEX DUMP END===\n");
695e5c12b0Sopenharmony_ci}