History

eventfs: Have event files and directories default to parent uid and gid

Dongliang reported: I found that in the latest version, the nodes of tracefs have been changed to dynamically created. This has caused me to encounter a problem where the gid I specified in the mounting parameters cannot apply to all files, as in the following situation: /data/tmp/events # mount | grep tracefs tracefs on /data/tmp type tracefs (rw,seclabel,relatime,gid=3012) gid 3012 = readtracefs /data/tmp # ls -lh total 0 -r--r----- 1 root readtracefs 0 1970-01-01 08:00 README -r--r----- 1 root readtracefs 0 1970-01-01 08:00 available_events ums9621_1h10:/data/tmp/events # ls -lh total 0 drwxr-xr-x 2 root root 0 2023-12-19 00:56 alarmtimer drwxr-xr-x 2 root root 0 2023-12-19 00:56 asoc It will prevent certain applications from accessing tracefs properly, I try to avoid this issue by making the following modifications. To fix this, have the files created default to taking the ownership of the parent dentry unless the ownership was previously set by the user. Link: https://lore.kernel.org/linux-trace-kernel/1703063706-30539-1-git-send-email-dongliang.cui@unisoc.com/ Link: https://lore.kernel.org/linux-trace-kernel/20231220105017.1489d790@gandalf.local.home

Steven Rostedt (Google) committed 2 years ago

Commit 0dfc8521 parent 7beb82b1 file · +9 −3Browse files

Unified · Split

fs/tracefs/event_inode.c+9−3
@@ -148,7 +148,8 @@ static const struct file_operations eventfs_file_operations = { · 147 unmodified lines
148 .release = eventfs_release,148 .release = eventfs_release,
149};149};
150 150
151static void update_inode_attr(struct inode *inode, struct eventfs_attr *attr, umode_t mode)151static void update_inode_attr(struct dentry *dentry, struct inode *inode,
152 struct eventfs_attr *attr, umode_t mode)
152{153{
153 if (!attr) {154 if (!attr) {
154 inode->i_mode = mode;155 inode->i_mode = mode;
@@ -162,9 +163,13 @@ static void update_inode_attr(struct inode *inode, struct eventfs_attr *attr, um · 7 unmodified lines
162 163
163 if (attr->mode & EVENTFS_SAVE_UID)164 if (attr->mode & EVENTFS_SAVE_UID)
164 inode->i_uid = attr->uid;165 inode->i_uid = attr->uid;
166 else
167 inode->i_uid = d_inode(dentry->d_parent)->i_uid;
165 168
166 if (attr->mode & EVENTFS_SAVE_GID)169 if (attr->mode & EVENTFS_SAVE_GID)
167 inode->i_gid = attr->gid;170 inode->i_gid = attr->gid;
171 else
172 inode->i_gid = d_inode(dentry->d_parent)->i_gid;
168}173}
169 174
170/**175/**
@@ -206,7 +211,7 @@ static struct dentry *create_file(const char *name, umode_t mode, · 35 unmodified lines
206 return eventfs_failed_creating(dentry);211 return eventfs_failed_creating(dentry);
207 212
208 /* If the user updated the directory's attributes, use them */213 /* If the user updated the directory's attributes, use them */
209 update_inode_attr(inode, attr, mode);214 update_inode_attr(dentry, inode, attr, mode);
210 215
211 inode->i_op = &eventfs_file_inode_operations;216 inode->i_op = &eventfs_file_inode_operations;
212 inode->i_fop = fop;217 inode->i_fop = fop;
@@ -242,7 +247,8 @@ static struct dentry *create_dir(struct eventfs_inode *ei, struct dentry *parent · 29 unmodified lines
242 return eventfs_failed_creating(dentry);247 return eventfs_failed_creating(dentry);
243 248
244 /* If the user updated the directory's attributes, use them */249 /* If the user updated the directory's attributes, use them */
245 update_inode_attr(inode, &ei->attr, S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO);250 update_inode_attr(dentry, inode, &ei->attr,
251 S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO);
246 252
247 inode->i_op = &eventfs_root_dir_inode_operations;253 inode->i_op = &eventfs_root_dir_inode_operations;
248 inode->i_fop = &eventfs_file_operations;254 inode->i_fop = &eventfs_file_operations;