Lines Matching +full:flags +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0
101 * All flags that may be specified in parameter event_f_flags of fanotify_init.
103 * Internal and external open flags are stored together in field f_flags of
104 * struct file. Only external open flags shall be allowed in event_f_flags.
105 * Internal flags like FMODE_NONOTIFY, FMODE_EXEC, FMODE_NOCMTIME shall be
149 info->name_len); in fanotify_dir_name_info_len()
152 info->name2_len); in fanotify_dir_name_info_len()
167 if (fanotify_is_error_event(event->mask)) in fanotify_event_len()
173 (event->mask & FAN_ONDIR)) { in fanotify_event_len()
198 assert_spin_locked(&group->notification_lock); in fanotify_unhash_event()
203 if (WARN_ON_ONCE(hlist_unhashed(&event->merge_list))) in fanotify_unhash_event()
206 hlist_del_init(&event->merge_list); in fanotify_unhash_event()
225 spin_lock(&group->notification_lock); in get_one_event()
234 event = ERR_PTR(-EINVAL); in get_one_event()
243 if (fanotify_is_perm_event(event->mask)) in get_one_event()
244 FANOTIFY_PERM(event)->state = FAN_EVENT_REPORTED; in get_one_event()
245 if (fanotify_is_hashed_event(event->mask)) in get_one_event()
248 spin_unlock(&group->notification_lock); in get_one_event()
258 client_fd = get_unused_fd_flags(group->fanotify_data.f_flags); in create_fd()
267 group->fanotify_data.f_flags | __FMODE_NONOTIFY, in create_fd()
284 return -EINVAL; in process_access_response_info()
287 return -EFAULT; in process_access_response_info()
289 if (friar->hdr.type != FAN_RESPONSE_INFO_AUDIT_RULE) in process_access_response_info()
290 return -EINVAL; in process_access_response_info()
291 if (friar->hdr.pad != 0) in process_access_response_info()
292 return -EINVAL; in process_access_response_info()
293 if (friar->hdr.len != sizeof(*friar)) in process_access_response_info()
294 return -EINVAL; in process_access_response_info()
301 * drop group->notification_lock.
306 __releases(&group->notification_lock) in finish_permission_event()
310 assert_spin_locked(&group->notification_lock); in finish_permission_event()
311 event->response = response & ~FAN_INFO; in finish_permission_event()
313 memcpy(&event->audit_rule, friar, sizeof(*friar)); in finish_permission_event()
315 if (event->state == FAN_EVENT_CANCELED) in finish_permission_event()
318 event->state = FAN_EVENT_ANSWERED; in finish_permission_event()
319 spin_unlock(&group->notification_lock); in finish_permission_event()
321 fsnotify_destroy_event(group, &event->fae.fse); in finish_permission_event()
330 int fd = response_struct->fd; in process_access_response()
331 u32 response = response_struct->response; in process_access_response()
343 return -EINVAL; in process_access_response()
350 return -EINVAL; in process_access_response()
354 return -EINVAL; in process_access_response()
367 return -EINVAL; in process_access_response()
369 spin_lock(&group->notification_lock); in process_access_response()
370 list_for_each_entry(event, &group->fanotify_data.access_list, in process_access_response()
372 if (event->fd != fd) in process_access_response()
375 list_del_init(&event->fae.fse.list); in process_access_response()
377 wake_up(&group->fanotify_data.access_waitq); in process_access_response()
380 spin_unlock(&group->notification_lock); in process_access_response()
382 return -ENOENT; in process_access_response()
395 return -EFAULT; in copy_error_info_to_user()
397 info.error = fee->error; in copy_error_info_to_user()
398 info.error_count = fee->err_count; in copy_error_info_to_user()
401 return -EFAULT; in copy_error_info_to_user()
414 size_t fh_len = fh ? fh->len : 0; in copy_fid_info_to_user()
422 return -EFAULT; in copy_fid_info_to_user()
432 return -EFAULT; in copy_fid_info_to_user()
438 return -EFAULT; in copy_fid_info_to_user()
441 return -EFAULT; in copy_fid_info_to_user()
448 return -EFAULT; in copy_fid_info_to_user()
451 len -= sizeof(info); in copy_fid_info_to_user()
453 return -EFAULT; in copy_fid_info_to_user()
455 handle.handle_type = fh->type; in copy_fid_info_to_user()
463 return -EFAULT; in copy_fid_info_to_user()
466 len -= sizeof(handle); in copy_fid_info_to_user()
468 return -EFAULT; in copy_fid_info_to_user()
480 return -EFAULT; in copy_fid_info_to_user()
483 len -= fh_len; in copy_fid_info_to_user()
489 return -EFAULT; in copy_fid_info_to_user()
492 return -EFAULT; in copy_fid_info_to_user()
495 len -= name_len; in copy_fid_info_to_user()
501 return -EFAULT; in copy_fid_info_to_user()
514 return -EFAULT; in copy_pidfd_info_to_user()
521 return -EFAULT; in copy_pidfd_info_to_user()
542 info_type = info->name_len ? FAN_EVENT_INFO_TYPE_DFID_NAME : in copy_info_records_to_user()
546 if (event->mask & FAN_RENAME) in copy_info_records_to_user()
553 info->name_len, buf, count); in copy_info_records_to_user()
558 count -= ret; in copy_info_records_to_user()
569 info->name2_len, buf, count); in copy_info_records_to_user()
574 count -= ret; in copy_info_records_to_user()
589 (event->mask & FAN_ONDIR)) { in copy_info_records_to_user()
598 } else if ((event->mask & ALL_FSNOTIFY_DIRENT_EVENTS) || in copy_info_records_to_user()
599 (event->mask & FAN_ONDIR)) { in copy_info_records_to_user()
608 * With group flags FAN_REPORT_DIR_FID|FAN_REPORT_FID, in copy_info_records_to_user()
610 * non-directory, when there is no directory to report. in copy_info_records_to_user()
624 count -= ret; in copy_info_records_to_user()
634 count -= ret; in copy_info_records_to_user()
638 if (fanotify_is_error_event(event->mask)) { in copy_info_records_to_user()
643 count -= ret; in copy_info_records_to_user()
660 int ret, pidfd = -ESRCH, fd = -EBADF; in copy_event_to_user()
668 metadata.mask = event->mask & FANOTIFY_OUTGOING_EVENTS; in copy_event_to_user()
669 metadata.pid = pid_vnr(event->pid); in copy_event_to_user()
671 * For an unprivileged listener, event->pid can be used to identify the in copy_event_to_user()
676 task_tgid(current) != event->pid) in copy_event_to_user()
686 path && path->mnt && path->dentry) { in copy_event_to_user()
703 path->dentry, fd); in copy_event_to_user()
711 if (fd == -EOPENSTALE) in copy_event_to_user()
727 * creation of pidfds for thread-group leaders. in copy_event_to_user()
732 * The PIDTYPE_TGID check for an event->pid is performed in copy_event_to_user()
736 * report either -ESRCH or FAN_NOPIDFD to the event listener in in copy_event_to_user()
740 if (metadata.pid && pid_has_task(event->pid, PIDTYPE_TGID)) in copy_event_to_user()
741 pidfd = pidfd_prepare(event->pid, 0, &pidfd_file); in copy_event_to_user()
744 pidfd = pidfd == -ESRCH ? FAN_NOPIDFD : FAN_EPIDFD; in copy_event_to_user()
747 ret = -EFAULT; in copy_event_to_user()
759 count -= FAN_EVENT_METADATA_LEN; in copy_event_to_user()
774 if (fanotify_is_perm_event(event->mask)) in copy_event_to_user()
775 FANOTIFY_PERM(event)->fd = fd; in copy_event_to_user()
796 struct fsnotify_group *group = file->private_data; in fanotify_poll()
799 poll_wait(file, &group->notification_waitq, wait); in fanotify_poll()
800 spin_lock(&group->notification_lock); in fanotify_poll()
803 spin_unlock(&group->notification_lock); in fanotify_poll()
818 group = file->private_data; in fanotify_read()
822 add_wait_queue(&group->notification_waitq, &wait); in fanotify_read()
836 ret = -EAGAIN; in fanotify_read()
837 if (file->f_flags & O_NONBLOCK) in fanotify_read()
840 ret = -ERESTARTSYS; in fanotify_read()
857 if (!fanotify_is_perm_event(event->mask)) { in fanotify_read()
858 fsnotify_destroy_event(group, &event->fse); in fanotify_read()
860 if (ret <= 0 || FANOTIFY_PERM(event)->fd < 0) { in fanotify_read()
861 spin_lock(&group->notification_lock); in fanotify_read()
864 wake_up(&group->fanotify_data.access_waitq); in fanotify_read()
866 spin_lock(&group->notification_lock); in fanotify_read()
867 list_add_tail(&event->fse.list, in fanotify_read()
868 &group->fanotify_data.access_list); in fanotify_read()
869 spin_unlock(&group->notification_lock); in fanotify_read()
875 count -= ret; in fanotify_read()
877 remove_wait_queue(&group->notification_waitq, &wait); in fanotify_read()
879 if (start != buf && ret != -EFAULT) in fanotify_read()
880 ret = buf - start; in fanotify_read()
893 return -EINVAL; in fanotify_write()
895 group = file->private_data; in fanotify_write()
900 return -EINVAL; in fanotify_write()
903 return -EFAULT; in fanotify_write()
905 info_len = count - sizeof(response); in fanotify_write()
918 struct fsnotify_group *group = file->private_data; in fanotify_release()
932 spin_lock(&group->notification_lock); in fanotify_release()
933 while (!list_empty(&group->fanotify_data.access_list)) { in fanotify_release()
936 event = list_first_entry(&group->fanotify_data.access_list, in fanotify_release()
938 list_del_init(&event->fae.fse.list); in fanotify_release()
940 spin_lock(&group->notification_lock); in fanotify_release()
944 * Destroy all non-permission events. For permission events just in fanotify_release()
951 if (!(event->mask & FANOTIFY_PERM_EVENTS)) { in fanotify_release()
952 spin_unlock(&group->notification_lock); in fanotify_release()
958 spin_lock(&group->notification_lock); in fanotify_release()
960 spin_unlock(&group->notification_lock); in fanotify_release()
963 wake_up(&group->fanotify_data.access_waitq); in fanotify_release()
965 /* matches the fanotify_init->fsnotify_alloc_group */ in fanotify_release()
976 int ret = -ENOTTY; in fanotify_ioctl()
979 group = file->private_data; in fanotify_ioctl()
985 spin_lock(&group->notification_lock); in fanotify_ioctl()
986 list_for_each_entry(fsn_event, &group->notification_list, list) in fanotify_ioctl()
988 spin_unlock(&group->notification_lock); in fanotify_ioctl()
1009 struct path *path, unsigned int flags, __u64 mask, in fanotify_find_path() argument
1014 pr_debug("%s: dfd=%d filename=%p flags=%x\n", __func__, in fanotify_find_path()
1015 dfd, filename, flags); in fanotify_find_path()
1020 ret = -EBADF; in fanotify_find_path()
1024 ret = -ENOTDIR; in fanotify_find_path()
1025 if ((flags & FAN_MARK_ONLYDIR) && in fanotify_find_path()
1026 !(S_ISDIR(file_inode(f.file)->i_mode))) { in fanotify_find_path()
1031 *path = f.file->f_path; in fanotify_find_path()
1037 if (!(flags & FAN_MARK_DONT_FOLLOW)) in fanotify_find_path()
1039 if (flags & FAN_MARK_ONLYDIR) in fanotify_find_path()
1054 ret = security_path_notify(path, mask, obj_type); in fanotify_find_path()
1063 __u32 mask, unsigned int flags, in fanotify_mark_remove_from_mask() argument
1069 mask &= ~umask; in fanotify_mark_remove_from_mask()
1070 spin_lock(&fsn_mark->lock); in fanotify_mark_remove_from_mask()
1072 if (!(flags & FANOTIFY_MARK_IGNORE_BITS)) { in fanotify_mark_remove_from_mask()
1073 fsn_mark->mask &= ~mask; in fanotify_mark_remove_from_mask()
1075 fsn_mark->ignore_mask &= ~mask; in fanotify_mark_remove_from_mask()
1079 * We need to keep the mark around even if remaining mask cannot in fanotify_mark_remove_from_mask()
1080 * result in any events (e.g. mask == FAN_ONDIR) to support incremenal in fanotify_mark_remove_from_mask()
1081 * changes to the mask. in fanotify_mark_remove_from_mask()
1084 *destroy = !((fsn_mark->mask | fsn_mark->ignore_mask) & ~umask); in fanotify_mark_remove_from_mask()
1085 spin_unlock(&fsn_mark->lock); in fanotify_mark_remove_from_mask()
1091 fsnotify_connp_t *connp, __u32 mask, in fanotify_remove_mark() argument
1092 unsigned int flags, __u32 umask) in fanotify_remove_mark() argument
1102 return -ENOENT; in fanotify_remove_mark()
1105 removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags, in fanotify_remove_mark()
1107 if (removed & fsnotify_conn_mask(fsn_mark->connector)) in fanotify_remove_mark()
1108 fsnotify_recalc_mask(fsn_mark->connector); in fanotify_remove_mark()
1121 struct vfsmount *mnt, __u32 mask, in fanotify_remove_vfsmount_mark() argument
1122 unsigned int flags, __u32 umask) in fanotify_remove_vfsmount_mark() argument
1124 return fanotify_remove_mark(group, &real_mount(mnt)->mnt_fsnotify_marks, in fanotify_remove_vfsmount_mark()
1125 mask, flags, umask); in fanotify_remove_vfsmount_mark()
1129 struct super_block *sb, __u32 mask, in fanotify_remove_sb_mark() argument
1130 unsigned int flags, __u32 umask) in fanotify_remove_sb_mark() argument
1132 return fanotify_remove_mark(group, &sb->s_fsnotify_marks, mask, in fanotify_remove_sb_mark()
1133 flags, umask); in fanotify_remove_sb_mark()
1137 struct inode *inode, __u32 mask, in fanotify_remove_inode_mark() argument
1138 unsigned int flags, __u32 umask) in fanotify_remove_inode_mark() argument
1140 return fanotify_remove_mark(group, &inode->i_fsnotify_marks, mask, in fanotify_remove_inode_mark()
1141 flags, umask); in fanotify_remove_inode_mark()
1153 * independent event flags in ignore mask. After that, trying to in fanotify_mark_update_flags()
1154 * update the ignore mask with the old FAN_MARK_IGNORED_MASK API in fanotify_mark_update_flags()
1158 fsn_mark->flags |= FSNOTIFY_MARK_FLAG_HAS_IGNORE_FLAGS; in fanotify_mark_update_flags()
1162 * the removal of the FS_MODIFY bit in calculated mask if it was set in fanotify_mark_update_flags()
1163 * because of an ignore mask that is now going to survive FS_MODIFY. in fanotify_mark_update_flags()
1166 !(fsn_mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY)) { in fanotify_mark_update_flags()
1167 fsn_mark->flags |= FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY; in fanotify_mark_update_flags()
1168 if (!(fsn_mark->mask & FS_MODIFY)) in fanotify_mark_update_flags()
1172 if (fsn_mark->connector->type != FSNOTIFY_OBJ_TYPE_INODE || in fanotify_mark_update_flags()
1173 want_iref == !(fsn_mark->flags & FSNOTIFY_MARK_FLAG_NO_IREF)) in fanotify_mark_update_flags()
1181 fsn_mark->flags &= ~FSNOTIFY_MARK_FLAG_NO_IREF; in fanotify_mark_update_flags()
1187 __u32 mask, unsigned int fan_flags) in fanotify_mark_add_to_mask() argument
1191 spin_lock(&fsn_mark->lock); in fanotify_mark_add_to_mask()
1193 fsn_mark->mask |= mask; in fanotify_mark_add_to_mask()
1195 fsn_mark->ignore_mask |= mask; in fanotify_mark_add_to_mask()
1198 ~fsnotify_conn_mask(fsn_mark->connector); in fanotify_mark_add_to_mask()
1201 spin_unlock(&fsn_mark->lock); in fanotify_mark_add_to_mask()
1212 struct ucounts *ucounts = group->fanotify_data.ucounts; in fanotify_add_new_mark()
1222 !inc_ucount(ucounts->ns, ucounts->uid, UCOUNT_FANOTIFY_MARKS)) in fanotify_add_new_mark()
1223 return ERR_PTR(-ENOSPC); in fanotify_add_new_mark()
1227 ret = -ENOMEM; in fanotify_add_new_mark()
1233 mark->flags |= FSNOTIFY_MARK_FLAG_NO_IREF; in fanotify_add_new_mark()
1251 if (mempool_initialized(&group->fanotify_data.error_events_pool)) in fanotify_group_init_error_pool()
1254 return mempool_init_kmalloc_pool(&group->fanotify_data.error_events_pool, in fanotify_group_init_error_pool()
1266 !(fsn_mark->flags & FSNOTIFY_MARK_FLAG_NO_IREF)) in fanotify_may_update_existing_mark()
1267 return -EEXIST; in fanotify_may_update_existing_mark()
1270 * New ignore mask semantics cannot be downgraded to old semantics. in fanotify_may_update_existing_mark()
1273 fsn_mark->flags & FSNOTIFY_MARK_FLAG_HAS_IGNORE_FLAGS) in fanotify_may_update_existing_mark()
1274 return -EEXIST; in fanotify_may_update_existing_mark()
1277 * An ignore mask that survives modify could never be downgraded to not in fanotify_may_update_existing_mark()
1279 * explicit and return an error when trying to update the ignore mask in fanotify_may_update_existing_mark()
1284 fsn_mark->flags & FSNOTIFY_MARK_FLAG_IGNORED_SURV_MODIFY) in fanotify_may_update_existing_mark()
1285 return -EEXIST; in fanotify_may_update_existing_mark()
1292 __u32 mask, unsigned int fan_flags, in fanotify_add_mark() argument
1311 * Check if requested mark flags conflict with an existing mark flags. in fanotify_add_mark()
1318 * Error events are pre-allocated per group, only if strictly in fanotify_add_mark()
1322 (mask & FAN_FS_ERROR)) { in fanotify_add_mark()
1328 recalc = fanotify_mark_add_to_mask(fsn_mark, mask, fan_flags); in fanotify_add_mark()
1330 fsnotify_recalc_mask(fsn_mark->connector); in fanotify_add_mark()
1340 struct vfsmount *mnt, __u32 mask, in fanotify_add_vfsmount_mark() argument
1341 unsigned int flags, __kernel_fsid_t *fsid) in fanotify_add_vfsmount_mark() argument
1343 return fanotify_add_mark(group, &real_mount(mnt)->mnt_fsnotify_marks, in fanotify_add_vfsmount_mark()
1344 FSNOTIFY_OBJ_TYPE_VFSMOUNT, mask, flags, fsid); in fanotify_add_vfsmount_mark()
1348 struct super_block *sb, __u32 mask, in fanotify_add_sb_mark() argument
1349 unsigned int flags, __kernel_fsid_t *fsid) in fanotify_add_sb_mark() argument
1351 return fanotify_add_mark(group, &sb->s_fsnotify_marks, in fanotify_add_sb_mark()
1352 FSNOTIFY_OBJ_TYPE_SB, mask, flags, fsid); in fanotify_add_sb_mark()
1356 struct inode *inode, __u32 mask, in fanotify_add_inode_mark() argument
1357 unsigned int flags, __kernel_fsid_t *fsid) in fanotify_add_inode_mark() argument
1363 * an ignore mask, unless that ignore mask is supposed to survive in fanotify_add_inode_mark()
1366 if ((flags & FANOTIFY_MARK_IGNORE_BITS) && in fanotify_add_inode_mark()
1367 !(flags & FAN_MARK_IGNORED_SURV_MODIFY) && in fanotify_add_inode_mark()
1371 return fanotify_add_mark(group, &inode->i_fsnotify_marks, in fanotify_add_inode_mark()
1372 FSNOTIFY_OBJ_TYPE_INODE, mask, flags, fsid); in fanotify_add_inode_mark()
1384 oevent->type = FANOTIFY_EVENT_TYPE_OVERFLOW; in fanotify_alloc_overflow_event()
1386 return &oevent->fse; in fanotify_alloc_overflow_event()
1404 SYSCALL_DEFINE2(fanotify_init, unsigned int, flags, unsigned int, event_f_flags) in SYSCALL_DEFINE2() argument
1408 unsigned int fid_mode = flags & FANOTIFY_FID_BITS; in SYSCALL_DEFINE2()
1409 unsigned int class = flags & FANOTIFY_CLASS_BITS; in SYSCALL_DEFINE2()
1412 pr_debug("%s: flags=%x event_f_flags=%x\n", in SYSCALL_DEFINE2()
1413 __func__, flags, event_f_flags); in SYSCALL_DEFINE2()
1418 * limited functionality - an unprivileged group is limited to in SYSCALL_DEFINE2()
1422 if ((flags & FANOTIFY_ADMIN_INIT_FLAGS) || !fid_mode) in SYSCALL_DEFINE2()
1423 return -EPERM; in SYSCALL_DEFINE2()
1434 if (flags & ~(FANOTIFY_INIT_FLAGS | FAN_ENABLE_AUDIT)) in SYSCALL_DEFINE2()
1436 if (flags & ~FANOTIFY_INIT_FLAGS) in SYSCALL_DEFINE2()
1438 return -EINVAL; in SYSCALL_DEFINE2()
1441 * A pidfd can only be returned for a thread-group leader; thus in SYSCALL_DEFINE2()
1445 if ((flags & FAN_REPORT_PIDFD) && (flags & FAN_REPORT_TID)) in SYSCALL_DEFINE2()
1446 return -EINVAL; in SYSCALL_DEFINE2()
1449 return -EINVAL; in SYSCALL_DEFINE2()
1457 return -EINVAL; in SYSCALL_DEFINE2()
1461 return -EINVAL; in SYSCALL_DEFINE2()
1468 return -EINVAL; in SYSCALL_DEFINE2()
1477 return -EINVAL; in SYSCALL_DEFINE2()
1480 if (flags & FAN_CLOEXEC) in SYSCALL_DEFINE2()
1482 if (flags & FAN_NONBLOCK) in SYSCALL_DEFINE2()
1493 group->fanotify_data.ucounts = inc_ucount(current_user_ns(), in SYSCALL_DEFINE2()
1496 if (!group->fanotify_data.ucounts) { in SYSCALL_DEFINE2()
1497 fd = -EMFILE; in SYSCALL_DEFINE2()
1501 group->fanotify_data.flags = flags | internal_flags; in SYSCALL_DEFINE2()
1502 group->memcg = get_mem_cgroup_from_mm(current->mm); in SYSCALL_DEFINE2()
1504 group->fanotify_data.merge_hash = fanotify_alloc_merge_hash(); in SYSCALL_DEFINE2()
1505 if (!group->fanotify_data.merge_hash) { in SYSCALL_DEFINE2()
1506 fd = -ENOMEM; in SYSCALL_DEFINE2()
1510 group->overflow_event = fanotify_alloc_overflow_event(); in SYSCALL_DEFINE2()
1511 if (unlikely(!group->overflow_event)) { in SYSCALL_DEFINE2()
1512 fd = -ENOMEM; in SYSCALL_DEFINE2()
1518 group->fanotify_data.f_flags = event_f_flags; in SYSCALL_DEFINE2()
1519 init_waitqueue_head(&group->fanotify_data.access_waitq); in SYSCALL_DEFINE2()
1520 INIT_LIST_HEAD(&group->fanotify_data.access_list); in SYSCALL_DEFINE2()
1523 group->priority = FS_PRIO_0; in SYSCALL_DEFINE2()
1526 group->priority = FS_PRIO_1; in SYSCALL_DEFINE2()
1529 group->priority = FS_PRIO_2; in SYSCALL_DEFINE2()
1532 fd = -EINVAL; in SYSCALL_DEFINE2()
1536 if (flags & FAN_UNLIMITED_QUEUE) { in SYSCALL_DEFINE2()
1537 fd = -EPERM; in SYSCALL_DEFINE2()
1540 group->max_events = UINT_MAX; in SYSCALL_DEFINE2()
1542 group->max_events = fanotify_max_queued_events; in SYSCALL_DEFINE2()
1545 if (flags & FAN_UNLIMITED_MARKS) { in SYSCALL_DEFINE2()
1546 fd = -EPERM; in SYSCALL_DEFINE2()
1551 if (flags & FAN_ENABLE_AUDIT) { in SYSCALL_DEFINE2()
1552 fd = -EPERM; in SYSCALL_DEFINE2()
1580 if (!fsid->val[0] && !fsid->val[1]) in fanotify_test_fsid()
1581 return -ENODEV; in fanotify_test_fsid()
1587 err = vfs_get_fsid(dentry->d_sb->s_root, &root_fsid); in fanotify_test_fsid()
1591 if (root_fsid.val[0] != fsid->val[0] || in fanotify_test_fsid()
1592 root_fsid.val[1] != fsid->val[1]) in fanotify_test_fsid()
1593 return -EXDEV; in fanotify_test_fsid()
1599 static int fanotify_test_fid(struct dentry *dentry, unsigned int flags) in fanotify_test_fid() argument
1601 unsigned int mark_type = flags & FANOTIFY_MARK_TYPE_BITS; in fanotify_test_fid()
1602 const struct export_operations *nop = dentry->d_sb->s_export_op; in fanotify_test_fid()
1610 return -EOPNOTSUPP; in fanotify_test_fid()
1617 if (mark_type != FAN_MARK_INODE && !nop->fh_to_dentry) in fanotify_test_fid()
1618 return -EOPNOTSUPP; in fanotify_test_fid()
1624 const struct path *path, __u64 mask, in fanotify_events_supported() argument
1625 unsigned int flags) in fanotify_events_supported() argument
1627 unsigned int mark_type = flags & FANOTIFY_MARK_TYPE_BITS; in fanotify_events_supported()
1628 /* Strict validation of events in non-dir inode mask with v5.17+ APIs */ in fanotify_events_supported()
1630 (mask & FAN_RENAME) || in fanotify_events_supported()
1631 (flags & FAN_MARK_IGNORE); in fanotify_events_supported()
1636 * deadlocking the system - open done when reporting fanotify event in fanotify_events_supported()
1641 if (mask & FANOTIFY_PERM_EVENTS && in fanotify_events_supported()
1642 path->mnt->mnt_sb->s_type->fs_flags & FS_DISALLOW_NOTIFY_PERM) in fanotify_events_supported()
1643 return -EINVAL; in fanotify_events_supported()
1656 path->mnt->mnt_sb->s_flags & SB_NOUSER) in fanotify_events_supported()
1657 return -EINVAL; in fanotify_events_supported()
1661 * flags FAN_ONDIR and FAN_EVENT_ON_CHILD in mask of non-dir inode, in fanotify_events_supported()
1665 !d_is_dir(path->dentry) && (mask & FANOTIFY_DIRONLY_EVENT_BITS)) in fanotify_events_supported()
1666 return -ENOTDIR; in fanotify_events_supported()
1671 static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask, in do_fanotify_mark() argument
1681 unsigned int mark_type = flags & FANOTIFY_MARK_TYPE_BITS; in do_fanotify_mark()
1682 unsigned int mark_cmd = flags & FANOTIFY_MARK_CMD_BITS; in do_fanotify_mark()
1683 unsigned int ignore = flags & FANOTIFY_MARK_IGNORE_BITS; in do_fanotify_mark()
1688 pr_debug("%s: fanotify_fd=%d flags=%x dfd=%d pathname=%p mask=%llx\n", in do_fanotify_mark()
1689 __func__, fanotify_fd, flags, dfd, pathname, mask); in do_fanotify_mark()
1692 if (upper_32_bits(mask)) in do_fanotify_mark()
1693 return -EINVAL; in do_fanotify_mark()
1695 if (flags & ~FANOTIFY_MARK_FLAGS) in do_fanotify_mark()
1696 return -EINVAL; in do_fanotify_mark()
1709 return -EINVAL; in do_fanotify_mark()
1715 if (!mask) in do_fanotify_mark()
1716 return -EINVAL; in do_fanotify_mark()
1719 if (flags & ~(FANOTIFY_MARK_TYPE_BITS | FAN_MARK_FLUSH)) in do_fanotify_mark()
1720 return -EINVAL; in do_fanotify_mark()
1723 return -EINVAL; in do_fanotify_mark()
1729 if (mask & ~valid_mask) in do_fanotify_mark()
1730 return -EINVAL; in do_fanotify_mark()
1735 return -EINVAL; in do_fanotify_mark()
1738 * Event flags (FAN_ONDIR, FAN_EVENT_ON_CHILD) have no effect with in do_fanotify_mark()
1742 mask &= ~FANOTIFY_EVENT_FLAGS; in do_fanotify_mark()
1748 return -EBADF; in do_fanotify_mark()
1751 ret = -EINVAL; in do_fanotify_mark()
1752 if (unlikely(f.file->f_op != &fanotify_fops)) in do_fanotify_mark()
1754 group = f.file->private_data; in do_fanotify_mark()
1761 ret = -EPERM; in do_fanotify_mark()
1768 * group->priority == FS_PRIO_0 == FAN_CLASS_NOTIF. These are not in do_fanotify_mark()
1771 ret = -EINVAL; in do_fanotify_mark()
1772 if (mask & FANOTIFY_PERM_EVENTS && in do_fanotify_mark()
1773 group->priority == FS_PRIO_0) in do_fanotify_mark()
1776 if (mask & FAN_FS_ERROR && in do_fanotify_mark()
1784 if (flags & FAN_MARK_EVICTABLE && in do_fanotify_mark()
1790 * event->fd require a group that supports reporting fid. Those in do_fanotify_mark()
1796 if (mask & ~(FANOTIFY_FD_EVENTS|FANOTIFY_EVENT_FLAGS) && in do_fanotify_mark()
1805 if (mask & FAN_RENAME && !(fid_mode & FAN_REPORT_NAME)) in do_fanotify_mark()
1819 ret = fanotify_find_path(dfd, pathname, &path, flags, in do_fanotify_mark()
1820 (mask & ALL_FSNOTIFY_EVENTS), obj_type); in do_fanotify_mark()
1825 ret = fanotify_events_supported(group, &path, mask, flags); in do_fanotify_mark()
1835 ret = fanotify_test_fid(path.dentry, flags); in do_fanotify_mark()
1844 inode = path.dentry->d_inode; in do_fanotify_mark()
1848 ret = mnt ? -EINVAL : -EISDIR; in do_fanotify_mark()
1851 (mnt || S_ISDIR(inode->i_mode)) && in do_fanotify_mark()
1852 !(flags & FAN_MARK_IGNORED_SURV_MODIFY)) in do_fanotify_mark()
1855 /* Mask out FAN_EVENT_ON_CHILD flag for sb/mount/non-dir marks */ in do_fanotify_mark()
1856 if (mnt || !S_ISDIR(inode->i_mode)) { in do_fanotify_mark()
1857 mask &= ~FAN_EVENT_ON_CHILD; in do_fanotify_mark()
1861 * events with parent/name info for non-directory. in do_fanotify_mark()
1864 (flags & FAN_MARK_ADD) && !ignore) in do_fanotify_mark()
1865 mask |= FAN_EVENT_ON_CHILD; in do_fanotify_mark()
1872 ret = fanotify_add_vfsmount_mark(group, mnt, mask, in do_fanotify_mark()
1873 flags, fsid); in do_fanotify_mark()
1875 ret = fanotify_add_sb_mark(group, mnt->mnt_sb, mask, in do_fanotify_mark()
1876 flags, fsid); in do_fanotify_mark()
1878 ret = fanotify_add_inode_mark(group, inode, mask, in do_fanotify_mark()
1879 flags, fsid); in do_fanotify_mark()
1883 ret = fanotify_remove_vfsmount_mark(group, mnt, mask, in do_fanotify_mark()
1884 flags, umask); in do_fanotify_mark()
1886 ret = fanotify_remove_sb_mark(group, mnt->mnt_sb, mask, in do_fanotify_mark()
1887 flags, umask); in do_fanotify_mark()
1889 ret = fanotify_remove_inode_mark(group, inode, mask, in do_fanotify_mark()
1890 flags, umask); in do_fanotify_mark()
1893 ret = -EINVAL; in do_fanotify_mark()
1904 SYSCALL_DEFINE5(fanotify_mark, int, fanotify_fd, unsigned int, flags, in SYSCALL_DEFINE5() argument
1905 __u64, mask, int, dfd, in SYSCALL_DEFINE5() argument
1908 return do_fanotify_mark(fanotify_fd, flags, mask, dfd, pathname); in SYSCALL_DEFINE5()
1914 int, fanotify_fd, unsigned int, flags, in SYSCALL32_DEFINE6() argument
1915 SC_ARG64(mask), int, dfd, in SYSCALL32_DEFINE6() argument
1918 return do_fanotify_mark(fanotify_fd, flags, SC_VAL64(__u64, mask), in SYSCALL32_DEFINE6()
1924 * fanotify_user_setup - Our initialization function. Note that we cannot return
1925 * error because we have compiled-in VFS hooks. So an (unlikely) failure here
1940 max_marks = (((si.totalram - si.totalhigh) / 100) << PAGE_SHIFT) / in fanotify_user_setup()