Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0810b4f9 authored by Jan Kara's avatar Jan Kara
Browse files

fsnotify: Move fsnotify_destroy_marks()



Move fsnotify_destroy_marks() to be later in the fs/notify/mark.c. It
will need some functions that are declared after its current
declaration. No functional change.

Reviewed-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
Reviewed-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 755b5bc6
Loading
Loading
Loading
Loading
+36 −36
Original line number Diff line number Diff line
@@ -224,42 +224,6 @@ void fsnotify_destroy_mark(struct fsnotify_mark *mark,
	fsnotify_free_mark(mark);
}

void fsnotify_destroy_marks(struct fsnotify_mark_connector *conn,
			    spinlock_t *lock)
{
	struct fsnotify_mark *mark;

	if (!conn)
		return;

	while (1) {
		/*
		 * We have to be careful since we can race with e.g.
		 * fsnotify_clear_marks_by_group() and once we drop 'lock',
		 * mark can get removed from the obj_list and destroyed. But
		 * we are holding mark reference so mark cannot be freed and
		 * calling fsnotify_destroy_mark() more than once is fine.
		 */
		spin_lock(lock);
		if (hlist_empty(&conn->list)) {
			spin_unlock(lock);
			break;
		}
		mark = hlist_entry(conn->list.first, struct fsnotify_mark,
				   obj_list);
		/*
		 * We don't update i_fsnotify_mask / mnt_fsnotify_mask here
		 * since inode / mount is going away anyway. So just remove
		 * mark from the list.
		 */
		hlist_del_init_rcu(&mark->obj_list);
		fsnotify_get_mark(mark);
		spin_unlock(lock);
		fsnotify_destroy_mark(mark, mark->group);
		fsnotify_put_mark(mark);
	}
}

void fsnotify_connector_free(struct fsnotify_mark_connector **connp)
{
	if (*connp) {
@@ -580,6 +544,42 @@ void fsnotify_detach_group_marks(struct fsnotify_group *group)
	}
}

void fsnotify_destroy_marks(struct fsnotify_mark_connector *conn,
			    spinlock_t *lock)
{
	struct fsnotify_mark *mark;

	if (!conn)
		return;

	while (1) {
		/*
		 * We have to be careful since we can race with e.g.
		 * fsnotify_clear_marks_by_group() and once we drop 'lock',
		 * mark can get removed from the obj_list and destroyed. But
		 * we are holding mark reference so mark cannot be freed and
		 * calling fsnotify_destroy_mark() more than once is fine.
		 */
		spin_lock(lock);
		if (hlist_empty(&conn->list)) {
			spin_unlock(lock);
			break;
		}
		mark = hlist_entry(conn->list.first, struct fsnotify_mark,
				   obj_list);
		/*
		 * We don't update i_fsnotify_mask / mnt_fsnotify_mask here
		 * since inode / mount is going away anyway. So just remove
		 * mark from the list.
		 */
		hlist_del_init_rcu(&mark->obj_list);
		fsnotify_get_mark(mark);
		spin_unlock(lock);
		fsnotify_destroy_mark(mark, mark->group);
		fsnotify_put_mark(mark);
	}
}

/*
 * Nothing fancy, just initialize lists and locks and counters.
 */