mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-03 18:20:25 +02:00 
			
		
		
		
	fsnotify: add helper to get mask from connector
Use a helper to get the mask from the object (i.e. i_fsnotify_mask) to generalize code of add/remove inode/vfsmount mark. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
		
							parent
							
								
									36f10f55ff
								
							
						
					
					
						commit
						3ac70bfcde
					
				
					 3 changed files with 31 additions and 12 deletions
				
			
		| 
						 | 
				
			
			@ -542,8 +542,8 @@ static int fanotify_remove_vfsmount_mark(struct fsnotify_group *group,
 | 
			
		|||
 | 
			
		||||
	removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
 | 
			
		||||
						 &destroy_mark);
 | 
			
		||||
	if (removed & real_mount(mnt)->mnt_fsnotify_mask)
 | 
			
		||||
		fsnotify_recalc_mask(real_mount(mnt)->mnt_fsnotify_marks);
 | 
			
		||||
	if (removed & fsnotify_conn_mask(fsn_mark->connector))
 | 
			
		||||
		fsnotify_recalc_mask(fsn_mark->connector);
 | 
			
		||||
	if (destroy_mark)
 | 
			
		||||
		fsnotify_detach_mark(fsn_mark);
 | 
			
		||||
	mutex_unlock(&group->mark_mutex);
 | 
			
		||||
| 
						 | 
				
			
			@ -571,8 +571,8 @@ static int fanotify_remove_inode_mark(struct fsnotify_group *group,
 | 
			
		|||
 | 
			
		||||
	removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
 | 
			
		||||
						 &destroy_mark);
 | 
			
		||||
	if (removed & inode->i_fsnotify_mask)
 | 
			
		||||
		fsnotify_recalc_mask(inode->i_fsnotify_marks);
 | 
			
		||||
	if (removed & fsnotify_conn_mask(fsn_mark->connector))
 | 
			
		||||
		fsnotify_recalc_mask(fsn_mark->connector);
 | 
			
		||||
	if (destroy_mark)
 | 
			
		||||
		fsnotify_detach_mark(fsn_mark);
 | 
			
		||||
	mutex_unlock(&group->mark_mutex);
 | 
			
		||||
| 
						 | 
				
			
			@ -658,8 +658,8 @@ static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	added = fanotify_mark_add_to_mask(fsn_mark, mask, flags);
 | 
			
		||||
	if (added & ~real_mount(mnt)->mnt_fsnotify_mask)
 | 
			
		||||
		fsnotify_recalc_mask(real_mount(mnt)->mnt_fsnotify_marks);
 | 
			
		||||
	if (added & ~fsnotify_conn_mask(fsn_mark->connector))
 | 
			
		||||
		fsnotify_recalc_mask(fsn_mark->connector);
 | 
			
		||||
	mutex_unlock(&group->mark_mutex);
 | 
			
		||||
 | 
			
		||||
	fsnotify_put_mark(fsn_mark);
 | 
			
		||||
| 
						 | 
				
			
			@ -697,8 +697,8 @@ static int fanotify_add_inode_mark(struct fsnotify_group *group,
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
	added = fanotify_mark_add_to_mask(fsn_mark, mask, flags);
 | 
			
		||||
	if (added & ~inode->i_fsnotify_mask)
 | 
			
		||||
		fsnotify_recalc_mask(inode->i_fsnotify_marks);
 | 
			
		||||
	if (added & ~fsnotify_conn_mask(fsn_mark->connector))
 | 
			
		||||
		fsnotify_recalc_mask(fsn_mark->connector);
 | 
			
		||||
	mutex_unlock(&group->mark_mutex);
 | 
			
		||||
 | 
			
		||||
	fsnotify_put_mark(fsn_mark);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,6 +109,23 @@ void fsnotify_get_mark(struct fsnotify_mark *mark)
 | 
			
		|||
	refcount_inc(&mark->refcnt);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static __u32 *fsnotify_conn_mask_p(struct fsnotify_mark_connector *conn)
 | 
			
		||||
{
 | 
			
		||||
	if (conn->type == FSNOTIFY_OBJ_TYPE_INODE)
 | 
			
		||||
		return &fsnotify_conn_inode(conn)->i_fsnotify_mask;
 | 
			
		||||
	else if (conn->type == FSNOTIFY_OBJ_TYPE_VFSMOUNT)
 | 
			
		||||
		return &fsnotify_conn_mount(conn)->mnt_fsnotify_mask;
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
__u32 fsnotify_conn_mask(struct fsnotify_mark_connector *conn)
 | 
			
		||||
{
 | 
			
		||||
	if (WARN_ON(!fsnotify_valid_obj_type(conn->type)))
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	return *fsnotify_conn_mask_p(conn);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void __fsnotify_recalc_mask(struct fsnotify_mark_connector *conn)
 | 
			
		||||
{
 | 
			
		||||
	u32 new_mask = 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -119,10 +136,10 @@ static void __fsnotify_recalc_mask(struct fsnotify_mark_connector *conn)
 | 
			
		|||
		if (mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED)
 | 
			
		||||
			new_mask |= mark->mask;
 | 
			
		||||
	}
 | 
			
		||||
	if (conn->type == FSNOTIFY_OBJ_TYPE_INODE)
 | 
			
		||||
		fsnotify_conn_inode(conn)->i_fsnotify_mask = new_mask;
 | 
			
		||||
	else if (conn->type == FSNOTIFY_OBJ_TYPE_VFSMOUNT)
 | 
			
		||||
		fsnotify_conn_mount(conn)->mnt_fsnotify_mask = new_mask;
 | 
			
		||||
	if (WARN_ON(!fsnotify_valid_obj_type(conn->type)))
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	*fsnotify_conn_mask_p(conn) = new_mask;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -401,6 +401,8 @@ extern struct fsnotify_event *fsnotify_remove_first_event(struct fsnotify_group
 | 
			
		|||
 | 
			
		||||
/* functions used to manipulate the marks attached to inodes */
 | 
			
		||||
 | 
			
		||||
/* Get mask of events for a list of marks */
 | 
			
		||||
extern __u32 fsnotify_conn_mask(struct fsnotify_mark_connector *conn);
 | 
			
		||||
/* Calculate mask of events for a list of marks */
 | 
			
		||||
extern void fsnotify_recalc_mask(struct fsnotify_mark_connector *conn);
 | 
			
		||||
extern void fsnotify_init_mark(struct fsnotify_mark *mark,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue