Skip to content

Commit

Permalink
fanotify: support reporting thread id instead of process id
Browse files Browse the repository at this point in the history
In order to identify which thread triggered the event in a
multi-threaded program, add the FAN_REPORT_TID flag in fanotify_init to
opt-in for reporting the event creator's thread id information.

Signed-off-by: nixiaoming <[email protected]>
Signed-off-by: Amir Goldstein <[email protected]>
Signed-off-by: Jan Kara <[email protected]>
  • Loading branch information
amir73il authored and jankara committed Oct 8, 2018
1 parent bdd5a46 commit d0a6a87
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 6 deletions.
9 changes: 6 additions & 3 deletions fs/notify/fanotify/fanotify.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ static bool should_merge(struct fsnotify_event *old_fsn,
old = FANOTIFY_E(old_fsn);
new = FANOTIFY_E(new_fsn);

if (old_fsn->inode == new_fsn->inode && old->tgid == new->tgid &&
if (old_fsn->inode == new_fsn->inode && old->pid == new->pid &&
old->path.mnt == new->path.mnt &&
old->path.dentry == new->path.dentry)
return true;
Expand Down Expand Up @@ -171,7 +171,10 @@ struct fanotify_event_info *fanotify_alloc_event(struct fsnotify_group *group,
goto out;
init: __maybe_unused
fsnotify_init_event(&event->fse, inode, mask);
event->tgid = get_pid(task_tgid(current));
if (FAN_GROUP_FLAG(group, FAN_REPORT_TID))
event->pid = get_pid(task_pid(current));
else
event->pid = get_pid(task_tgid(current));
if (path) {
event->path = *path;
path_get(&event->path);
Expand Down Expand Up @@ -270,7 +273,7 @@ static void fanotify_free_event(struct fsnotify_event *fsn_event)

event = FANOTIFY_E(fsn_event);
path_put(&event->path);
put_pid(event->tgid);
put_pid(event->pid);
if (fanotify_is_perm_event(fsn_event->mask)) {
kmem_cache_free(fanotify_perm_event_cachep,
FANOTIFY_PE(fsn_event));
Expand Down
2 changes: 1 addition & 1 deletion fs/notify/fanotify/fanotify.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ struct fanotify_event_info {
* during this object's lifetime
*/
struct path path;
struct pid *tgid;
struct pid *pid;
};

/*
Expand Down
4 changes: 2 additions & 2 deletions fs/notify/fanotify/fanotify_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ static int fill_event_metadata(struct fsnotify_group *group,
metadata->vers = FANOTIFY_METADATA_VERSION;
metadata->reserved = 0;
metadata->mask = fsn_event->mask & FANOTIFY_OUTGOING_EVENTS;
metadata->pid = pid_vnr(event->tgid);
metadata->pid = pid_vnr(event->pid);
if (unlikely(fsn_event->mask & FAN_Q_OVERFLOW))
metadata->fd = FAN_NOFD;
else {
Expand Down Expand Up @@ -944,7 +944,7 @@ COMPAT_SYSCALL_DEFINE6(fanotify_mark,
*/
static int __init fanotify_user_setup(void)
{
BUILD_BUG_ON(HWEIGHT32(FANOTIFY_INIT_FLAGS) != 6);
BUILD_BUG_ON(HWEIGHT32(FANOTIFY_INIT_FLAGS) != 7);
BUILD_BUG_ON(HWEIGHT32(FANOTIFY_MARK_FLAGS) != 9);

fanotify_mark_cache = KMEM_CACHE(fsnotify_mark,
Expand Down
1 change: 1 addition & 0 deletions include/linux/fanotify.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
FAN_CLASS_PRE_CONTENT)

#define FANOTIFY_INIT_FLAGS (FANOTIFY_CLASS_BITS | \
FAN_REPORT_TID | \
FAN_CLOEXEC | FAN_NONBLOCK | \
FAN_UNLIMITED_QUEUE | FAN_UNLIMITED_MARKS)

Expand Down
3 changes: 3 additions & 0 deletions include/uapi/linux/fanotify.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
#define FAN_UNLIMITED_MARKS 0x00000020
#define FAN_ENABLE_AUDIT 0x00000040

/* Flags to determine fanotify event format */
#define FAN_REPORT_TID 0x00000100 /* event->pid is thread id */

/* Deprecated - do not use this in programs and do not add new flags here! */
#define FAN_ALL_INIT_FLAGS (FAN_CLOEXEC | FAN_NONBLOCK | \
FAN_ALL_CLASS_BITS | FAN_UNLIMITED_QUEUE |\
Expand Down

0 comments on commit d0a6a87

Please sign in to comment.