return 0;
        }
 
-       fsnotify_foreach_obj_type(type) {
+       fsnotify_foreach_iter_type(type) {
                if (!fsnotify_iter_should_report_type(iter_info, type))
                        continue;
                mark = iter_info->marks[type];
                 * If the event is on a child and this mark is on a parent not
                 * watching children, don't send it!
                 */
-               if (type == FSNOTIFY_OBJ_TYPE_PARENT &&
+               if (type == FSNOTIFY_ITER_TYPE_PARENT &&
                    !(mark->mask & FS_EVENT_ON_CHILD))
                        continue;
 
        int type;
        __kernel_fsid_t fsid = {};
 
-       fsnotify_foreach_obj_type(type) {
+       fsnotify_foreach_iter_type(type) {
                struct fsnotify_mark_connector *conn;
 
                if (!fsnotify_iter_should_report_type(iter_info, type))
 
 
        /* clear ignored on inode modification */
        if (mask & FS_MODIFY) {
-               fsnotify_foreach_obj_type(type) {
+               fsnotify_foreach_iter_type(type) {
                        if (!fsnotify_iter_should_report_type(iter_info, type))
                                continue;
                        mark = iter_info->marks[type];
                }
        }
 
-       fsnotify_foreach_obj_type(type) {
+       fsnotify_foreach_iter_type(type) {
                if (!fsnotify_iter_should_report_type(iter_info, type))
                        continue;
                mark = iter_info->marks[type];
        int type;
 
        /* Choose max prio group among groups of all queue heads */
-       fsnotify_foreach_obj_type(type) {
+       fsnotify_foreach_iter_type(type) {
                mark = iter_info->marks[type];
                if (mark &&
                    fsnotify_compare_groups(max_prio_group, mark->group) > 0)
 
        /* Set the report mask for marks from same group as max prio group */
        iter_info->report_mask = 0;
-       fsnotify_foreach_obj_type(type) {
+       fsnotify_foreach_iter_type(type) {
                mark = iter_info->marks[type];
                if (mark &&
                    fsnotify_compare_groups(max_prio_group, mark->group) == 0)
 {
        int type;
 
-       fsnotify_foreach_obj_type(type) {
+       fsnotify_foreach_iter_type(type) {
                if (fsnotify_iter_should_report_type(iter_info, type))
                        iter_info->marks[type] =
                                fsnotify_next_mark(iter_info->marks[type]);
 
        iter_info.srcu_idx = srcu_read_lock(&fsnotify_mark_srcu);
 
-       iter_info.marks[FSNOTIFY_OBJ_TYPE_SB] =
+       iter_info.marks[FSNOTIFY_ITER_TYPE_SB] =
                fsnotify_first_mark(&sb->s_fsnotify_marks);
        if (mnt) {
-               iter_info.marks[FSNOTIFY_OBJ_TYPE_VFSMOUNT] =
+               iter_info.marks[FSNOTIFY_ITER_TYPE_VFSMOUNT] =
                        fsnotify_first_mark(&mnt->mnt_fsnotify_marks);
        }
        if (inode) {
-               iter_info.marks[FSNOTIFY_OBJ_TYPE_INODE] =
+               iter_info.marks[FSNOTIFY_ITER_TYPE_INODE] =
                        fsnotify_first_mark(&inode->i_fsnotify_marks);
        }
        if (parent) {
-               iter_info.marks[FSNOTIFY_OBJ_TYPE_PARENT] =
+               iter_info.marks[FSNOTIFY_ITER_TYPE_PARENT] =
                        fsnotify_first_mark(&parent->i_fsnotify_marks);
        }
 
 
 {
        int type;
 
-       fsnotify_foreach_obj_type(type) {
+       fsnotify_foreach_iter_type(type) {
                /* This can fail if mark is being removed */
                if (!fsnotify_get_mark_safe(iter_info->marks[type])) {
                        __release(&fsnotify_mark_srcu);
        int type;
 
        iter_info->srcu_idx = srcu_read_lock(&fsnotify_mark_srcu);
-       fsnotify_foreach_obj_type(type)
+       fsnotify_foreach_iter_type(type)
                fsnotify_put_mark_wake(iter_info->marks[type]);
 }
 
 
        }
 }
 
+/*
+ * Index to merged marks iterator array that correlates to a type of watch.
+ * The type of watched object can be deduced from the iterator type, but not
+ * the other way around, because an event can match different watched objects
+ * of the same object type.
+ * For example, both parent and child are watching an object of type inode.
+ */
+enum fsnotify_iter_type {
+       FSNOTIFY_ITER_TYPE_INODE,
+       FSNOTIFY_ITER_TYPE_VFSMOUNT,
+       FSNOTIFY_ITER_TYPE_SB,
+       FSNOTIFY_ITER_TYPE_PARENT,
+       FSNOTIFY_ITER_TYPE_COUNT
+};
+
+/* The type of object that a mark is attached to */
 enum fsnotify_obj_type {
        FSNOTIFY_OBJ_TYPE_ANY = -1,
        FSNOTIFY_OBJ_TYPE_INODE,
-       FSNOTIFY_OBJ_TYPE_PARENT,
        FSNOTIFY_OBJ_TYPE_VFSMOUNT,
        FSNOTIFY_OBJ_TYPE_SB,
        FSNOTIFY_OBJ_TYPE_COUNT,
 }
 
 struct fsnotify_iter_info {
-       struct fsnotify_mark *marks[FSNOTIFY_OBJ_TYPE_COUNT];
+       struct fsnotify_mark *marks[FSNOTIFY_ITER_TYPE_COUNT];
        unsigned int report_mask;
        int srcu_idx;
 };
 
 static inline bool fsnotify_iter_should_report_type(
-               struct fsnotify_iter_info *iter_info, int type)
+               struct fsnotify_iter_info *iter_info, int iter_type)
 {
-       return (iter_info->report_mask & (1U << type));
+       return (iter_info->report_mask & (1U << iter_type));
 }
 
 static inline void fsnotify_iter_set_report_type(
-               struct fsnotify_iter_info *iter_info, int type)
+               struct fsnotify_iter_info *iter_info, int iter_type)
 {
-       iter_info->report_mask |= (1U << type);
+       iter_info->report_mask |= (1U << iter_type);
 }
 
 static inline void fsnotify_iter_set_report_type_mark(
-               struct fsnotify_iter_info *iter_info, int type,
+               struct fsnotify_iter_info *iter_info, int iter_type,
                struct fsnotify_mark *mark)
 {
-       iter_info->marks[type] = mark;
-       iter_info->report_mask |= (1U << type);
+       iter_info->marks[iter_type] = mark;
+       iter_info->report_mask |= (1U << iter_type);
 }
 
 #define FSNOTIFY_ITER_FUNCS(name, NAME) \
 static inline struct fsnotify_mark *fsnotify_iter_##name##_mark( \
                struct fsnotify_iter_info *iter_info) \
 { \
-       return (iter_info->report_mask & (1U << FSNOTIFY_OBJ_TYPE_##NAME)) ? \
-               iter_info->marks[FSNOTIFY_OBJ_TYPE_##NAME] : NULL; \
+       return (iter_info->report_mask & (1U << FSNOTIFY_ITER_TYPE_##NAME)) ? \
+               iter_info->marks[FSNOTIFY_ITER_TYPE_##NAME] : NULL; \
 }
 
 FSNOTIFY_ITER_FUNCS(inode, INODE)
 FSNOTIFY_ITER_FUNCS(vfsmount, VFSMOUNT)
 FSNOTIFY_ITER_FUNCS(sb, SB)
 
-#define fsnotify_foreach_obj_type(type) \
-       for (type = 0; type < FSNOTIFY_OBJ_TYPE_COUNT; type++)
+#define fsnotify_foreach_iter_type(type) \
+       for (type = 0; type < FSNOTIFY_ITER_TYPE_COUNT; type++)
 
 /*
  * fsnotify_connp_t is what we embed in objects which connector can be attached