16 Dec, 2010

1 commit

  • To implement per event type optional headers we are interested in
    knowing how long the metadata structure is. This patch slits the __u32
    version field into a __u8 version and a __u16 metadata_len field (with
    __u8 left over). This should allow for backwards compat ABI.

    Signed-off-by: Alexey Zaytsev
    [rewrote descrtion and changed object sizes and ordering - eparis]
    Signed-off-by: Eric Paris

    Alexey Zaytsev
     

08 Dec, 2010

2 commits


29 Oct, 2010

8 commits

  • The comments for FAN_CLOSE_WRITE and FAN_CLOSE_NOWRITE do not match
    FS_CLOSE_WRITE and FS_CLOSE_NOWRITE, respectively. WRITE is for
    writable files while NOWRITE is for non-writable files.

    Signed-off-by: Stefan Hajnoczi
    Signed-off-by: Eric Paris

    Stefan Hajnoczi
     
  • fanotify has a very limited number of events it sends on directories. The
    usefulness of these events is yet to be seen and still we send them. This
    is particularly painful for mount marks where one might receive many of
    these useless events. As such this patch will drop events on IS_DIR()
    inodes unless they were explictly requested with FAN_ON_DIR.

    This means that a mark on a directory without FAN_EVENT_ON_CHILD or
    FAN_ON_DIR is meaningless and will result in no events ever (although it
    will still be allowed since detecting it is hard)

    Signed-off-by: Eric Paris

    Eric Paris
     
  • Some fanotify groups, especially those like AV scanners, will need to place
    lots of marks, particularly ignore marks. Since ignore marks do not pin
    inodes in cache and are cleared if the inode is removed from core (usually
    under memory pressure) we expose an interface for listeners, with
    CAP_SYS_ADMIN, to override the maximum number of marks and be allowed to
    set and 'unlimited' number of marks. Programs which make use of this
    feature will be able to OOM a machine.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • fanotify has a defualt max queue depth. This patch allows processes which
    explicitly request it to have an 'unlimited' queue depth. These processes
    need to be very careful to make sure they cannot fall far enough behind
    that they OOM the box. Thus this flag is gated on CAP_SYS_ADMIN.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • Currently fanotify has no maximum queue depth. Since fanotify is
    CAP_SYS_ADMIN only this does not pose a normal user DoS issue, but it
    certianly is possible that an fanotify listener which can't keep up could
    OOM the box. This patch implements a default 16k depth. This is the same
    default depth used by inotify, but given fanotify's better queue merging in
    many situations this queue will contain many additional useful events by
    comparison.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • fanotify is supposed to be able to flush all marks. This is mostly useful
    for the AV community to flush all cached decisions on a security policy
    change. This functionality has existed in the kernel but wasn't correctly
    exposed to userspace.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • Currently the userspace struct exposed by fanotify uses
    __attribute__((packed)) to make sure that alignment works on multiarch
    platforms. Since this causes a severe performance penalty on some
    platforms we are going to switch to using explicit alignment notation on
    the 64bit values so we don't have to use 'packed'

    Signed-off-by: Eric Paris

    Eric Paris
     
  • The fanotify listeners needs to be able to specify what types of operations
    they are going to perform so they can be ordered appropriately between other
    listeners doing other types of operations. They need this to be able to make
    sure that things like hierarchichal storage managers will get access to inodes
    before processes which need the data. This patch defines 3 possible uses
    which groups must indicate in the fanotify_init() flags.

    FAN_CLASS_PRE_CONTENT
    FAN_CLASS_CONTENT
    FAN_CLASS_NOTIF

    Groups will receive notification in that order. The order between 2 groups in
    the same class is undeterministic.

    FAN_CLASS_PRE_CONTENT is intended to be used by listeners which need access to
    the inode before they are certain that the inode contains it's final data. A
    hierarchical storage manager should choose to use this class.

    FAN_CLASS_CONTENT is intended to be used by listeners which need access to the
    inode after it contains its intended contents. This would be the appropriate
    level for an AV solution or document control system.

    FAN_CLASS_NOTIF is intended for normal async notification about access, much the
    same as inotify and dnotify. Syncronous permissions events are not permitted
    at this class.

    Signed-off-by: Eric Paris

    Eric Paris
     

28 Aug, 2010

1 commit


23 Aug, 2010

1 commit

  • When an fanotify listener is closing it may cause a deadlock between the
    listener and the original task doing an fs operation. If the original task
    is waiting for a permissions response it will be holding the srcu lock. The
    listener cannot clean up and exit until after that srcu lock is syncronized.
    Thus deadlock. The fix introduced here is to stop accepting new permissions
    events when a listener is shutting down and to grant permission for all
    outstanding events. Thus the original task will eventually release the srcu
    lock and the listener can complete shutdown.

    Reported-by: Andreas Gruenbacher
    Cc: Andreas Gruenbacher
    Signed-off-by: Eric Paris

    Eric Paris
     

28 Jul, 2010

13 commits

  • fanotify groups need to respond to events which include permissions types.
    To do so groups will send a response using write() on the fanotify_fd they
    have open.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • This is the backend work needed for fanotify to support the new
    FS_OPEN_PERM and FS_ACCESS_PERM fsnotify events. This is done using the
    new fsnotify secondary queue. No userspace interface is provided actually
    respond to or request these events.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • fanotify listeners may want to clear all marks. They may want to do this
    to destroy all of their inode marks which have nothing but ignores.
    Realistically this is useful for av vendors who update policy and want to
    clear all of their cached allows.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • Some users may want to truely ignore an inode even if it has been modified.
    Say you are wanting a mount which contains a log file and you really don't
    want any notification about that file. This patch allows the listener to
    do that.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • Change the sys_fanotify_mark() system call so users can set ignored_masks
    on inodes. Remember, if a user new sets a real mask, and only sets ignored
    masks, the ignore will never be pinned in memory. Thus ignored_masks can
    be lost under memory pressure and the user may again get events they
    previously thought were ignored.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • fanotify_mark_validate functions are all needlessly declared in headers as
    static inlines. Instead just do the checks where they are needed for code
    readability.

    Signed-off-by: Andreas Gruenbacher
    Signed-off-by: Eric Paris

    Andreas Gruenbacher
     
  • the term 'vfsmount' isn't sensicle to userspace. instead call is 'mount.

    Signed-off-by: Andreas Gruenbacher
    Signed-off-by: Eric Paris

    Andreas Gruenbacher
     
  • Create a new fanotify_mark flag which indicates we should attach the mark
    to the vfsmount holding the object referenced by dfd and pathname rather
    than the inode itself.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • Pass the process identifiers of the triggering processes to fanotify
    listeners: this information is useful for event filtering and logging.

    Signed-off-by: Andreas Gruenbacher
    Signed-off-by: Eric Paris

    Andreas Gruenbacher
     
  • Send events to userspace by reading the file descriptor from fanotify_init().
    One will get blocks of data which look like:

    struct fanotify_event_metadata {
    __u32 event_len;
    __u32 vers;
    __s32 fd;
    __u64 mask;
    __s64 pid;
    __u64 cookie;
    } __attribute__ ((packed));

    Simple code to retrieve and deal with events is below

    while ((len = read(fan_fd, buf, sizeof(buf))) > 0) {
    struct fanotify_event_metadata *metadata;

    metadata = (void *)buf;
    while(FAN_EVENT_OK(metadata, len)) {
    [PROCESS HERE!!]
    if (metadata->fd >= 0 && close(metadata->fd) != 0)
    goto fail;
    metadata = FAN_EVENT_NEXT(metadata, len);
    }
    }

    Signed-off-by: Eric Paris

    Eric Paris
     
  • NAME
    fanotify_mark - add, remove, or modify an fanotify mark on a
    filesystem object

    SYNOPSIS
    int fanotify_mark(int fanotify_fd, unsigned int flags, u64 mask,
    int dfd, const char *pathname)

    DESCRIPTION
    fanotify_mark() is used to add remove or modify a mark on a filesystem
    object. Marks are used to indicate that the fanotify group is
    interested in events which occur on that object. At this point in
    time marks may only be added to files and directories.

    fanotify_fd must be a file descriptor returned by fanotify_init()

    The flags field must contain exactly one of the following:

    FAN_MARK_ADD - or the bits in mask and ignored mask into the mark
    FAN_MARK_REMOVE - bitwise remove the bits in mask and ignored mark
    from the mark

    The following values can be OR'd into the flags field:

    FAN_MARK_DONT_FOLLOW - same meaning as O_NOFOLLOW as described in open(2)
    FAN_MARK_ONLYDIR - same meaning as O_DIRECTORY as described in open(2)

    dfd may be any of the following:
    AT_FDCWD: the object will be lookup up based on pathname similar
    to open(2)

    file descriptor of a directory: if pathname is not NULL the
    object to modify will be lookup up similar to openat(2)

    file descriptor of the final object: if pathname is NULL the
    object to modify will be the object referenced by dfd

    The mask is the bitwise OR of the set of events of interest such as:
    FAN_ACCESS - object was accessed (read)
    FAN_MODIFY - object was modified (write)
    FAN_CLOSE_WRITE - object was writable and was closed
    FAN_CLOSE_NOWRITE - object was read only and was closed
    FAN_OPEN - object was opened
    FAN_EVENT_ON_CHILD - interested in objected that happen to
    children. Only relavent when the object
    is a directory
    FAN_Q_OVERFLOW - event queue overflowed (not implemented)

    RETURN VALUE
    On success, this system call returns 0. On error, -1 is
    returned, and errno is set to indicate the error.

    ERRORS
    EINVAL An invalid value was specified in flags.

    EINVAL An invalid value was specified in mask.

    EINVAL An invalid value was specified in ignored_mask.

    EINVAL fanotify_fd is not a file descriptor as returned by
    fanotify_init()

    EBADF fanotify_fd is not a valid file descriptor

    EBADF dfd is not a valid file descriptor and path is NULL.

    ENOTDIR dfd is not a directory and path is not NULL

    EACCESS no search permissions on some part of the path

    ENENT file not found

    ENOMEM Insufficient kernel memory is available.

    CONFORMING TO
    These system calls are Linux-specific.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • NAME
    fanotify_init - initialize an fanotify group

    SYNOPSIS
    int fanotify_init(unsigned int flags, unsigned int event_f_flags, int priority);

    DESCRIPTION
    fanotify_init() initializes a new fanotify instance and returns a file
    descriptor associated with the new fanotify event queue.

    The following values can be OR'd into the flags field:

    FAN_NONBLOCK Set the O_NONBLOCK file status flag on the new open file description.
    Using this flag saves extra calls to fcntl(2) to achieve the same
    result.

    FAN_CLOEXEC Set the close-on-exec (FD_CLOEXEC) flag on the new file descriptor.
    See the description of the O_CLOEXEC flag in open(2) for reasons why
    this may be useful.

    The event_f_flags argument is unused and must be set to 0

    The priority argument is unused and must be set to 0

    RETURN VALUE
    On success, this system call return a new file descriptor. On error, -1 is
    returned, and errno is set to indicate the error.

    ERRORS
    EINVAL An invalid value was specified in flags.

    EINVAL A non-zero valid was passed in event_f_flags or in priority

    ENFILE The system limit on the total number of file descriptors has been reached.

    ENOMEM Insufficient kernel memory is available.

    CONFORMING TO
    These system calls are Linux-specific.

    Signed-off-by: Eric Paris

    Eric Paris
     
  • fanotify is a novel file notification system which bases notification on
    giving userspace both an event type (open, close, read, write) and an open
    file descriptor to the object in question. This should address a number of
    races and problems with other notification systems like inotify and dnotify
    and should allow the future implementation of blocking or access controlled
    notification. These are useful for on access scanners or hierachical storage
    management schemes.

    This patch just implements the basics of the fsnotify functions.

    Signed-off-by: Eric Paris

    Eric Paris