Skip to content

Commit a861f3d

Browse files
committed
chore: simplify inode handling kernel side
1 parent 83d9fa3 commit a861f3d

4 files changed

Lines changed: 29 additions & 35 deletions

File tree

fact-ebpf/src/bpf/events.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ struct event_args_t {
1616
struct event_t* event;
1717
struct metrics_by_hook_t* metrics;
1818
const char* filename;
19-
inode_key_t* inode;
19+
inode_key_t inode;
2020
inode_key_t parent_inode;
2121
bool use_bpf_d_path;
2222
};
2323

2424
__always_inline static void __submit_event(struct event_args_t* args) {
2525
struct event_t* event = args->event;
2626
event->timestamp = bpf_ktime_get_boot_ns();
27-
inode_copy_or_reset(&event->inode, args->inode);
28-
inode_copy_or_reset(&event->parent_inode, &args->parent_inode);
27+
inode_copy(&event->inode, &args->inode);
28+
inode_copy(&event->parent_inode, &args->parent_inode);
2929
bpf_probe_read_str(event->filename, PATH_MAX, args->filename);
3030

3131
struct helper_t* helper = get_helper();
@@ -118,7 +118,7 @@ __always_inline static void submit_rename_event(struct event_args_t* args,
118118

119119
args->event->type = FILE_ACTIVITY_RENAME;
120120
bpf_probe_read_str(args->event->rename.old_filename, PATH_MAX, old_filename);
121-
inode_copy_or_reset(&args->event->rename.old_inode, old_inode);
121+
inode_copy(&args->event->rename.old_inode, old_inode);
122122

123123
__submit_event(args);
124124
}

fact-ebpf/src/bpf/file.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,16 @@ __always_inline static bool path_is_monitored(struct bound_path_t* path) {
2727
return res;
2828
}
2929

30-
__always_inline static inode_monitored_t is_monitored(inode_key_t inode, struct bound_path_t* path, const inode_key_t* parent, inode_key_t** submit) {
31-
const inode_value_t* volatile inode_value = inode_get(&inode);
30+
__always_inline static inode_monitored_t is_monitored(inode_key_t* inode, struct bound_path_t* path, const inode_key_t* parent) {
31+
const inode_value_t* volatile inode_value = inode_get(inode);
3232
const inode_value_t* volatile parent_value = inode_get(parent);
3333

3434
inode_monitored_t status = inode_is_monitored(inode_value, parent_value);
3535
if (status != NOT_MONITORED) {
3636
return status;
3737
}
3838

39-
*submit = NULL;
39+
inode_reset(inode);
4040
if (path_is_monitored(path)) {
4141
return MONITORED;
4242
}

fact-ebpf/src/bpf/inode.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ __always_inline static long inode_remove(struct inode_key_t* inode) {
8080
return bpf_map_delete_elem(&inode_map, inode);
8181
}
8282

83+
__always_inline static void inode_reset(struct inode_key_t* inode) {
84+
inode->inode = 0;
85+
inode->dev = 0;
86+
}
87+
8388
typedef enum inode_monitored_t {
8489
NOT_MONITORED = 0,
8590
MONITORED,
@@ -99,16 +104,11 @@ __always_inline static inode_monitored_t inode_is_monitored(const inode_value_t*
99104
return NOT_MONITORED;
100105
}
101106

102-
__always_inline static void inode_copy_or_reset(inode_key_t* dst, const inode_key_t* src) {
107+
__always_inline static void inode_copy(inode_key_t* dst, const inode_key_t* src) {
103108
if (dst == NULL) {
104109
return;
105110
}
106111

107-
if (src != NULL) {
108-
dst->inode = src->inode;
109-
dst->dev = src->dev;
110-
} else {
111-
dst->inode = 0;
112-
dst->dev = 0;
113-
}
112+
dst->inode = src->inode;
113+
dst->dev = src->dev;
114114
}

fact-ebpf/src/bpf/main.c

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,16 @@ int BPF_PROG(trace_file_open, struct file* file) {
4949
}
5050
args.filename = path->path;
5151

52-
inode_key_t inode_key = inode_to_key(file->f_inode);
53-
args.inode = &inode_key;
52+
args.inode = inode_to_key(file->f_inode);
5453

5554
struct dentry* parent_dentry = BPF_CORE_READ(file, f_path.dentry, d_parent);
5655
struct inode* parent_inode_ptr = parent_dentry ? BPF_CORE_READ(parent_dentry, d_inode) : NULL;
5756
args.parent_inode = inode_to_key(parent_inode_ptr);
5857

59-
inode_monitored_t status = is_monitored(inode_key, path, &args.parent_inode, &args.inode);
58+
inode_monitored_t status = is_monitored(&args.inode, path, &args.parent_inode);
6059

6160
if (status == PARENT_MONITORED && event_type == FILE_ACTIVITY_CREATION) {
62-
inode_add(&inode_key);
61+
inode_add(&args.inode);
6362
}
6463

6564
if (status == NOT_MONITORED) {
@@ -96,10 +95,9 @@ int BPF_PROG(trace_path_unlink, struct path* dir, struct dentry* dentry) {
9695
}
9796
args.filename = path->path;
9897

99-
inode_key_t inode_key = inode_to_key(dentry->d_inode);
100-
args.inode = &inode_key;
98+
args.inode = inode_to_key(dentry->d_inode);
10199

102-
if (is_monitored(inode_key, path, NULL, &args.inode) == NOT_MONITORED) {
100+
if (is_monitored(&args.inode, path, NULL) == NOT_MONITORED) {
103101
m->path_unlink.ignored++;
104102
return 0;
105103
}
@@ -129,10 +127,9 @@ int BPF_PROG(trace_path_chmod, struct path* path, umode_t mode) {
129127
}
130128
args.filename = bound_path->path;
131129

132-
inode_key_t inode_key = inode_to_key(path->dentry->d_inode);
133-
args.inode = &inode_key;
130+
args.inode = inode_to_key(path->dentry->d_inode);
134131

135-
if (is_monitored(inode_key, bound_path, NULL, &args.inode) == NOT_MONITORED) {
132+
if (is_monitored(&args.inode, bound_path, NULL) == NOT_MONITORED) {
136133
args.metrics->ignored++;
137134
return 0;
138135
}
@@ -167,10 +164,9 @@ int BPF_PROG(trace_path_chown, struct path* path, unsigned long long uid, unsign
167164
}
168165
args.filename = bound_path->path;
169166

170-
inode_key_t inode_key = inode_to_key(path->dentry->d_inode);
171-
args.inode = &inode_key;
167+
args.inode = inode_to_key(path->dentry->d_inode);
172168

173-
if (is_monitored(inode_key, bound_path, NULL, &args.inode) == NOT_MONITORED) {
169+
if (is_monitored(&args.inode, bound_path, NULL) == NOT_MONITORED) {
174170
args.metrics->ignored++;
175171
return 0;
176172
}
@@ -212,21 +208,19 @@ int BPF_PROG(trace_path_rename, struct path* old_dir,
212208
goto error;
213209
}
214210

215-
inode_key_t old_inode = inode_to_key(old_dentry->d_inode);
216-
inode_key_t new_inode = inode_to_key(new_dentry->d_inode);
211+
args.inode = inode_to_key(new_dentry->d_inode);
217212

218-
inode_key_t* old_inode_submit = &old_inode;
219-
args.inode = &new_inode;
213+
inode_key_t old_inode = inode_to_key(old_dentry->d_inode);
220214

221-
inode_monitored_t old_monitored = is_monitored(old_inode, old_path, NULL, &old_inode_submit);
222-
inode_monitored_t new_monitored = is_monitored(new_inode, new_path, NULL, &args.inode);
215+
inode_monitored_t old_monitored = is_monitored(&old_inode, old_path, NULL);
216+
inode_monitored_t new_monitored = is_monitored(&args.inode, new_path, NULL);
223217

224218
if (old_monitored == NOT_MONITORED && new_monitored == NOT_MONITORED) {
225219
args.metrics->ignored++;
226220
return 0;
227221
}
228222

229-
submit_rename_event(&args, old_path->path, old_inode_submit);
223+
submit_rename_event(&args, old_path->path, &old_inode);
230224
return 0;
231225

232226
error:

0 commit comments

Comments
 (0)