goto out_err;
 
        /* we are on the idr, now get on the inode */
-       ret = fsnotify_add_mark(&tmp_i_mark->fsn_mark, group, inode, NULL, 0);
+       ret = fsnotify_add_mark_locked(&tmp_i_mark->fsn_mark, group, inode,
+                                      NULL, 0);
        if (ret) {
                /* we failed to get on the inode, get off the idr */
                inotify_remove_from_idr(group, tmp_i_mark);
 {
        int ret = 0;
 
-retry:
+       mutex_lock(&group->mark_mutex);
        /* try to update and existing watch with the new arg */
        ret = inotify_update_existing_watch(group, inode, arg);
        /* no mark present, try to add a new one */
        if (ret == -ENOENT)
                ret = inotify_new_watch(group, inode, arg);
-       /*
-        * inotify_new_watch could race with another thread which did an
-        * inotify_new_watch between the update_existing and the add watch
-        * here, go back and try to update an existing mark again.
-        */
-       if (ret == -EEXIST)
-               goto retry;
+       mutex_unlock(&group->mark_mutex);
 
        return ret;
 }