fs/tracefs/event_inode.c

Source file repositories/reference/linux-study-clean/fs/tracefs/event_inode.c

File Facts

System
Linux kernel
Corpus path
fs/tracefs/event_inode.c
Extension
.c
Size
23700 bytes
Lines
901
Domain
Core OS
Bucket
VFS And Filesystem Core
Inferred role
Core OS: operation-table or driver-model contract
Status
pattern implementation candidate

Why This File Exists

Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.

Dependency Surface

Detected Declarations

Annotated Snippet

static const struct file_operations eventfs_file_operations = {
	.read		= generic_read_dir,
	.iterate_shared	= eventfs_iterate,
	.llseek		= generic_file_llseek,
};

static void eventfs_set_attrs(struct eventfs_inode *ei, bool update_uid, kuid_t uid,
			      bool update_gid, kgid_t gid, int level)
{
	struct eventfs_inode *ei_child;

	lockdep_assert_held(&eventfs_mutex);

	/* Update events/<system>/<event> */
	if (WARN_ON_ONCE(level > 3))
		return;

	if (update_uid) {
		ei->attr.mode &= ~EVENTFS_SAVE_UID;
		ei->attr.uid = uid;
	}

	if (update_gid) {
		ei->attr.mode &= ~EVENTFS_SAVE_GID;
		ei->attr.gid = gid;
	}

	list_for_each_entry(ei_child, &ei->children, list) {
		eventfs_set_attrs(ei_child, update_uid, uid, update_gid, gid, level + 1);
	}

	if (!ei->entry_attrs)
		return;

	for (int i = 0; i < ei->nr_entries; i++) {
		if (update_uid) {
			ei->entry_attrs[i].mode &= ~EVENTFS_SAVE_UID;
			ei->entry_attrs[i].uid = uid;
		}
		if (update_gid) {
			ei->entry_attrs[i].mode &= ~EVENTFS_SAVE_GID;
			ei->entry_attrs[i].gid = gid;
		}
	}

}

/*
 * On a remount of tracefs, if UID or GID options are set, then
 * the mount point inode permissions should be used.
 * Reset the saved permission flags appropriately.
 */
void eventfs_remount(struct tracefs_inode *ti, bool update_uid, bool update_gid)
{
	struct eventfs_inode *ei = ti->private;

	/* Only the events directory does the updates */
	if (!ei || !ei->is_events || ei->is_freed)
		return;

	eventfs_set_attrs(ei, update_uid, ti->vfs_inode.i_uid,
			  update_gid, ti->vfs_inode.i_gid, 0);
}

static void update_inode_attr(struct inode *inode, umode_t mode,
			      struct eventfs_attr *attr, struct eventfs_root_inode *rei)
{
	if (attr && attr->mode & EVENTFS_SAVE_MODE)
		inode->i_mode = attr->mode & EVENTFS_MODE_MASK;
	else
		inode->i_mode = mode;

	if (attr && attr->mode & EVENTFS_SAVE_UID)
		inode->i_uid = attr->uid;
	else
		inode->i_uid = rei->ei.attr.uid;

	if (attr && attr->mode & EVENTFS_SAVE_GID)
		inode->i_gid = attr->gid;
	else
		inode->i_gid = rei->ei.attr.gid;
}

static struct inode *eventfs_get_inode(struct dentry *dentry, struct eventfs_attr *attr,
				       umode_t mode,  struct eventfs_inode *ei)
{
	struct eventfs_root_inode *rei;
	struct eventfs_inode *pei;
	struct tracefs_inode *ti;
	struct inode *inode;

Annotation

Implementation Notes