fe324d44b0047f5d922d09bb8e8fcc6658d10b74
[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 };
59
60 #define LOG_IGNORE_DISCARD (1 << 0)
61 #define LOG_DISCARD_NOT_SUPP (1 << 1)
62
63 struct log {
64         int logfd;
65         int replayfd;
66         unsigned long flags;
67         u64 sectorsize;
68         u64 nr_entries;
69         u64 cur_entry;
70         u64 max_zero_size;
71         off_t cur_pos;
72 };
73
74 struct log *log_open(char *logfile, char *replayfile);
75 int log_replay_next_entry(struct log *log, struct log_write_entry *entry,
76                           int read_data);
77 int log_seek_entry(struct log *log, u64 entry_num);
78 int log_seek_next_entry(struct log *log, struct log_write_entry *entry,
79                         int read_data);
80 void log_free(struct log *log);
81
82 #endif