|
@@ -636,7 +636,8 @@ static int inotify_new_watch(struct fsnotify_group *group,
|
|
|
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);
|
|
@@ -660,19 +661,13 @@ static int inotify_update_watch(struct fsnotify_group *group, struct inode *inod
|
|
|
{
|
|
|
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;
|
|
|
}
|