1. 16 12月, 2010 1 次提交
  2. 08 12月, 2010 2 次提交
  3. 29 10月, 2010 8 次提交
    • S
      fanotify: Fix FAN_CLOSE comments · 50e4a989
      Stefan Hajnoczi 提交于
      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: NStefan Hajnoczi <stefanha@linux.vnet.ibm.com>
      Signed-off-by: NEric Paris <eparis@redhat.com>
      50e4a989
    • E
      fanotify: ignore events on directories unless specifically requested · 8fcd6528
      Eric Paris 提交于
      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: NEric Paris <eparis@redhat.com>
      8fcd6528
    • E
      fanotify: allow userspace to override max marks · ac7e22dc
      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: NEric Paris <eparis@redhat.com>
      ac7e22dc
    • E
      fanotify: allow userspace to override max queue depth · 5dd03f55
      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: NEric Paris <eparis@redhat.com>
      5dd03f55
    • E
      fsnotify: implement a default maximum queue depth · 2529a0df
      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: NEric Paris <eparis@redhat.com>
      2529a0df
    • E
      fanotify: allow userspace to flush all marks · bbf2aba5
      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: NEric Paris <eparis@redhat.com>
      bbf2aba5
    • E
      fanotify: use __aligned_u64 in fanotify userspace metadata · 28682019
      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: NEric Paris <eparis@redhat.com>
      28682019
    • E
      fanotify: implement fanotify listener ordering · 4231a235
      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: NEric Paris <eparis@redhat.com>
      4231a235
  4. 28 8月, 2010 1 次提交
  5. 23 8月, 2010 1 次提交
    • E
      fanotify: flush outstanding perm requests on group destroy · 2eebf582
      Eric Paris 提交于
      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: NAndreas Gruenbacher <agruen@suse.de>
      Cc: Andreas Gruenbacher <agruen@suse.de>
      Signed-off-by: NEric Paris <eparis@redhat.com>
      2eebf582
  6. 28 7月, 2010 13 次提交
    • E
      fanotify: userspace interface for permission responses · b2d87909
      Eric Paris 提交于
      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: NEric Paris <eparis@redhat.com>
      b2d87909
    • E
      fanotify: permissions and blocking · 9e66e423
      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: NEric Paris <eparis@redhat.com>
      9e66e423
    • E
      fanotify: clear all fanotify marks · 4d92604c
      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: NEric Paris <eparis@redhat.com>
      4d92604c
    • E
      fanotify: allow ignored_masks to survive modify · c9778a98
      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: NEric Paris <eparis@redhat.com>
      c9778a98
    • E
      fanotify: allow users to set an ignored_mask · b9e4e3bd
      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: NEric Paris <eparis@redhat.com>
      b9e4e3bd
    • A
      fanotify: remove fanotify.h declarations · 88380fe6
      Andreas Gruenbacher 提交于
      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: NAndreas Gruenbacher <agruen@suse.de>
      Signed-off-by: NEric Paris <eparis@redhat.com>
      88380fe6
    • A
      fanotify: rename FAN_MARK_ON_VFSMOUNT to FAN_MARK_MOUNT · eac8e9e8
      Andreas Gruenbacher 提交于
      the term 'vfsmount' isn't sensicle to userspace.  instead call is 'mount.
      Signed-off-by: NAndreas Gruenbacher <agruen@suse.de>
      Signed-off-by: NEric Paris <eparis@redhat.com>
      eac8e9e8
    • E
      fanotify: hooks the fanotify_mark syscall to the vfsmount code · 0ff21db9
      Eric Paris 提交于
      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: NEric Paris <eparis@redhat.com>
      0ff21db9
    • A
      fanotify: Add pids to events · 32c32632
      Andreas Gruenbacher 提交于
      Pass the process identifiers of the triggering processes to fanotify
      listeners: this information is useful for event filtering and logging.
      Signed-off-by: NAndreas Gruenbacher <agruen@suse.de>
      Signed-off-by: NEric Paris <eparis@redhat.com>
      32c32632
    • E
      fanotify: send events using read · a1014f10
      Eric Paris 提交于
      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: NEric Paris <eparis@redhat.com>
      a1014f10
    • E
      fanotify: fanotify_mark syscall implementation · 2a3edf86
      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: NEric Paris <eparis@redhat.com>
      2a3edf86
    • E
      fanotify: fanotify_init syscall implementation · 52c923dd
      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: NEric Paris <eparis@redhat.com>
      52c923dd
    • E
      fanotify: fscking all notification system · ff0b16a9
      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: NEric Paris <eparis@redhat.com>
      ff0b16a9