Commit c72a04e34735ec3f19f4788b7f95017310b5e1eb
Committed by
Linus Torvalds
1 parent
323b7fe8f8
Exists in
master
and in
4 other branches
cgroup_fs: fix cgroup use of simple_lookup()
cgroup can't use simple_lookup(), since that'd override its desired ->d_op. Tested-by: Li Zefan <lizf@cn.fujitsu.com> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 16 additions and 1 deletions Side-by-side Diff
kernel/cgroup.c
... | ... | @@ -764,6 +764,7 @@ |
764 | 764 | */ |
765 | 765 | |
766 | 766 | static int cgroup_mkdir(struct inode *dir, struct dentry *dentry, int mode); |
767 | +static struct dentry *cgroup_lookup(struct inode *, struct dentry *, struct nameidata *); | |
767 | 768 | static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry); |
768 | 769 | static int cgroup_populate_dir(struct cgroup *cgrp); |
769 | 770 | static const struct inode_operations cgroup_dir_inode_operations; |
... | ... | @@ -860,6 +861,11 @@ |
860 | 861 | iput(inode); |
861 | 862 | } |
862 | 863 | |
864 | +static int cgroup_delete(const struct dentry *d) | |
865 | +{ | |
866 | + return 1; | |
867 | +} | |
868 | + | |
863 | 869 | static void remove_dir(struct dentry *d) |
864 | 870 | { |
865 | 871 | struct dentry *parent = dget(d->d_parent); |
... | ... | @@ -1451,6 +1457,7 @@ |
1451 | 1457 | { |
1452 | 1458 | static const struct dentry_operations cgroup_dops = { |
1453 | 1459 | .d_iput = cgroup_diput, |
1460 | + .d_delete = cgroup_delete, | |
1454 | 1461 | }; |
1455 | 1462 | |
1456 | 1463 | struct inode *inode = |
1457 | 1464 | |
... | ... | @@ -2195,11 +2202,19 @@ |
2195 | 2202 | }; |
2196 | 2203 | |
2197 | 2204 | static const struct inode_operations cgroup_dir_inode_operations = { |
2198 | - .lookup = simple_lookup, | |
2205 | + .lookup = cgroup_lookup, | |
2199 | 2206 | .mkdir = cgroup_mkdir, |
2200 | 2207 | .rmdir = cgroup_rmdir, |
2201 | 2208 | .rename = cgroup_rename, |
2202 | 2209 | }; |
2210 | + | |
2211 | +static struct dentry *cgroup_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) | |
2212 | +{ | |
2213 | + if (dentry->d_name.len > NAME_MAX) | |
2214 | + return ERR_PTR(-ENAMETOOLONG); | |
2215 | + d_add(dentry, NULL); | |
2216 | + return NULL; | |
2217 | +} | |
2203 | 2218 | |
2204 | 2219 | /* |
2205 | 2220 | * Check if a file is a control file |