File: diskscan.h

package info (click to toggle)
diskscan 0.21-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,656 kB
  • sloc: ansic: 11,136; python: 338; xml: 138; sh: 41; makefile: 36
file content (110 lines) | stat: -rw-r--r-- 2,787 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#ifndef _DISKSCAN_H_
#define _DISKSCAN_H_

#include <stdio.h>
#include <stdint.h>
#include "arch.h"

#include "libscsicmd/include/ata.h"
#include "hdrhistogram/src/hdr_histogram.h"

#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))

enum scan_mode {
	SCAN_MODE_UNKNOWN,
	SCAN_MODE_SEQ,
	SCAN_MODE_RANDOM,
};

enum conclusion {
	CONCLUSION_SCAN_PROBLEM, /* Problem in the scan, no real conclusion */
	CONCLUSION_ABORTED, /* Scan aborted by used */
	CONCLUSION_PASSED,  /* Disk looks fine */
	/* Disk looks bad, and the reason it failed the test */
	CONCLUSION_FAILED_MAX_LATENCY,
	CONCLUSION_FAILED_LATENCY_PERCENTILE,
	CONCLUSION_FAILED_IO_ERRORS,
};

typedef struct latency_t {
	uint64_t start_sector;
	uint64_t end_sector;
	uint32_t latency_min_msec;
	uint32_t latency_max_msec;
	uint32_t latency_median_msec;
} latency_t;

typedef struct data_log_raw_t {
	FILE *f;
	bool is_first;
} data_log_raw_t;

typedef struct data_log_t {
	FILE *f;
	bool is_first;
} data_log_t;

typedef struct ata_state_t {
	bool is_smart_tripped;
	const struct smart_table *smart_table;
	ata_smart_attr_t smart[MAX_SMART_ATTRS];
	int smart_num;
	int last_temp;
	int last_reallocs;
	int last_pending_reallocs;
	int last_crc_errors;
} ata_state_t;

typedef struct scsi_state_t {
} scsi_state_t;

typedef struct disk_t {
	disk_dev_t dev;
	char path[128];
	char vendor[64];
	char model[64];
	char fw_rev[64];
	char serial[64];
	bool is_ata;
	union {
		ata_state_t ata;
		scsi_state_t scsi;
	} state;
	unsigned char ata_buf[512];
	unsigned ata_buf_len;
	uint64_t num_bytes;
	uint64_t sector_size;
	int run;
	int fix;

	uint64_t num_errors;
	struct hdr_histogram *histogram;
	unsigned latency_graph_len;
	latency_t *latency_graph;
	enum conclusion conclusion;

	data_log_raw_t data_raw;
	data_log_t data_log;
} disk_t;

int disk_open(disk_t *disk, const char *path, int fix, unsigned latency_graph_len, disk_mount_e allowed_mount);
int disk_scan(disk_t *disk, enum scan_mode mode, unsigned data_size);
int disk_close(disk_t *disk);
void disk_scan_stop(disk_t *disk);

enum scan_mode str_to_scan_mode(const char *s);
const char *conclusion_to_str(enum conclusion conclusion);

/* Implemented by the user (gui/cli) */
void report_progress(disk_t *disk, int percent_part, int percent_full);
void report_scan_success(disk_t *disk, uint64_t offset_bytes, uint64_t data_size, uint64_t time);
void report_scan_error(disk_t *disk, uint64_t offset_bytes, uint64_t data_size, uint64_t time);
void report_scan_done(disk_t *disk);

/* Used to log data to files */
void data_log_raw_start(data_log_raw_t *log_raw, const char *filename, disk_t *disk);
void data_log_raw_end(data_log_raw_t *log_raw);
void data_log_start(data_log_t *log, const char *filename, disk_t *disk);
void data_log_end(data_log_t *log, disk_t *disk);

#endif