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#define DEBUG_SUBSYSTEM D_OTHER
38
39#include <asm/unaligned.h>
40
41#include <obd_support.h>
42#include <lustre_debug.h>
43#include <lustre_net.h>
44
45#define LPDS sizeof(__u64)
46int block_debug_setup(void *addr, int len, __u64 off, __u64 id)
47{
48 LASSERT(addr);
49
50 put_unaligned_le64(off, addr);
51 put_unaligned_le64(id, addr + LPDS);
52 addr += len - LPDS - LPDS;
53 put_unaligned_le64(off, addr);
54 put_unaligned_le64(id, addr + LPDS);
55
56 return 0;
57}
58EXPORT_SYMBOL(block_debug_setup);
59
60int block_debug_check(char *who, void *addr, int end, __u64 off, __u64 id)
61{
62 __u64 ne_off;
63 int err = 0;
64
65 LASSERT(addr);
66
67 ne_off = le64_to_cpu(off);
68 id = le64_to_cpu(id);
69 if (memcmp(addr, (char *)&ne_off, LPDS)) {
70 CDEBUG(D_ERROR, "%s: id %#llx offset %llu off: %#llx != %#llx\n",
71 who, id, off, *(__u64 *)addr, ne_off);
72 err = -EINVAL;
73 }
74 if (memcmp(addr + LPDS, (char *)&id, LPDS)) {
75 CDEBUG(D_ERROR, "%s: id %#llx offset %llu id: %#llx != %#llx\n",
76 who, id, off, *(__u64 *)(addr + LPDS), id);
77 err = -EINVAL;
78 }
79
80 addr += end - LPDS - LPDS;
81 if (memcmp(addr, (char *)&ne_off, LPDS)) {
82 CDEBUG(D_ERROR, "%s: id %#llx offset %llu end off: %#llx != %#llx\n",
83 who, id, off, *(__u64 *)addr, ne_off);
84 err = -EINVAL;
85 }
86 if (memcmp(addr + LPDS, (char *)&id, LPDS)) {
87 CDEBUG(D_ERROR, "%s: id %#llx offset %llu end id: %#llx != %#llx\n",
88 who, id, off, *(__u64 *)(addr + LPDS), id);
89 err = -EINVAL;
90 }
91
92 return err;
93}
94EXPORT_SYMBOL(block_debug_check);
95#undef LPDS
96