summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2017-03-14 14:29:35 +0100
committerJan Kara <jack@suse.cz>2017-04-10 17:37:35 +0200
commit86ffe245c430f07f95d5d28d3b694ea72f4492e7 (patch)
tree91f46db0135cc58cfb5dd1114962bc4781c456fe /kernel
parent9dd813c15b2c101168808d4f5941a29985758973 (diff)
fsnotify: Move object pointer to fsnotify_mark_connector
Move pointer to inode / vfsmount from mark itself to the fsnotify_mark_connector structure. This is another step on the path towards decoupling inode / vfsmount lifetime from notification mark lifetime. Reviewed-by: Miklos Szeredi <mszeredi@redhat.com> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/audit_tree.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c
index 51451245936a..c3b5fcb8eca4 100644
--- a/kernel/audit_tree.c
+++ b/kernel/audit_tree.c
@@ -172,10 +172,25 @@ static unsigned long inode_to_key(const struct inode *inode)
/*
* Function to return search key in our hash from chunk. Key 0 is special and
* should never be present in the hash.
+ *
+ * Must be called with chunk->mark.lock held to protect from connector
+ * becoming NULL.
*/
+static unsigned long __chunk_to_key(struct audit_chunk *chunk)
+{
+ if (!chunk->mark.connector)
+ return 0;
+ return (unsigned long)chunk->mark.connector->inode;
+}
+
static unsigned long chunk_to_key(struct audit_chunk *chunk)
{
- return (unsigned long)chunk->mark.inode;
+ unsigned long key;
+
+ spin_lock(&chunk->mark.lock);
+ key = __chunk_to_key(chunk);
+ spin_unlock(&chunk->mark.lock);
+ return key;
}
static inline struct list_head *chunk_hash(unsigned long key)
@@ -187,7 +202,7 @@ static inline struct list_head *chunk_hash(unsigned long key)
/* hash_lock & entry->lock is held by caller */
static void insert_hash(struct audit_chunk *chunk)
{
- unsigned long key = chunk_to_key(chunk);
+ unsigned long key = __chunk_to_key(chunk);
struct list_head *list;
if (!(chunk->mark.flags & FSNOTIFY_MARK_FLAG_ATTACHED))
@@ -276,8 +291,8 @@ static void untag_chunk(struct node *p)
if (!new)
goto Fallback;
- if (fsnotify_add_mark_locked(&new->mark, entry->group, entry->inode,
- NULL, 1)) {
+ if (fsnotify_add_mark_locked(&new->mark, entry->group,
+ entry->connector->inode, NULL, 1)) {
fsnotify_put_mark(&new->mark);
goto Fallback;
}
@@ -418,7 +433,7 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
}
if (fsnotify_add_mark_locked(chunk_entry, old_entry->group,
- old_entry->inode, NULL, 1)) {
+ old_entry->connector->inode, NULL, 1)) {
spin_unlock(&old_entry->lock);
mutex_unlock(&old_entry->group->mark_mutex);
fsnotify_put_mark(chunk_entry);