__u64 mask, int dfd,
const char __user * pathname)
{
- struct inode *inode;
+ struct inode *inode = NULL;
+ struct vfsmount *mnt = NULL;
struct fsnotify_group *group;
struct file *filp;
struct path path;
goto fput_and_out;
/* inode held in place by reference to path; group by fget on fd */
- inode = path.dentry->d_inode;
+ if (!(flags & FAN_MARK_ON_VFSMOUNT))
+ inode = path.dentry->d_inode;
+ else
+ mnt = path.mnt;
group = filp->private_data;
/* create/update an inode mark */
switch (flags & (FAN_MARK_ADD | FAN_MARK_REMOVE)) {
case FAN_MARK_ADD:
- ret = fanotify_add_inode_mark(group, inode, mask);
+ if (flags & FAN_MARK_ON_VFSMOUNT)
+ ret = fanotify_add_vfsmount_mark(group, mnt, mask);
+ else
+ ret = fanotify_add_inode_mark(group, inode, mask);
break;
case FAN_MARK_REMOVE:
- ret = fanotify_remove_mark(group, inode, NULL, mask);
+ ret = fanotify_remove_mark(group, inode, mnt, mask);
break;
default:
ret = -EINVAL;
#define FAN_MARK_REMOVE 0x00000002
#define FAN_MARK_DONT_FOLLOW 0x00000004
#define FAN_MARK_ONLYDIR 0x00000008
+#define FAN_MARK_ON_VFSMOUNT 0x00000010
#define FAN_ALL_MARK_FLAGS (FAN_MARK_ADD |\
FAN_MARK_REMOVE |\
FAN_MARK_DONT_FOLLOW |\
- FAN_MARK_ONLYDIR)
+ FAN_MARK_ONLYDIR |\
+ FAN_MARK_ON_VFSMOUNT)
/*
* All of the events - we build the list by hand so that we can add flags in