Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 207651
b: refs/heads/master
c: ff0b16a
h: refs/heads/master
i:
  207649: 0b1d75c
  207647: 006ebcc
v: v3
  • Loading branch information
Eric Paris committed Jul 28, 2010
1 parent fcb4a3a commit d6de7dc
Show file tree
Hide file tree
Showing 9 changed files with 146 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 12ed2e36c98aec6c41559222e311f4aa15d254b6
refs/heads/master: ff0b16a9850e8a240ad59e10b0a1291a8fcf7cbc
1 change: 1 addition & 0 deletions trunk/fs/notify/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ config FSNOTIFY

source "fs/notify/dnotify/Kconfig"
source "fs/notify/inotify/Kconfig"
source "fs/notify/fanotify/Kconfig"
1 change: 1 addition & 0 deletions trunk/fs/notify/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,4 @@ obj-$(CONFIG_FSNOTIFY) += fsnotify.o notification.o group.o inode_mark.o

obj-y += dnotify/
obj-y += inotify/
obj-y += fanotify/
11 changes: 11 additions & 0 deletions trunk/fs/notify/fanotify/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
config FANOTIFY
bool "Filesystem wide access notification"
select FSNOTIFY
default y
---help---
Say Y here to enable fanotify suport. fanotify is a file access
notification system which differs from inotify in that it sends
and open file descriptor to the userspace listener along with
the event.

If unsure, say Y.
1 change: 1 addition & 0 deletions trunk/fs/notify/fanotify/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
obj-$(CONFIG_FANOTIFY) += fanotify.o
78 changes: 78 additions & 0 deletions trunk/fs/notify/fanotify/fanotify.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#include <linux/fdtable.h>
#include <linux/fsnotify_backend.h>
#include <linux/init.h>
#include <linux/kernel.h> /* UINT_MAX */
#include <linux/types.h>

#include "fanotify.h"

static int fanotify_handle_event(struct fsnotify_group *group, struct fsnotify_event *event)
{
int ret;


BUILD_BUG_ON(FAN_ACCESS != FS_ACCESS);
BUILD_BUG_ON(FAN_MODIFY != FS_MODIFY);
BUILD_BUG_ON(FAN_CLOSE_NOWRITE != FS_CLOSE_NOWRITE);
BUILD_BUG_ON(FAN_CLOSE_WRITE != FS_CLOSE_WRITE);
BUILD_BUG_ON(FAN_OPEN != FS_OPEN);
BUILD_BUG_ON(FAN_EVENT_ON_CHILD != FS_EVENT_ON_CHILD);
BUILD_BUG_ON(FAN_Q_OVERFLOW != FS_Q_OVERFLOW);

pr_debug("%s: group=%p event=%p\n", __func__, group, event);

ret = fsnotify_add_notify_event(group, event, NULL, NULL);

return ret;
}

static bool fanotify_should_send_event(struct fsnotify_group *group, struct inode *inode,
struct vfsmount *mnt, __u32 mask, void *data,
int data_type)
{
struct fsnotify_mark *fsn_mark;
bool send;

pr_debug("%s: group=%p inode=%p mask=%x data=%p data_type=%d\n",
__func__, group, inode, mask, data, data_type);

/* sorry, fanotify only gives a damn about files and dirs */
if (!S_ISREG(inode->i_mode) &&
!S_ISDIR(inode->i_mode))
return false;

/* if we don't have enough info to send an event to userspace say no */
if (data_type != FSNOTIFY_EVENT_PATH)
return false;

fsn_mark = fsnotify_find_mark(group, inode);
if (!fsn_mark)
return false;

/* if the event is for a child and this inode doesn't care about
* events on the child, don't send it! */
if ((mask & FS_EVENT_ON_CHILD) &&
!(fsn_mark->mask & FS_EVENT_ON_CHILD)) {
send = false;
} else {
/*
* We care about children, but do we care about this particular
* type of event?
*/
mask = (mask & ~FS_EVENT_ON_CHILD);
send = (fsn_mark->mask & mask);
}

/* find took a reference */
fsnotify_put_mark(fsn_mark);

return send;
}

const struct fsnotify_ops fanotify_fsnotify_ops = {
.handle_event = fanotify_handle_event,
.should_send_event = fanotify_should_send_event,
.free_group_priv = NULL,
.free_event_priv = NULL,
.freeing_mark = NULL,
};
12 changes: 12 additions & 0 deletions trunk/fs/notify/fanotify/fanotify.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#include <linux/fanotify.h>
#include <linux/fsnotify_backend.h>
#include <linux/net.h>
#include <linux/kernel.h>
#include <linux/types.h>

static inline bool fanotify_mask_valid(__u32 mask)
{
if (mask & ~((__u32)FAN_ALL_INCOMING_EVENTS))
return false;
return true;
}
1 change: 1 addition & 0 deletions trunk/include/linux/Kbuild
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ unifdef-y += ethtool.h
unifdef-y += eventpoll.h
unifdef-y += signalfd.h
unifdef-y += ext2_fs.h
unifdef-y += fanotify.h
unifdef-y += fb.h
unifdef-y += fcntl.h
unifdef-y += filter.h
Expand Down
40 changes: 40 additions & 0 deletions trunk/include/linux/fanotify.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#ifndef _LINUX_FANOTIFY_H
#define _LINUX_FANOTIFY_H

#include <linux/types.h>

/* the following events that user-space can register for */
#define FAN_ACCESS 0x00000001 /* File was accessed */
#define FAN_MODIFY 0x00000002 /* File was modified */
#define FAN_CLOSE_WRITE 0x00000008 /* Unwrittable file closed */
#define FAN_CLOSE_NOWRITE 0x00000010 /* Writtable file closed */
#define FAN_OPEN 0x00000020 /* File was opened */

#define FAN_EVENT_ON_CHILD 0x08000000 /* interested in child events */

/* FIXME currently Q's have no limit.... */
#define FAN_Q_OVERFLOW 0x00004000 /* Event queued overflowed */

/* helper events */
#define FAN_CLOSE (FAN_CLOSE_WRITE | FAN_CLOSE_NOWRITE) /* close */

/*
* All of the events - we build the list by hand so that we can add flags in
* the future and not break backward compatibility. Apps will get only the
* events that they originally wanted. Be sure to add new events here!
*/
#define FAN_ALL_EVENTS (FAN_ACCESS |\
FAN_MODIFY |\
FAN_CLOSE |\
FAN_OPEN)

/*
* All legal FAN bits userspace can request (although possibly not all
* at the same time.
*/
#define FAN_ALL_INCOMING_EVENTS (FAN_ALL_EVENTS |\
FAN_EVENT_ON_CHILD)
#ifdef __KERNEL__

#endif /* __KERNEL__ */
#endif /* _LINUX_FANOTIFY_H */

0 comments on commit d6de7dc

Please sign in to comment.