mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-31 16:38:12 +00:00
44d705b037
Report event FAN_DIR_MODIFY with name in a variable length record similar to how fid's are reported. With name info reporting implemented, setting FAN_DIR_MODIFY in mark mask is now allowed. When events are reported with name, the reported fid identifies the directory and the name follows the fid. The info record type for this event info is FAN_EVENT_INFO_TYPE_DFID_NAME. For now, all reported events have at most one info record which is either FAN_EVENT_INFO_TYPE_FID or FAN_EVENT_INFO_TYPE_DFID_NAME (for FAN_DIR_MODIFY). Later on, events "on child" will report both records. There are several ways that an application can use this information: 1. When watching a single directory, the name is always relative to the watched directory, so application need to fstatat(2) the name relative to the watched directory. 2. When watching a set of directories, the application could keep a map of dirfd for all watched directories and hash the map by fid obtained with name_to_handle_at(2). When getting a name event, the fid in the event info could be used to lookup the base dirfd in the map and then call fstatat(2) with that dirfd. 3. When watching a filesystem (FAN_MARK_FILESYSTEM) or a large set of directories, the application could use open_by_handle_at(2) with the fid in event info to obtain dirfd for the directory where event happened and call fstatat(2) with this dirfd. The last option scales better for a large number of watched directories. The first two options may be available in the future also for non privileged fanotify watchers, because open_by_handle_at(2) requires the CAP_DAC_READ_SEARCH capability. Link: https://lore.kernel.org/r/20200319151022.31456-15-amir73il@gmail.com Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
84 lines
2.7 KiB
C
84 lines
2.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _LINUX_FANOTIFY_H
|
|
#define _LINUX_FANOTIFY_H
|
|
|
|
#include <uapi/linux/fanotify.h>
|
|
|
|
#define FAN_GROUP_FLAG(group, flag) \
|
|
((group)->fanotify_data.flags & (flag))
|
|
|
|
/*
|
|
* Flags allowed to be passed from/to userspace.
|
|
*
|
|
* We intentionally do not add new bits to the old FAN_ALL_* constants, because
|
|
* they are uapi exposed constants. If there are programs out there using
|
|
* these constant, the programs may break if re-compiled with new uapi headers
|
|
* and then run on an old kernel.
|
|
*/
|
|
#define FANOTIFY_CLASS_BITS (FAN_CLASS_NOTIF | FAN_CLASS_CONTENT | \
|
|
FAN_CLASS_PRE_CONTENT)
|
|
|
|
#define FANOTIFY_INIT_FLAGS (FANOTIFY_CLASS_BITS | \
|
|
FAN_REPORT_TID | FAN_REPORT_FID | \
|
|
FAN_CLOEXEC | FAN_NONBLOCK | \
|
|
FAN_UNLIMITED_QUEUE | FAN_UNLIMITED_MARKS)
|
|
|
|
#define FANOTIFY_MARK_TYPE_BITS (FAN_MARK_INODE | FAN_MARK_MOUNT | \
|
|
FAN_MARK_FILESYSTEM)
|
|
|
|
#define FANOTIFY_MARK_FLAGS (FANOTIFY_MARK_TYPE_BITS | \
|
|
FAN_MARK_ADD | \
|
|
FAN_MARK_REMOVE | \
|
|
FAN_MARK_DONT_FOLLOW | \
|
|
FAN_MARK_ONLYDIR | \
|
|
FAN_MARK_IGNORED_MASK | \
|
|
FAN_MARK_IGNORED_SURV_MODIFY | \
|
|
FAN_MARK_FLUSH)
|
|
|
|
/*
|
|
* Events that can be reported with data type FSNOTIFY_EVENT_PATH.
|
|
* Note that FAN_MODIFY can also be reported with data type
|
|
* FSNOTIFY_EVENT_INODE.
|
|
*/
|
|
#define FANOTIFY_PATH_EVENTS (FAN_ACCESS | FAN_MODIFY | \
|
|
FAN_CLOSE | FAN_OPEN | FAN_OPEN_EXEC)
|
|
|
|
/*
|
|
* Directory entry modification events - reported only to directory
|
|
* where entry is modified and not to a watching parent.
|
|
*/
|
|
#define FANOTIFY_DIRENT_EVENTS (FAN_MOVE | FAN_CREATE | FAN_DELETE | \
|
|
FAN_DIR_MODIFY)
|
|
|
|
/* Events that can only be reported with data type FSNOTIFY_EVENT_INODE */
|
|
#define FANOTIFY_INODE_EVENTS (FANOTIFY_DIRENT_EVENTS | \
|
|
FAN_ATTRIB | FAN_MOVE_SELF | FAN_DELETE_SELF)
|
|
|
|
/* Events that user can request to be notified on */
|
|
#define FANOTIFY_EVENTS (FANOTIFY_PATH_EVENTS | \
|
|
FANOTIFY_INODE_EVENTS)
|
|
|
|
/* Events that require a permission response from user */
|
|
#define FANOTIFY_PERM_EVENTS (FAN_OPEN_PERM | FAN_ACCESS_PERM | \
|
|
FAN_OPEN_EXEC_PERM)
|
|
|
|
/* Extra flags that may be reported with event or control handling of events */
|
|
#define FANOTIFY_EVENT_FLAGS (FAN_EVENT_ON_CHILD | FAN_ONDIR)
|
|
|
|
/* Events that may be reported to user */
|
|
#define FANOTIFY_OUTGOING_EVENTS (FANOTIFY_EVENTS | \
|
|
FANOTIFY_PERM_EVENTS | \
|
|
FAN_Q_OVERFLOW | FAN_ONDIR)
|
|
|
|
#define ALL_FANOTIFY_EVENT_BITS (FANOTIFY_OUTGOING_EVENTS | \
|
|
FANOTIFY_EVENT_FLAGS)
|
|
|
|
/* Do not use these old uapi constants internally */
|
|
#undef FAN_ALL_CLASS_BITS
|
|
#undef FAN_ALL_INIT_FLAGS
|
|
#undef FAN_ALL_MARK_FLAGS
|
|
#undef FAN_ALL_EVENTS
|
|
#undef FAN_ALL_PERM_EVENTS
|
|
#undef FAN_ALL_OUTGOING_EVENTS
|
|
|
|
#endif /* _LINUX_FANOTIFY_H */
|