replay-log: add support for replaying ops in target device sector range
[xfstests-dev.git] / src / log-writes / log-writes.h
1 #ifndef _LOG_WRITES_H_
2 #define _LOG_WRITES_H_
3
4 #include <linux/types.h>
5 #include <endian.h>
6 #if __BYTE_ORDER == __LITTLE_ENDIAN
7 #include <linux/byteorder/little_endian.h>
8 #else
9 #include <linux/byteorder/big_endian.h>
10 #endif
11
12 extern int log_writes_verbose;
13
14 #define le64_to_cpu __le64_to_cpu
15 #define le32_to_cpu __le32_to_cpu
16
17 typedef __u64 u64;
18 typedef __u32 u32;
19
20 /*
21  * Constants copied from kernel file drivers/md/dm-log-writes.c
22  */
23 #define LOG_FLUSH_FLAG (1 << 0)
24 #define LOG_FUA_FLAG (1 << 1)
25 #define LOG_DISCARD_FLAG (1 << 2)
26 #define LOG_MARK_FLAG (1 << 3)
27
28 #define WRITE_LOG_VERSION 1
29 #define WRITE_LOG_MAGIC 0x6a736677736872
30
31
32 /*
33  * Basic info about the log for userspace.
34  *
35  * Copied from kernel file drivers/md/dm-log-writes.c
36  */
37 struct log_write_super {
38         __le64 magic;
39         __le64 version;
40         __le64 nr_entries;
41         __le32 sectorsize;
42 };
43
44 /*
45  * sector - the sector we wrote.
46  * nr_sectors - the number of sectors we wrote.
47  * flags - flags for this log entry.
48  * data_len - the size of the data in this log entry, this is for private log
49  * entry stuff, the MARK data provided by userspace for example.
50  *
51  * Copied from kernel file drivers/md/dm-log-writes.c
52  */
53 struct log_write_entry {
54         __le64 sector;
55         __le64 nr_sectors;
56         __le64 flags;
57         __le64 data_len;
58         /* Read extra byte when seeking to verify that header is zero padded */
59         char data[1];
60 };
61
62 #define LOG_IGNORE_DISCARD (1 << 0)
63 #define LOG_DISCARD_NOT_SUPP (1 << 1)
64
65 struct log {
66         int logfd;
67         int replayfd;
68         unsigned long flags;
69         u64 sectorsize;
70         u64 start_sector;
71         u64 end_sector;
72         u64 nr_entries;
73         u64 cur_entry;
74         u64 max_zero_size;
75         off_t cur_pos;
76 };
77
78 struct log *log_open(char *logfile, char *replayfile);
79 int log_replay_next_entry(struct log *log, struct log_write_entry *entry,
80                           int read_data);
81 int log_seek_entry(struct log *log, u64 entry_num);
82 int log_seek_next_entry(struct log *log, struct log_write_entry *entry,
83                         int read_data);
84 void log_free(struct log *log);
85
86 #endif