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: Miklos Szeredi <mszeredi@redhat.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
755b5bc681
commit
0810b4f9f2
|
@ -224,42 +224,6 @@ void fsnotify_destroy_mark(struct fsnotify_mark *mark,
|
||||||
fsnotify_free_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)
|
void fsnotify_connector_free(struct fsnotify_mark_connector **connp)
|
||||||
{
|
{
|
||||||
if (*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.
|
* Nothing fancy, just initialize lists and locks and counters.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue