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
Unified · Split
| @@ -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 | ||
| 151 | static void update_inode_attr(struct inode *inode, struct eventfs_attr *attr, umode_t mode) | 151 | static 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; |