fanotify: support reporting thread id instead of process id
authorAmir Goldstein <amir73il@gmail.com>
Wed, 3 Oct 2018 21:25:38 +0000 (00:25 +0300)
committerJan Kara <jack@suse.cz>
Mon, 8 Oct 2018 11:48:45 +0000 (13:48 +0200)
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 <nixiaoming@huawei.com>
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/notify/fanotify/fanotify.c
fs/notify/fanotify/fanotify.h
fs/notify/fanotify/fanotify_user.c
include/linux/fanotify.h
include/uapi/linux/fanotify.h

index 361e3a0..5769cf3 100644 (file)
@@ -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;
@@ -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);
@@ -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));
index 88a8290..ea05b8a 100644 (file)
@@ -19,7 +19,7 @@ struct fanotify_event_info {
         * during this object's lifetime
         */
        struct path path;
-       struct pid *tgid;
+       struct pid *pid;
 };
 
 /*
index 14594e4..e03be50 100644 (file)
@@ -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 {
@@ -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,
index caf55c6..a5a6069 100644 (file)
@@ -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)
 
index d0c05de..b86740d 100644 (file)
@@ -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 |\