inode_permission() calls devcgroup_inode_permission() and almost all such calls are _not_ for device nodes; let's at least keep the common path straight...
Unified · Split
| @@ -2,8 +2,16 @@ · 1 unmodified line | ||
| 2 | 2 | #include <linux/fs.h> |
| 3 | 3 | |
| 4 | 4 | #ifdef CONFIG_CGROUP_DEVICE |
| 5 | −extern int devcgroup_inode_permission(struct inode *inode, int mask); | |
| 5 | +extern int __devcgroup_inode_permission(struct inode *inode, int mask); | |
| 6 | 6 | extern int devcgroup_inode_mknod(int mode, dev_t dev); |
| 7 | +static inline int devcgroup_inode_permission(struct inode *inode, int mask) | |
| 8 | +{ | |
| 9 | + if (likely(!inode->i_rdev)) | |
| 10 | + return 0; | |
| 11 | + if (!S_ISBLK(inode->i_mode) && !S_ISCHR(inode->i_mode)) | |
| 12 | + return 0; | |
| 13 | + return __devcgroup_inode_permission(inode, mask); | |
| 14 | +} | |
| 7 | 15 | #else |
| 8 | 16 | static inline int devcgroup_inode_permission(struct inode *inode, int mask) |
| 9 | 17 | { return 0; } |
| @@ -474,17 +474,11 @@ struct cgroup_subsys devices_subsys = { · 473 unmodified lines | ||
| 474 | 474 | .subsys_id = devices_subsys_id, |
| 475 | 475 | }; |
| 476 | 476 | |
| 477 | −int devcgroup_inode_permission(struct inode *inode, int mask) | |
| 477 | +int __devcgroup_inode_permission(struct inode *inode, int mask) | |
| 478 | 478 | { |
| 479 | 479 | struct dev_cgroup *dev_cgroup; |
| 480 | 480 | struct dev_whitelist_item *wh; |
| 481 | 481 | |
| 482 | − dev_t device = inode->i_rdev; | |
| 483 | − if (!device) | |
| 484 | − return 0; | |
| 485 | − if (!S_ISBLK(inode->i_mode) && !S_ISCHR(inode->i_mode)) | |
| 486 | − return 0; | |
| 487 | − | |
| 488 | 482 | rcu_read_lock(); |
| 489 | 483 | |
| 490 | 484 | dev_cgroup = task_devcgroup(current); |