audit: use fsnotify group lock helpers
audit inode marks pin the inode so there is no need to set the FSNOTIFY_GROUP_NOFS flag. Link: https://lore.kernel.org/r/20220422120327.3459282-9-amir73il@gmail.com Suggested-by: Jan Kara <jack@suse.cz> Link: https://lore.kernel.org/r/20220321112310.vpr7oxro2xkz5llh@quack3.lan/ Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
642054b870
commit
960bdff24c
|
@ -351,7 +351,7 @@ static void untag_chunk(struct audit_chunk *chunk, struct fsnotify_mark *mark)
|
||||||
struct audit_chunk *new;
|
struct audit_chunk *new;
|
||||||
int size;
|
int size;
|
||||||
|
|
||||||
mutex_lock(&audit_tree_group->mark_mutex);
|
fsnotify_group_lock(audit_tree_group);
|
||||||
/*
|
/*
|
||||||
* mark_mutex stabilizes chunk attached to the mark so we can check
|
* mark_mutex stabilizes chunk attached to the mark so we can check
|
||||||
* whether it didn't change while we've dropped hash_lock.
|
* whether it didn't change while we've dropped hash_lock.
|
||||||
|
@ -368,7 +368,7 @@ static void untag_chunk(struct audit_chunk *chunk, struct fsnotify_mark *mark)
|
||||||
replace_mark_chunk(mark, NULL);
|
replace_mark_chunk(mark, NULL);
|
||||||
spin_unlock(&hash_lock);
|
spin_unlock(&hash_lock);
|
||||||
fsnotify_detach_mark(mark);
|
fsnotify_detach_mark(mark);
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
audit_mark_put_chunk(chunk);
|
audit_mark_put_chunk(chunk);
|
||||||
fsnotify_free_mark(mark);
|
fsnotify_free_mark(mark);
|
||||||
return;
|
return;
|
||||||
|
@ -385,12 +385,12 @@ static void untag_chunk(struct audit_chunk *chunk, struct fsnotify_mark *mark)
|
||||||
*/
|
*/
|
||||||
replace_chunk(new, chunk);
|
replace_chunk(new, chunk);
|
||||||
spin_unlock(&hash_lock);
|
spin_unlock(&hash_lock);
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
audit_mark_put_chunk(chunk);
|
audit_mark_put_chunk(chunk);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
out_mutex:
|
out_mutex:
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Call with group->mark_mutex held, releases it */
|
/* Call with group->mark_mutex held, releases it */
|
||||||
|
@ -400,19 +400,19 @@ static int create_chunk(struct inode *inode, struct audit_tree *tree)
|
||||||
struct audit_chunk *chunk = alloc_chunk(1);
|
struct audit_chunk *chunk = alloc_chunk(1);
|
||||||
|
|
||||||
if (!chunk) {
|
if (!chunk) {
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
mark = alloc_mark();
|
mark = alloc_mark();
|
||||||
if (!mark) {
|
if (!mark) {
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
kfree(chunk);
|
kfree(chunk);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fsnotify_add_inode_mark_locked(mark, inode, 0)) {
|
if (fsnotify_add_inode_mark_locked(mark, inode, 0)) {
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
fsnotify_put_mark(mark);
|
fsnotify_put_mark(mark);
|
||||||
kfree(chunk);
|
kfree(chunk);
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
|
@ -422,7 +422,7 @@ static int create_chunk(struct inode *inode, struct audit_tree *tree)
|
||||||
if (tree->goner) {
|
if (tree->goner) {
|
||||||
spin_unlock(&hash_lock);
|
spin_unlock(&hash_lock);
|
||||||
fsnotify_detach_mark(mark);
|
fsnotify_detach_mark(mark);
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
fsnotify_free_mark(mark);
|
fsnotify_free_mark(mark);
|
||||||
fsnotify_put_mark(mark);
|
fsnotify_put_mark(mark);
|
||||||
kfree(chunk);
|
kfree(chunk);
|
||||||
|
@ -444,7 +444,7 @@ static int create_chunk(struct inode *inode, struct audit_tree *tree)
|
||||||
*/
|
*/
|
||||||
insert_hash(chunk);
|
insert_hash(chunk);
|
||||||
spin_unlock(&hash_lock);
|
spin_unlock(&hash_lock);
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
/*
|
/*
|
||||||
* Drop our initial reference. When mark we point to is getting freed,
|
* Drop our initial reference. When mark we point to is getting freed,
|
||||||
* we get notification through ->freeing_mark callback and cleanup
|
* we get notification through ->freeing_mark callback and cleanup
|
||||||
|
@ -462,7 +462,7 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
|
||||||
struct audit_node *p;
|
struct audit_node *p;
|
||||||
int n;
|
int n;
|
||||||
|
|
||||||
mutex_lock(&audit_tree_group->mark_mutex);
|
fsnotify_group_lock(audit_tree_group);
|
||||||
mark = fsnotify_find_mark(&inode->i_fsnotify_marks, audit_tree_group);
|
mark = fsnotify_find_mark(&inode->i_fsnotify_marks, audit_tree_group);
|
||||||
if (!mark)
|
if (!mark)
|
||||||
return create_chunk(inode, tree);
|
return create_chunk(inode, tree);
|
||||||
|
@ -478,7 +478,7 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
|
||||||
for (n = 0; n < old->count; n++) {
|
for (n = 0; n < old->count; n++) {
|
||||||
if (old->owners[n].owner == tree) {
|
if (old->owners[n].owner == tree) {
|
||||||
spin_unlock(&hash_lock);
|
spin_unlock(&hash_lock);
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
fsnotify_put_mark(mark);
|
fsnotify_put_mark(mark);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -487,7 +487,7 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
|
||||||
|
|
||||||
chunk = alloc_chunk(old->count + 1);
|
chunk = alloc_chunk(old->count + 1);
|
||||||
if (!chunk) {
|
if (!chunk) {
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
fsnotify_put_mark(mark);
|
fsnotify_put_mark(mark);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
@ -495,7 +495,7 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
|
||||||
spin_lock(&hash_lock);
|
spin_lock(&hash_lock);
|
||||||
if (tree->goner) {
|
if (tree->goner) {
|
||||||
spin_unlock(&hash_lock);
|
spin_unlock(&hash_lock);
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
fsnotify_put_mark(mark);
|
fsnotify_put_mark(mark);
|
||||||
kfree(chunk);
|
kfree(chunk);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -515,7 +515,7 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
|
||||||
*/
|
*/
|
||||||
replace_chunk(chunk, old);
|
replace_chunk(chunk, old);
|
||||||
spin_unlock(&hash_lock);
|
spin_unlock(&hash_lock);
|
||||||
mutex_unlock(&audit_tree_group->mark_mutex);
|
fsnotify_group_unlock(audit_tree_group);
|
||||||
fsnotify_put_mark(mark); /* pair to fsnotify_find_mark */
|
fsnotify_put_mark(mark); /* pair to fsnotify_find_mark */
|
||||||
audit_mark_put_chunk(old);
|
audit_mark_put_chunk(old);
|
||||||
|
|
||||||
|
@ -1044,12 +1044,12 @@ static void audit_tree_freeing_mark(struct fsnotify_mark *mark,
|
||||||
{
|
{
|
||||||
struct audit_chunk *chunk;
|
struct audit_chunk *chunk;
|
||||||
|
|
||||||
mutex_lock(&mark->group->mark_mutex);
|
fsnotify_group_lock(mark->group);
|
||||||
spin_lock(&hash_lock);
|
spin_lock(&hash_lock);
|
||||||
chunk = mark_chunk(mark);
|
chunk = mark_chunk(mark);
|
||||||
replace_mark_chunk(mark, NULL);
|
replace_mark_chunk(mark, NULL);
|
||||||
spin_unlock(&hash_lock);
|
spin_unlock(&hash_lock);
|
||||||
mutex_unlock(&mark->group->mark_mutex);
|
fsnotify_group_unlock(mark->group);
|
||||||
if (chunk) {
|
if (chunk) {
|
||||||
evict_chunk(chunk);
|
evict_chunk(chunk);
|
||||||
audit_mark_put_chunk(chunk);
|
audit_mark_put_chunk(chunk);
|
||||||
|
|
Loading…
Reference in New Issue