Lines Matching refs:mark
94 void fsnotify_get_mark(struct fsnotify_mark *mark) in fsnotify_get_mark() argument
96 WARN_ON_ONCE(!refcount_read(&mark->refcnt)); in fsnotify_get_mark()
97 refcount_inc(&mark->refcnt); in fsnotify_get_mark()
234 struct fsnotify_mark *mark; in __fsnotify_recalc_mask() local
240 hlist_for_each_entry(mark, &conn->list, obj_list) { in __fsnotify_recalc_mask()
241 if (!(mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED)) in __fsnotify_recalc_mask()
243 new_mask |= fsnotify_calc_mask(mark); in __fsnotify_recalc_mask()
245 !(mark->flags & FSNOTIFY_MARK_FLAG_NO_IREF)) in __fsnotify_recalc_mask()
353 static void fsnotify_final_mark_destroy(struct fsnotify_mark *mark) in fsnotify_final_mark_destroy() argument
355 struct fsnotify_group *group = mark->group; in fsnotify_final_mark_destroy()
359 group->ops->free_mark(mark); in fsnotify_final_mark_destroy()
374 void fsnotify_put_mark(struct fsnotify_mark *mark) in fsnotify_put_mark() argument
376 struct fsnotify_mark_connector *conn = READ_ONCE(mark->connector); in fsnotify_put_mark()
383 if (refcount_dec_and_test(&mark->refcnt)) in fsnotify_put_mark()
384 fsnotify_final_mark_destroy(mark); in fsnotify_put_mark()
392 if (!refcount_dec_and_lock(&mark->refcnt, &conn->lock)) in fsnotify_put_mark()
395 hlist_del_init_rcu(&mark->obj_list); in fsnotify_put_mark()
408 WRITE_ONCE(mark->connector, NULL); in fsnotify_put_mark()
427 list_add(&mark->g_list, &destroy_list); in fsnotify_put_mark()
441 static bool fsnotify_get_mark_safe(struct fsnotify_mark *mark) in fsnotify_get_mark_safe() argument
443 if (!mark) in fsnotify_get_mark_safe()
446 if (refcount_inc_not_zero(&mark->refcnt)) { in fsnotify_get_mark_safe()
447 spin_lock(&mark->lock); in fsnotify_get_mark_safe()
448 if (mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED) { in fsnotify_get_mark_safe()
450 atomic_inc(&mark->group->user_waits); in fsnotify_get_mark_safe()
451 spin_unlock(&mark->lock); in fsnotify_get_mark_safe()
454 spin_unlock(&mark->lock); in fsnotify_get_mark_safe()
455 fsnotify_put_mark(mark); in fsnotify_get_mark_safe()
465 static void fsnotify_put_mark_wake(struct fsnotify_mark *mark) in fsnotify_put_mark_wake() argument
467 if (mark) { in fsnotify_put_mark_wake()
468 struct fsnotify_group *group = mark->group; in fsnotify_put_mark_wake()
470 fsnotify_put_mark(mark); in fsnotify_put_mark_wake()
528 void fsnotify_detach_mark(struct fsnotify_mark *mark) in fsnotify_detach_mark() argument
530 fsnotify_group_assert_locked(mark->group); in fsnotify_detach_mark()
532 refcount_read(&mark->refcnt) < 1 + in fsnotify_detach_mark()
533 !!(mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED)); in fsnotify_detach_mark()
535 spin_lock(&mark->lock); in fsnotify_detach_mark()
537 if (!(mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED)) { in fsnotify_detach_mark()
538 spin_unlock(&mark->lock); in fsnotify_detach_mark()
541 mark->flags &= ~FSNOTIFY_MARK_FLAG_ATTACHED; in fsnotify_detach_mark()
542 list_del_init(&mark->g_list); in fsnotify_detach_mark()
543 spin_unlock(&mark->lock); in fsnotify_detach_mark()
546 fsnotify_put_mark(mark); in fsnotify_detach_mark()
557 void fsnotify_free_mark(struct fsnotify_mark *mark) in fsnotify_free_mark() argument
559 struct fsnotify_group *group = mark->group; in fsnotify_free_mark()
561 spin_lock(&mark->lock); in fsnotify_free_mark()
563 if (!(mark->flags & FSNOTIFY_MARK_FLAG_ALIVE)) { in fsnotify_free_mark()
564 spin_unlock(&mark->lock); in fsnotify_free_mark()
567 mark->flags &= ~FSNOTIFY_MARK_FLAG_ALIVE; in fsnotify_free_mark()
568 spin_unlock(&mark->lock); in fsnotify_free_mark()
576 group->ops->freeing_mark(mark, group); in fsnotify_free_mark()
579 void fsnotify_destroy_mark(struct fsnotify_mark *mark, in fsnotify_destroy_mark() argument
583 fsnotify_detach_mark(mark); in fsnotify_destroy_mark()
585 fsnotify_free_mark(mark); in fsnotify_destroy_mark()
704 static int fsnotify_add_mark_list(struct fsnotify_mark *mark, void *obj, in fsnotify_add_mark_list() argument
729 spin_lock(&mark->lock); in fsnotify_add_mark_list()
732 spin_unlock(&mark->lock); in fsnotify_add_mark_list()
741 hlist_add_head_rcu(&mark->obj_list, &conn->list); in fsnotify_add_mark_list()
749 if ((lmark->group == mark->group) && in fsnotify_add_mark_list()
751 !(mark->group->flags & FSNOTIFY_GROUP_DUPS)) { in fsnotify_add_mark_list()
756 cmp = fsnotify_compare_groups(lmark->group, mark->group); in fsnotify_add_mark_list()
758 hlist_add_before_rcu(&mark->obj_list, &lmark->obj_list); in fsnotify_add_mark_list()
765 hlist_add_behind_rcu(&mark->obj_list, &last->obj_list); in fsnotify_add_mark_list()
773 WRITE_ONCE(mark->connector, conn); in fsnotify_add_mark_list()
776 spin_unlock(&mark->lock); in fsnotify_add_mark_list()
785 int fsnotify_add_mark_locked(struct fsnotify_mark *mark, in fsnotify_add_mark_locked() argument
789 struct fsnotify_group *group = mark->group; in fsnotify_add_mark_locked()
800 spin_lock(&mark->lock); in fsnotify_add_mark_locked()
801 mark->flags |= FSNOTIFY_MARK_FLAG_ALIVE | FSNOTIFY_MARK_FLAG_ATTACHED; in fsnotify_add_mark_locked()
803 list_add(&mark->g_list, &group->marks_list); in fsnotify_add_mark_locked()
804 fsnotify_get_mark(mark); /* for g_list */ in fsnotify_add_mark_locked()
805 spin_unlock(&mark->lock); in fsnotify_add_mark_locked()
807 ret = fsnotify_add_mark_list(mark, obj, obj_type, add_flags); in fsnotify_add_mark_locked()
811 fsnotify_recalc_mask(mark->connector); in fsnotify_add_mark_locked()
815 spin_lock(&mark->lock); in fsnotify_add_mark_locked()
816 mark->flags &= ~(FSNOTIFY_MARK_FLAG_ALIVE | in fsnotify_add_mark_locked()
818 list_del_init(&mark->g_list); in fsnotify_add_mark_locked()
819 spin_unlock(&mark->lock); in fsnotify_add_mark_locked()
821 fsnotify_put_mark(mark); in fsnotify_add_mark_locked()
825 int fsnotify_add_mark(struct fsnotify_mark *mark, void *obj, in fsnotify_add_mark() argument
829 struct fsnotify_group *group = mark->group; in fsnotify_add_mark()
832 ret = fsnotify_add_mark_locked(mark, obj, obj_type, add_flags); in fsnotify_add_mark()
847 struct fsnotify_mark *mark; in fsnotify_find_mark() local
856 hlist_for_each_entry(mark, &conn->list, obj_list) { in fsnotify_find_mark()
857 if (mark->group == group && in fsnotify_find_mark()
858 (mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED)) { in fsnotify_find_mark()
859 fsnotify_get_mark(mark); in fsnotify_find_mark()
861 return mark; in fsnotify_find_mark()
873 struct fsnotify_mark *lmark, *mark; in fsnotify_clear_marks_by_group() local
892 list_for_each_entry_safe(mark, lmark, &group->marks_list, g_list) { in fsnotify_clear_marks_by_group()
893 if (mark->connector->type == obj_type) in fsnotify_clear_marks_by_group()
894 list_move(&mark->g_list, &to_free); in fsnotify_clear_marks_by_group()
905 mark = list_first_entry(head, struct fsnotify_mark, g_list); in fsnotify_clear_marks_by_group()
906 fsnotify_get_mark(mark); in fsnotify_clear_marks_by_group()
907 fsnotify_detach_mark(mark); in fsnotify_clear_marks_by_group()
909 fsnotify_free_mark(mark); in fsnotify_clear_marks_by_group()
910 fsnotify_put_mark(mark); in fsnotify_clear_marks_by_group()
918 struct fsnotify_mark *mark, *old_mark = NULL; in fsnotify_destroy_marks() local
932 hlist_for_each_entry(mark, &conn->list, obj_list) { in fsnotify_destroy_marks()
933 fsnotify_get_mark(mark); in fsnotify_destroy_marks()
937 old_mark = mark; in fsnotify_destroy_marks()
938 fsnotify_destroy_mark(mark, mark->group); in fsnotify_destroy_marks()
956 void fsnotify_init_mark(struct fsnotify_mark *mark, in fsnotify_init_mark() argument
959 memset(mark, 0, sizeof(*mark)); in fsnotify_init_mark()
960 spin_lock_init(&mark->lock); in fsnotify_init_mark()
961 refcount_set(&mark->refcnt, 1); in fsnotify_init_mark()
963 mark->group = group; in fsnotify_init_mark()
964 WRITE_ONCE(mark->connector, NULL); in fsnotify_init_mark()
974 struct fsnotify_mark *mark, *next; in fsnotify_mark_destroy_workfn() local
984 list_for_each_entry_safe(mark, next, &private_destroy_list, g_list) { in fsnotify_mark_destroy_workfn()
985 list_del_init(&mark->g_list); in fsnotify_mark_destroy_workfn()
986 fsnotify_final_mark_destroy(mark); in fsnotify_mark_destroy_workfn()