Skip to content

Commit

Permalink
inotify: do not reuse watch descriptors
Browse files Browse the repository at this point in the history
Prior to 2.6.31 inotify would not reuse watch descriptors until all of
them had been used at least once.  After the rewrite inotify would reuse
watch descriptors.  The selinux utility 'restorecond' was found to have
problems when watch descriptors were reused.  This patch reverts to the
pre inotify rewrite behavior to not reuse watch descriptors.

Signed-off-by: Eric Paris <eparis@redhat.com>
  • Loading branch information
Eric Paris committed Jul 28, 2010
1 parent 6f3a539 commit 7050c48
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions fs/notify/inotify/inotify_user.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ static int inotify_find_inode(const char __user *dirname, struct path *path, uns
}

static int inotify_add_to_idr(struct idr *idr, spinlock_t *idr_lock,
int last_wd,
int *last_wd,
struct inotify_inode_mark_entry *ientry)
{
int ret;
Expand All @@ -368,11 +368,13 @@ static int inotify_add_to_idr(struct idr *idr, spinlock_t *idr_lock,
return -ENOMEM;

spin_lock(idr_lock);
ret = idr_get_new_above(idr, ientry, last_wd + 1,
ret = idr_get_new_above(idr, ientry, *last_wd + 1,
&ientry->wd);
/* we added the mark to the idr, take a reference */
if (!ret)
if (!ret) {
fsnotify_get_mark(&ientry->fsn_entry);
*last_wd = ientry->wd;
}
spin_unlock(idr_lock);
} while (ret == -EAGAIN);

Expand Down Expand Up @@ -647,7 +649,7 @@ static int inotify_new_watch(struct fsnotify_group *group,
if (atomic_read(&group->inotify_data.user->inotify_watches) >= inotify_max_user_watches)
goto out_err;

ret = inotify_add_to_idr(idr, idr_lock, group->inotify_data.last_wd,
ret = inotify_add_to_idr(idr, idr_lock, &group->inotify_data.last_wd,
tmp_ientry);
if (ret)
goto out_err;
Expand All @@ -660,9 +662,6 @@ static int inotify_new_watch(struct fsnotify_group *group,
goto out_err;
}

/* update the idr hint, who cares about races, it's just a hint */
group->inotify_data.last_wd = tmp_ientry->wd;

/* increment the number of watches the user has */
atomic_inc(&group->inotify_data.user->inotify_watches);

Expand Down

0 comments on commit 7050c48

Please sign in to comment.