fsnotify: generalize iteration of marks by object type
Make some code that handles marks of object types inode and vfsmount generic, so it can handle other object types. Introduce fsnotify_foreach_obj_type macro to iterate marks by object type and fsnotify_iter_{should|set}_report_type macros to set/test report_mask. This is going to be used for adding mark of another object type (super block mark). Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
@@ -294,12 +294,12 @@ static void fsnotify_put_mark_wake(struct fsnotify_mark *mark)
|
||||
|
||||
bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info)
|
||||
{
|
||||
/* This can fail if mark is being removed */
|
||||
if (!fsnotify_get_mark_safe(iter_info->inode_mark))
|
||||
return false;
|
||||
if (!fsnotify_get_mark_safe(iter_info->vfsmount_mark)) {
|
||||
fsnotify_put_mark_wake(iter_info->inode_mark);
|
||||
return false;
|
||||
int type;
|
||||
|
||||
fsnotify_foreach_obj_type(type) {
|
||||
/* This can fail if mark is being removed */
|
||||
if (!fsnotify_get_mark_safe(iter_info->marks[type]))
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -310,13 +310,20 @@ bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info)
|
||||
srcu_read_unlock(&fsnotify_mark_srcu, iter_info->srcu_idx);
|
||||
|
||||
return true;
|
||||
|
||||
fail:
|
||||
for (type--; type >= 0; type--)
|
||||
fsnotify_put_mark_wake(iter_info->marks[type]);
|
||||
return false;
|
||||
}
|
||||
|
||||
void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info)
|
||||
{
|
||||
int type;
|
||||
|
||||
iter_info->srcu_idx = srcu_read_lock(&fsnotify_mark_srcu);
|
||||
fsnotify_put_mark_wake(iter_info->inode_mark);
|
||||
fsnotify_put_mark_wake(iter_info->vfsmount_mark);
|
||||
fsnotify_foreach_obj_type(type)
|
||||
fsnotify_put_mark_wake(iter_info->marks[type]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user