Messages in this thread | | | Subject | Re: [PATCH -v3 5/8] fsnotify: unified filesystem notification backend | From | Peter Zijlstra <> | Date | Thu, 27 Nov 2008 17:17:03 +0100 |
| |
On Tue, 2008-11-25 at 12:21 -0500, Eric Paris wrote: > +struct fsnotify_group *fsnotify_find_group(unsigned int group_num, unsigned long mask, struct fsnotify_ops *ops) > +{ > + struct fsnotify_group *group_iter; > + struct fsnotify_group *group = NULL; > + > + mutex_lock(&fsnotify_grp_mutex); > + list_for_each_entry_rcu(group_iter, &fsnotify_groups, group_list) { > + if (group_iter->group_num == group_num) { > + if ((group_iter->mask == mask) && > + (group_iter->ops == ops)) { > + fsnotify_get_group(group_iter); > + group = group_iter; > + } else > + group = ERR_PTR(-EEXIST); > + goto out; > + } > + } > + > + group = kmalloc(sizeof(struct fsnotify_group), GFP_KERNEL); > + if (!group) { > + group = ERR_PTR(-ENOMEM); > + goto out; > + } > + > + atomic_set(&group->refcnt, 1); > + > + group->group_num = group_num; > + group->mask = mask; > + > + mutex_init(&group->notification_mutex); > + INIT_LIST_HEAD(&group->notification_list); > + init_waitqueue_head(&group->notification_waitq); > + > + group->ops = ops; > + > + /* add it */ > + list_add_rcu(&group->group_list, &fsnotify_groups); > + > +out: > + mutex_unlock(&fsnotify_grp_mutex); > + fsnotify_recalc_global_mask(); > + return group; > +}
Can't you do a lockless lookup and handle the insertion race?
Also, since it creates the object if its not found, _find_ might not be the best name, how about obtain?
| |