/* * Final freeing of a group */ void fsnotify_final_destroy_group(struct fsnotify_group *group) { /* clear the notification queue of all events */ fsnotify_flush_notify(group); if (group->ops->free_group_priv) group->ops->free_group_priv(group); kfree(group); }
/* * Trying to get rid of a group. Remove all marks, flush all events and release * the group reference. * Note that another thread calling fsnotify_clear_marks_by_group() may still * hold a ref to the group. */ void fsnotify_destroy_group(struct fsnotify_group *group) { /* clear all inode marks for this group */ fsnotify_clear_marks_by_group(group); synchronize_srcu(&fsnotify_mark_srcu); /* clear the notification queue of all events */ fsnotify_flush_notify(group); fsnotify_put_group(group); }
/* * Trying to get rid of a group. Remove all marks, flush all events and release * the group reference. * Note that another thread calling fsnotify_clear_marks_by_group() may still * hold a ref to the group. */ void fsnotify_destroy_group(struct fsnotify_group *group) { /* clear all inode marks for this group */ fsnotify_clear_marks_by_group(group); synchronize_srcu(&fsnotify_mark_srcu); /* clear the notification queue of all events */ fsnotify_flush_notify(group); /* * Destroy overflow event (we cannot use fsnotify_destroy_event() as * that deliberately ignores overflow events. */ if (group->overflow_event) group->ops->free_event(group->overflow_event); fsnotify_put_group(group); }