diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-08-07 10:01:14 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-08-07 10:01:14 -0400 |
commit | fe64f3283fb315e3d8f2b78785a86904a852ca82 (patch) | |
tree | 3ab48823f0ef8b855f9b58809f09b9db2997f12e | |
parent | 0cbbc422d56668528f6efd1234fe908010284082 (diff) | |
parent | db20a8925bc420eed033c5d91ff6afa74465e521 (diff) |
Merge branch 'for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull more vfs updates from Al Viro:
"Assorted cleanups and fixes.
In the "trivial API change" department - ->d_compare() losing 'parent'
argument"
* 'for-linus-2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
cachefiles: Fix race between inactivating and culling a cache object
9p: use clone_fid()
9p: fix braino introduced in "9p: new helper - v9fs_parent_fid()"
vfs: make dentry_needs_remove_privs() internal
vfs: remove file_needs_remove_privs()
vfs: fix deadlock in file_remove_privs() on overlayfs
get rid of 'parent' argument of ->d_compare()
cifs, msdos, vfat, hfs+: don't bother with parent in ->d_compare()
affs ->d_compare(): don't bother with ->d_inode
fold _d_rehash() and __d_rehash() together
fold dentry_rcuwalk_invalidate() into its only remaining caller
-rw-r--r-- | Documentation/filesystems/Locking | 2 | ||||
-rw-r--r-- | Documentation/filesystems/porting | 7 | ||||
-rw-r--r-- | Documentation/filesystems/vfs.txt | 2 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/dcache.c | 2 | ||||
-rw-r--r-- | fs/9p/fid.c | 26 | ||||
-rw-r--r-- | fs/9p/fid.h | 9 | ||||
-rw-r--r-- | fs/9p/vfs_inode.c | 6 | ||||
-rw-r--r-- | fs/9p/vfs_inode_dotl.c | 2 | ||||
-rw-r--r-- | fs/9p/xattr.c | 4 | ||||
-rw-r--r-- | fs/adfs/dir.c | 2 | ||||
-rw-r--r-- | fs/affs/amigaffs.c | 4 | ||||
-rw-r--r-- | fs/affs/namei.c | 12 | ||||
-rw-r--r-- | fs/cachefiles/namei.c | 5 | ||||
-rw-r--r-- | fs/cifs/dir.c | 4 | ||||
-rw-r--r-- | fs/dcache.c | 55 | ||||
-rw-r--r-- | fs/efivarfs/super.c | 3 | ||||
-rw-r--r-- | fs/fat/namei_msdos.c | 4 | ||||
-rw-r--r-- | fs/fat/namei_vfat.c | 6 | ||||
-rw-r--r-- | fs/hfs/hfs_fs.h | 2 | ||||
-rw-r--r-- | fs/hfs/string.c | 2 | ||||
-rw-r--r-- | fs/hfsplus/hfsplus_fs.h | 3 | ||||
-rw-r--r-- | fs/hfsplus/unicode.c | 4 | ||||
-rw-r--r-- | fs/hpfs/dentry.c | 4 | ||||
-rw-r--r-- | fs/inode.c | 7 | ||||
-rw-r--r-- | fs/internal.h | 1 | ||||
-rw-r--r-- | fs/isofs/inode.c | 15 | ||||
-rw-r--r-- | fs/isofs/namei.c | 2 | ||||
-rw-r--r-- | fs/jfs/namei.c | 2 | ||||
-rw-r--r-- | fs/ncpfs/dir.c | 6 | ||||
-rw-r--r-- | fs/proc/proc_sysctl.c | 2 | ||||
-rw-r--r-- | include/linux/dcache.h | 2 | ||||
-rw-r--r-- | include/linux/fs.h | 5 |
32 files changed, 82 insertions, 130 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking index 1b3c39a7de62..d30fb2cb5066 100644 --- a/Documentation/filesystems/Locking +++ b/Documentation/filesystems/Locking | |||
@@ -12,7 +12,7 @@ prototypes: | |||
12 | int (*d_revalidate)(struct dentry *, unsigned int); | 12 | int (*d_revalidate)(struct dentry *, unsigned int); |
13 | int (*d_weak_revalidate)(struct dentry *, unsigned int); | 13 | int (*d_weak_revalidate)(struct dentry *, unsigned int); |
14 | int (*d_hash)(const struct dentry *, struct qstr *); | 14 | int (*d_hash)(const struct dentry *, struct qstr *); |
15 | int (*d_compare)(const struct dentry *, const struct dentry *, | 15 | int (*d_compare)(const struct dentry *, |
16 | unsigned int, const char *, const struct qstr *); | 16 | unsigned int, const char *, const struct qstr *); |
17 | int (*d_delete)(struct dentry *); | 17 | int (*d_delete)(struct dentry *); |
18 | int (*d_init)(struct dentry *); | 18 | int (*d_init)(struct dentry *); |
diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting index a5fb89cac615..b1bd05ea66b2 100644 --- a/Documentation/filesystems/porting +++ b/Documentation/filesystems/porting | |||
@@ -585,3 +585,10 @@ in your dentry operations instead. | |||
585 | in the instances. Rationale: !@#!@# security_d_instantiate() needs to be | 585 | in the instances. Rationale: !@#!@# security_d_instantiate() needs to be |
586 | called before we attach dentry to inode and !@#!@##!@$!$#!@#$!@$!@$ smack | 586 | called before we attach dentry to inode and !@#!@##!@$!$#!@#$!@$!@$ smack |
587 | ->d_instantiate() uses not just ->getxattr() but ->setxattr() as well. | 587 | ->d_instantiate() uses not just ->getxattr() but ->setxattr() as well. |
588 | -- | ||
589 | [mandatory] | ||
590 | ->d_compare() doesn't get parent as a separate argument anymore. If you | ||
591 | used it for finding the struct super_block involved, dentry->d_sb will | ||
592 | work just as well; if it's something more complicated, use dentry->d_parent. | ||
593 | Just be careful not to assume that fetching it more than once will yield | ||
594 | the same value - in RCU mode it could change under you. | ||
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt index 8a196851f01d..9ace359d6cc5 100644 --- a/Documentation/filesystems/vfs.txt +++ b/Documentation/filesystems/vfs.txt | |||
@@ -931,7 +931,7 @@ struct dentry_operations { | |||
931 | int (*d_revalidate)(struct dentry *, unsigned int); | 931 | int (*d_revalidate)(struct dentry *, unsigned int); |
932 | int (*d_weak_revalidate)(struct dentry *, unsigned int); | 932 | int (*d_weak_revalidate)(struct dentry *, unsigned int); |
933 | int (*d_hash)(const struct dentry *, struct qstr *); | 933 | int (*d_hash)(const struct dentry *, struct qstr *); |
934 | int (*d_compare)(const struct dentry *, const struct dentry *, | 934 | int (*d_compare)(const struct dentry *, |
935 | unsigned int, const char *, const struct qstr *); | 935 | unsigned int, const char *, const struct qstr *); |
936 | int (*d_delete)(const struct dentry *); | 936 | int (*d_delete)(const struct dentry *); |
937 | int (*d_init)(struct dentry *); | 937 | int (*d_init)(struct dentry *); |
diff --git a/drivers/staging/lustre/lustre/llite/dcache.c b/drivers/staging/lustre/lustre/llite/dcache.c index 581a63a0a63e..463b1a360733 100644 --- a/drivers/staging/lustre/lustre/llite/dcache.c +++ b/drivers/staging/lustre/lustre/llite/dcache.c | |||
@@ -78,7 +78,7 @@ static void ll_release(struct dentry *de) | |||
78 | * INVALID) so d_lookup() matches it, but we have no lock on it (so | 78 | * INVALID) so d_lookup() matches it, but we have no lock on it (so |
79 | * lock_match() fails) and we spin around real_lookup(). | 79 | * lock_match() fails) and we spin around real_lookup(). |
80 | */ | 80 | */ |
81 | static int ll_dcompare(const struct dentry *parent, const struct dentry *dentry, | 81 | static int ll_dcompare(const struct dentry *dentry, |
82 | unsigned int len, const char *str, | 82 | unsigned int len, const char *str, |
83 | const struct qstr *name) | 83 | const struct qstr *name) |
84 | { | 84 | { |
diff --git a/fs/9p/fid.c b/fs/9p/fid.c index 47db55aee7f2..60fb47469c86 100644 --- a/fs/9p/fid.c +++ b/fs/9p/fid.c | |||
@@ -257,36 +257,12 @@ struct p9_fid *v9fs_fid_lookup(struct dentry *dentry) | |||
257 | return v9fs_fid_lookup_with_uid(dentry, uid, any); | 257 | return v9fs_fid_lookup_with_uid(dentry, uid, any); |
258 | } | 258 | } |
259 | 259 | ||
260 | struct p9_fid *v9fs_fid_clone(struct dentry *dentry) | ||
261 | { | ||
262 | struct p9_fid *fid, *ret; | ||
263 | |||
264 | fid = v9fs_fid_lookup(dentry); | ||
265 | if (IS_ERR(fid)) | ||
266 | return fid; | ||
267 | |||
268 | ret = p9_client_walk(fid, 0, NULL, 1); | ||
269 | return ret; | ||
270 | } | ||
271 | |||
272 | static struct p9_fid *v9fs_fid_clone_with_uid(struct dentry *dentry, kuid_t uid) | ||
273 | { | ||
274 | struct p9_fid *fid, *ret; | ||
275 | |||
276 | fid = v9fs_fid_lookup_with_uid(dentry, uid, 0); | ||
277 | if (IS_ERR(fid)) | ||
278 | return fid; | ||
279 | |||
280 | ret = p9_client_walk(fid, 0, NULL, 1); | ||
281 | return ret; | ||
282 | } | ||
283 | |||
284 | struct p9_fid *v9fs_writeback_fid(struct dentry *dentry) | 260 | struct p9_fid *v9fs_writeback_fid(struct dentry *dentry) |
285 | { | 261 | { |
286 | int err; | 262 | int err; |
287 | struct p9_fid *fid; | 263 | struct p9_fid *fid; |
288 | 264 | ||
289 | fid = v9fs_fid_clone_with_uid(dentry, GLOBAL_ROOT_UID); | 265 | fid = clone_fid(v9fs_fid_lookup_with_uid(dentry, GLOBAL_ROOT_UID, 0)); |
290 | if (IS_ERR(fid)) | 266 | if (IS_ERR(fid)) |
291 | goto error_out; | 267 | goto error_out; |
292 | /* | 268 | /* |
diff --git a/fs/9p/fid.h b/fs/9p/fid.h index 12700df0bb51..4491bcaf42b8 100644 --- a/fs/9p/fid.h +++ b/fs/9p/fid.h | |||
@@ -28,7 +28,14 @@ static inline struct p9_fid *v9fs_parent_fid(struct dentry *dentry) | |||
28 | { | 28 | { |
29 | return v9fs_fid_lookup(dentry->d_parent); | 29 | return v9fs_fid_lookup(dentry->d_parent); |
30 | } | 30 | } |
31 | struct p9_fid *v9fs_fid_clone(struct dentry *dentry); | ||
32 | void v9fs_fid_add(struct dentry *dentry, struct p9_fid *fid); | 31 | void v9fs_fid_add(struct dentry *dentry, struct p9_fid *fid); |
33 | struct p9_fid *v9fs_writeback_fid(struct dentry *dentry); | 32 | struct p9_fid *v9fs_writeback_fid(struct dentry *dentry); |
33 | static inline struct p9_fid *clone_fid(struct p9_fid *fid) | ||
34 | { | ||
35 | return IS_ERR(fid) ? fid : p9_client_walk(fid, 0, NULL, 1); | ||
36 | } | ||
37 | static inline struct p9_fid *v9fs_fid_clone(struct dentry *dentry) | ||
38 | { | ||
39 | return clone_fid(v9fs_fid_lookup(dentry)); | ||
40 | } | ||
34 | #endif | 41 | #endif |
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 7da9a8354fad..8b1999b528e9 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
@@ -661,7 +661,7 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, | |||
661 | } | 661 | } |
662 | 662 | ||
663 | /* clone a fid to use for creation */ | 663 | /* clone a fid to use for creation */ |
664 | ofid = p9_client_walk(dfid, 0, NULL, 1); | 664 | ofid = clone_fid(dfid); |
665 | if (IS_ERR(ofid)) { | 665 | if (IS_ERR(ofid)) { |
666 | err = PTR_ERR(ofid); | 666 | err = PTR_ERR(ofid); |
667 | p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); | 667 | p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); |
@@ -975,13 +975,13 @@ v9fs_vfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
975 | if (IS_ERR(oldfid)) | 975 | if (IS_ERR(oldfid)) |
976 | return PTR_ERR(oldfid); | 976 | return PTR_ERR(oldfid); |
977 | 977 | ||
978 | olddirfid = v9fs_parent_fid(old_dentry); | 978 | olddirfid = clone_fid(v9fs_parent_fid(old_dentry)); |
979 | if (IS_ERR(olddirfid)) { | 979 | if (IS_ERR(olddirfid)) { |
980 | retval = PTR_ERR(olddirfid); | 980 | retval = PTR_ERR(olddirfid); |
981 | goto done; | 981 | goto done; |
982 | } | 982 | } |
983 | 983 | ||
984 | newdirfid = v9fs_parent_fid(new_dentry); | 984 | newdirfid = clone_fid(v9fs_parent_fid(new_dentry)); |
985 | if (IS_ERR(newdirfid)) { | 985 | if (IS_ERR(newdirfid)) { |
986 | retval = PTR_ERR(newdirfid); | 986 | retval = PTR_ERR(newdirfid); |
987 | goto clunk_olddir; | 987 | goto clunk_olddir; |
diff --git a/fs/9p/vfs_inode_dotl.c b/fs/9p/vfs_inode_dotl.c index 2ed04c2fe7af..eeabcb0bad12 100644 --- a/fs/9p/vfs_inode_dotl.c +++ b/fs/9p/vfs_inode_dotl.c | |||
@@ -281,7 +281,7 @@ v9fs_vfs_atomic_open_dotl(struct inode *dir, struct dentry *dentry, | |||
281 | } | 281 | } |
282 | 282 | ||
283 | /* clone a fid to use for creation */ | 283 | /* clone a fid to use for creation */ |
284 | ofid = p9_client_walk(dfid, 0, NULL, 1); | 284 | ofid = clone_fid(dfid); |
285 | if (IS_ERR(ofid)) { | 285 | if (IS_ERR(ofid)) { |
286 | err = PTR_ERR(ofid); | 286 | err = PTR_ERR(ofid); |
287 | p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); | 287 | p9_debug(P9_DEBUG_VFS, "p9_client_walk failed %d\n", err); |
diff --git a/fs/9p/xattr.c b/fs/9p/xattr.c index a6bd349bab23..f329eee6dc93 100644 --- a/fs/9p/xattr.c +++ b/fs/9p/xattr.c | |||
@@ -97,8 +97,6 @@ int v9fs_xattr_set(struct dentry *dentry, const char *name, | |||
97 | const void *value, size_t value_len, int flags) | 97 | const void *value, size_t value_len, int flags) |
98 | { | 98 | { |
99 | struct p9_fid *fid = v9fs_fid_lookup(dentry); | 99 | struct p9_fid *fid = v9fs_fid_lookup(dentry); |
100 | if (IS_ERR(fid)) | ||
101 | return PTR_ERR(fid); | ||
102 | return v9fs_fid_xattr_set(fid, name, value, value_len, flags); | 100 | return v9fs_fid_xattr_set(fid, name, value, value_len, flags); |
103 | } | 101 | } |
104 | 102 | ||
@@ -115,7 +113,7 @@ int v9fs_fid_xattr_set(struct p9_fid *fid, const char *name, | |||
115 | name, value_len, flags); | 113 | name, value_len, flags); |
116 | 114 | ||
117 | /* Clone it */ | 115 | /* Clone it */ |
118 | fid = p9_client_walk(fid, 0, NULL, 1); | 116 | fid = clone_fid(fid); |
119 | if (IS_ERR(fid)) | 117 | if (IS_ERR(fid)) |
120 | return PTR_ERR(fid); | 118 | return PTR_ERR(fid); |
121 | 119 | ||
diff --git a/fs/adfs/dir.c b/fs/adfs/dir.c index c39aedc7ed3d..29444c83da48 100644 --- a/fs/adfs/dir.c +++ b/fs/adfs/dir.c | |||
@@ -227,7 +227,7 @@ adfs_hash(const struct dentry *parent, struct qstr *qstr) | |||
227 | * requirements of the underlying filesystem. | 227 | * requirements of the underlying filesystem. |
228 | */ | 228 | */ |
229 | static int | 229 | static int |
230 | adfs_compare(const struct dentry *parent, const struct dentry *dentry, | 230 | adfs_compare(const struct dentry *dentry, |
231 | unsigned int len, const char *str, const struct qstr *name) | 231 | unsigned int len, const char *str, const struct qstr *name) |
232 | { | 232 | { |
233 | int i; | 233 | int i; |
diff --git a/fs/affs/amigaffs.c b/fs/affs/amigaffs.c index d6c7a51c93e4..d8f217c711d3 100644 --- a/fs/affs/amigaffs.c +++ b/fs/affs/amigaffs.c | |||
@@ -472,9 +472,7 @@ affs_warning(struct super_block *sb, const char *function, const char *fmt, ...) | |||
472 | bool | 472 | bool |
473 | affs_nofilenametruncate(const struct dentry *dentry) | 473 | affs_nofilenametruncate(const struct dentry *dentry) |
474 | { | 474 | { |
475 | struct inode *inode = d_inode(dentry); | 475 | return affs_test_opt(AFFS_SB(dentry->d_sb)->s_flags, SF_NO_TRUNCATE); |
476 | |||
477 | return affs_test_opt(AFFS_SB(inode->i_sb)->s_flags, SF_NO_TRUNCATE); | ||
478 | } | 476 | } |
479 | 477 | ||
480 | /* Check if the name is valid for a affs object. */ | 478 | /* Check if the name is valid for a affs object. */ |
diff --git a/fs/affs/namei.c b/fs/affs/namei.c index eb32029bc776..a2d68f828d53 100644 --- a/fs/affs/namei.c +++ b/fs/affs/namei.c | |||
@@ -14,11 +14,11 @@ typedef int (*toupper_t)(int); | |||
14 | 14 | ||
15 | static int affs_toupper(int ch); | 15 | static int affs_toupper(int ch); |
16 | static int affs_hash_dentry(const struct dentry *, struct qstr *); | 16 | static int affs_hash_dentry(const struct dentry *, struct qstr *); |
17 | static int affs_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | 17 | static int affs_compare_dentry(const struct dentry *dentry, |
18 | unsigned int len, const char *str, const struct qstr *name); | 18 | unsigned int len, const char *str, const struct qstr *name); |
19 | static int affs_intl_toupper(int ch); | 19 | static int affs_intl_toupper(int ch); |
20 | static int affs_intl_hash_dentry(const struct dentry *, struct qstr *); | 20 | static int affs_intl_hash_dentry(const struct dentry *, struct qstr *); |
21 | static int affs_intl_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | 21 | static int affs_intl_compare_dentry(const struct dentry *dentry, |
22 | unsigned int len, const char *str, const struct qstr *name); | 22 | unsigned int len, const char *str, const struct qstr *name); |
23 | 23 | ||
24 | const struct dentry_operations affs_dentry_operations = { | 24 | const struct dentry_operations affs_dentry_operations = { |
@@ -131,20 +131,20 @@ static inline int __affs_compare_dentry(unsigned int len, | |||
131 | } | 131 | } |
132 | 132 | ||
133 | static int | 133 | static int |
134 | affs_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | 134 | affs_compare_dentry(const struct dentry *dentry, |
135 | unsigned int len, const char *str, const struct qstr *name) | 135 | unsigned int len, const char *str, const struct qstr *name) |
136 | { | 136 | { |
137 | 137 | ||
138 | return __affs_compare_dentry(len, str, name, affs_toupper, | 138 | return __affs_compare_dentry(len, str, name, affs_toupper, |
139 | affs_nofilenametruncate(parent)); | 139 | affs_nofilenametruncate(dentry)); |
140 | } | 140 | } |
141 | 141 | ||
142 | static int | 142 | static int |
143 | affs_intl_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | 143 | affs_intl_compare_dentry(const struct dentry *dentry, |
144 | unsigned int len, const char *str, const struct qstr *name) | 144 | unsigned int len, const char *str, const struct qstr *name) |
145 | { | 145 | { |
146 | return __affs_compare_dentry(len, str, name, affs_intl_toupper, | 146 | return __affs_compare_dentry(len, str, name, affs_intl_toupper, |
147 | affs_nofilenametruncate(parent)); | 147 | affs_nofilenametruncate(dentry)); |
148 | 148 | ||
149 | } | 149 | } |
150 | 150 | ||
diff --git a/fs/cachefiles/namei.c b/fs/cachefiles/namei.c index 4ae75006e73b..3f7c2cd41f8f 100644 --- a/fs/cachefiles/namei.c +++ b/fs/cachefiles/namei.c | |||
@@ -263,6 +263,8 @@ requeue: | |||
263 | void cachefiles_mark_object_inactive(struct cachefiles_cache *cache, | 263 | void cachefiles_mark_object_inactive(struct cachefiles_cache *cache, |
264 | struct cachefiles_object *object) | 264 | struct cachefiles_object *object) |
265 | { | 265 | { |
266 | blkcnt_t i_blocks = d_backing_inode(object->dentry)->i_blocks; | ||
267 | |||
266 | write_lock(&cache->active_lock); | 268 | write_lock(&cache->active_lock); |
267 | rb_erase(&object->active_node, &cache->active_nodes); | 269 | rb_erase(&object->active_node, &cache->active_nodes); |
268 | clear_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags); | 270 | clear_bit(CACHEFILES_OBJECT_ACTIVE, &object->flags); |
@@ -273,8 +275,7 @@ void cachefiles_mark_object_inactive(struct cachefiles_cache *cache, | |||
273 | /* This object can now be culled, so we need to let the daemon know | 275 | /* This object can now be culled, so we need to let the daemon know |
274 | * that there is something it can remove if it needs to. | 276 | * that there is something it can remove if it needs to. |
275 | */ | 277 | */ |
276 | atomic_long_add(d_backing_inode(object->dentry)->i_blocks, | 278 | atomic_long_add(i_blocks, &cache->b_released); |
277 | &cache->b_released); | ||
278 | if (atomic_inc_return(&cache->f_released)) | 279 | if (atomic_inc_return(&cache->f_released)) |
279 | cachefiles_state_changed(cache); | 280 | cachefiles_state_changed(cache); |
280 | } | 281 | } |
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c index 4e532536cbc6..4716c54dbfc6 100644 --- a/fs/cifs/dir.c +++ b/fs/cifs/dir.c | |||
@@ -903,10 +903,10 @@ static int cifs_ci_hash(const struct dentry *dentry, struct qstr *q) | |||
903 | return 0; | 903 | return 0; |
904 | } | 904 | } |
905 | 905 | ||
906 | static int cifs_ci_compare(const struct dentry *parent, const struct dentry *dentry, | 906 | static int cifs_ci_compare(const struct dentry *dentry, |
907 | unsigned int len, const char *str, const struct qstr *name) | 907 | unsigned int len, const char *str, const struct qstr *name) |
908 | { | 908 | { |
909 | struct nls_table *codepage = CIFS_SB(parent->d_sb)->local_nls; | 909 | struct nls_table *codepage = CIFS_SB(dentry->d_sb)->local_nls; |
910 | wchar_t c1, c2; | 910 | wchar_t c1, c2; |
911 | int i, l1, l2; | 911 | int i, l1, l2; |
912 | 912 | ||
diff --git a/fs/dcache.c b/fs/dcache.c index 96635a30fb26..5c7cc953ac81 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -316,20 +316,6 @@ static void dentry_free(struct dentry *dentry) | |||
316 | call_rcu(&dentry->d_u.d_rcu, __d_free); | 316 | call_rcu(&dentry->d_u.d_rcu, __d_free); |
317 | } | 317 | } |
318 | 318 | ||
319 | /** | ||
320 | * dentry_rcuwalk_invalidate - invalidate in-progress rcu-walk lookups | ||
321 | * @dentry: the target dentry | ||
322 | * After this call, in-progress rcu-walk path lookup will fail. This | ||
323 | * should be called after unhashing, and after changing d_inode (if | ||
324 | * the dentry has not already been unhashed). | ||
325 | */ | ||
326 | static inline void dentry_rcuwalk_invalidate(struct dentry *dentry) | ||
327 | { | ||
328 | lockdep_assert_held(&dentry->d_lock); | ||
329 | /* Go through am invalidation barrier */ | ||
330 | write_seqcount_invalidate(&dentry->d_seq); | ||
331 | } | ||
332 | |||
333 | /* | 319 | /* |
334 | * Release the dentry's inode, using the filesystem | 320 | * Release the dentry's inode, using the filesystem |
335 | * d_iput() operation if defined. | 321 | * d_iput() operation if defined. |
@@ -468,7 +454,8 @@ void __d_drop(struct dentry *dentry) | |||
468 | __hlist_bl_del(&dentry->d_hash); | 454 | __hlist_bl_del(&dentry->d_hash); |
469 | dentry->d_hash.pprev = NULL; | 455 | dentry->d_hash.pprev = NULL; |
470 | hlist_bl_unlock(b); | 456 | hlist_bl_unlock(b); |
471 | dentry_rcuwalk_invalidate(dentry); | 457 | /* After this call, in-progress rcu-walk path lookup will fail. */ |
458 | write_seqcount_invalidate(&dentry->d_seq); | ||
472 | } | 459 | } |
473 | } | 460 | } |
474 | EXPORT_SYMBOL(__d_drop); | 461 | EXPORT_SYMBOL(__d_drop); |
@@ -2060,7 +2047,7 @@ static inline bool d_same_name(const struct dentry *dentry, | |||
2060 | return false; | 2047 | return false; |
2061 | return dentry_cmp(dentry, name->name, name->len) == 0; | 2048 | return dentry_cmp(dentry, name->name, name->len) == 0; |
2062 | } | 2049 | } |
2063 | return parent->d_op->d_compare(parent, dentry, | 2050 | return parent->d_op->d_compare(dentry, |
2064 | dentry->d_name.len, dentry->d_name.name, | 2051 | dentry->d_name.len, dentry->d_name.name, |
2065 | name) == 0; | 2052 | name) == 0; |
2066 | } | 2053 | } |
@@ -2163,7 +2150,7 @@ seqretry: | |||
2163 | cpu_relax(); | 2150 | cpu_relax(); |
2164 | goto seqretry; | 2151 | goto seqretry; |
2165 | } | 2152 | } |
2166 | if (parent->d_op->d_compare(parent, dentry, | 2153 | if (parent->d_op->d_compare(dentry, |
2167 | tlen, tname, name) != 0) | 2154 | tlen, tname, name) != 0) |
2168 | continue; | 2155 | continue; |
2169 | } else { | 2156 | } else { |
@@ -2352,19 +2339,15 @@ again: | |||
2352 | } | 2339 | } |
2353 | EXPORT_SYMBOL(d_delete); | 2340 | EXPORT_SYMBOL(d_delete); |
2354 | 2341 | ||
2355 | static void __d_rehash(struct dentry * entry, struct hlist_bl_head *b) | 2342 | static void __d_rehash(struct dentry *entry) |
2356 | { | 2343 | { |
2344 | struct hlist_bl_head *b = d_hash(entry->d_name.hash); | ||
2357 | BUG_ON(!d_unhashed(entry)); | 2345 | BUG_ON(!d_unhashed(entry)); |
2358 | hlist_bl_lock(b); | 2346 | hlist_bl_lock(b); |
2359 | hlist_bl_add_head_rcu(&entry->d_hash, b); | 2347 | hlist_bl_add_head_rcu(&entry->d_hash, b); |
2360 | hlist_bl_unlock(b); | 2348 | hlist_bl_unlock(b); |
2361 | } | 2349 | } |
2362 | 2350 | ||
2363 | static void _d_rehash(struct dentry * entry) | ||
2364 | { | ||
2365 | __d_rehash(entry, d_hash(entry->d_name.hash)); | ||
2366 | } | ||
2367 | |||
2368 | /** | 2351 | /** |
2369 | * d_rehash - add an entry back to the hash | 2352 | * d_rehash - add an entry back to the hash |
2370 | * @entry: dentry to add to the hash | 2353 | * @entry: dentry to add to the hash |
@@ -2375,7 +2358,7 @@ static void _d_rehash(struct dentry * entry) | |||
2375 | void d_rehash(struct dentry * entry) | 2358 | void d_rehash(struct dentry * entry) |
2376 | { | 2359 | { |
2377 | spin_lock(&entry->d_lock); | 2360 | spin_lock(&entry->d_lock); |
2378 | _d_rehash(entry); | 2361 | __d_rehash(entry); |
2379 | spin_unlock(&entry->d_lock); | 2362 | spin_unlock(&entry->d_lock); |
2380 | } | 2363 | } |
2381 | EXPORT_SYMBOL(d_rehash); | 2364 | EXPORT_SYMBOL(d_rehash); |
@@ -2549,7 +2532,7 @@ static inline void __d_add(struct dentry *dentry, struct inode *inode) | |||
2549 | raw_write_seqcount_end(&dentry->d_seq); | 2532 | raw_write_seqcount_end(&dentry->d_seq); |
2550 | fsnotify_update_flags(dentry); | 2533 | fsnotify_update_flags(dentry); |
2551 | } | 2534 | } |
2552 | _d_rehash(dentry); | 2535 | __d_rehash(dentry); |
2553 | if (dir) | 2536 | if (dir) |
2554 | end_dir_add(dir, n); | 2537 | end_dir_add(dir, n); |
2555 | spin_unlock(&dentry->d_lock); | 2538 | spin_unlock(&dentry->d_lock); |
@@ -2611,7 +2594,7 @@ struct dentry *d_exact_alias(struct dentry *entry, struct inode *inode) | |||
2611 | alias = NULL; | 2594 | alias = NULL; |
2612 | } else { | 2595 | } else { |
2613 | __dget_dlock(alias); | 2596 | __dget_dlock(alias); |
2614 | _d_rehash(alias); | 2597 | __d_rehash(alias); |
2615 | spin_unlock(&alias->d_lock); | 2598 | spin_unlock(&alias->d_lock); |
2616 | } | 2599 | } |
2617 | spin_unlock(&inode->i_lock); | 2600 | spin_unlock(&inode->i_lock); |
@@ -2795,23 +2778,10 @@ static void __d_move(struct dentry *dentry, struct dentry *target, | |||
2795 | write_seqcount_begin(&dentry->d_seq); | 2778 | write_seqcount_begin(&dentry->d_seq); |
2796 | write_seqcount_begin_nested(&target->d_seq, DENTRY_D_LOCK_NESTED); | 2779 | write_seqcount_begin_nested(&target->d_seq, DENTRY_D_LOCK_NESTED); |
2797 | 2780 | ||
2781 | /* unhash both */ | ||
2798 | /* __d_drop does write_seqcount_barrier, but they're OK to nest. */ | 2782 | /* __d_drop does write_seqcount_barrier, but they're OK to nest. */ |
2799 | |||
2800 | /* | ||
2801 | * Move the dentry to the target hash queue. Don't bother checking | ||
2802 | * for the same hash queue because of how unlikely it is. | ||
2803 | */ | ||
2804 | __d_drop(dentry); | 2783 | __d_drop(dentry); |
2805 | __d_rehash(dentry, d_hash(target->d_name.hash)); | ||
2806 | |||
2807 | /* | ||
2808 | * Unhash the target (d_delete() is not usable here). If exchanging | ||
2809 | * the two dentries, then rehash onto the other's hash queue. | ||
2810 | */ | ||
2811 | __d_drop(target); | 2784 | __d_drop(target); |
2812 | if (exchange) { | ||
2813 | __d_rehash(target, d_hash(dentry->d_name.hash)); | ||
2814 | } | ||
2815 | 2785 | ||
2816 | /* Switch the names.. */ | 2786 | /* Switch the names.. */ |
2817 | if (exchange) | 2787 | if (exchange) |
@@ -2819,6 +2789,11 @@ static void __d_move(struct dentry *dentry, struct dentry *target, | |||
2819 | else | 2789 | else |
2820 | copy_name(dentry, target); | 2790 | copy_name(dentry, target); |
2821 | 2791 | ||
2792 | /* rehash in new place(s) */ | ||
2793 | __d_rehash(dentry); | ||
2794 | if (exchange) | ||
2795 | __d_rehash(target); | ||
2796 | |||
2822 | /* ... and switch them in the tree */ | 2797 | /* ... and switch them in the tree */ |
2823 | if (IS_ROOT(dentry)) { | 2798 | if (IS_ROOT(dentry)) { |
2824 | /* splicing a tree */ | 2799 | /* splicing a tree */ |
diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c index a5e607e8f056..688ccc16b702 100644 --- a/fs/efivarfs/super.c +++ b/fs/efivarfs/super.c | |||
@@ -45,8 +45,7 @@ static struct super_block *efivarfs_sb; | |||
45 | * So we need to perform a case-sensitive match on part 1 and a | 45 | * So we need to perform a case-sensitive match on part 1 and a |
46 | * case-insensitive match on part 2. | 46 | * case-insensitive match on part 2. |
47 | */ | 47 | */ |
48 | static int efivarfs_d_compare(const struct dentry *parent, | 48 | static int efivarfs_d_compare(const struct dentry *dentry, |
49 | const struct dentry *dentry, | ||
50 | unsigned int len, const char *str, | 49 | unsigned int len, const char *str, |
51 | const struct qstr *name) | 50 | const struct qstr *name) |
52 | { | 51 | { |
diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c index 1337c0c7527d..664655b2c55f 100644 --- a/fs/fat/namei_msdos.c +++ b/fs/fat/namei_msdos.c | |||
@@ -162,10 +162,10 @@ static int msdos_hash(const struct dentry *dentry, struct qstr *qstr) | |||
162 | * Compare two msdos names. If either of the names are invalid, | 162 | * Compare two msdos names. If either of the names are invalid, |
163 | * we fall back to doing the standard name comparison. | 163 | * we fall back to doing the standard name comparison. |
164 | */ | 164 | */ |
165 | static int msdos_cmp(const struct dentry *parent, const struct dentry *dentry, | 165 | static int msdos_cmp(const struct dentry *dentry, |
166 | unsigned int len, const char *str, const struct qstr *name) | 166 | unsigned int len, const char *str, const struct qstr *name) |
167 | { | 167 | { |
168 | struct fat_mount_options *options = &MSDOS_SB(parent->d_sb)->options; | 168 | struct fat_mount_options *options = &MSDOS_SB(dentry->d_sb)->options; |
169 | unsigned char a_msdos_name[MSDOS_NAME], b_msdos_name[MSDOS_NAME]; | 169 | unsigned char a_msdos_name[MSDOS_NAME], b_msdos_name[MSDOS_NAME]; |
170 | int error; | 170 | int error; |
171 | 171 | ||
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 092b911f5c4e..92b7363dafa9 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c | |||
@@ -138,10 +138,10 @@ static int vfat_hashi(const struct dentry *dentry, struct qstr *qstr) | |||
138 | /* | 138 | /* |
139 | * Case insensitive compare of two vfat names. | 139 | * Case insensitive compare of two vfat names. |
140 | */ | 140 | */ |
141 | static int vfat_cmpi(const struct dentry *parent, const struct dentry *dentry, | 141 | static int vfat_cmpi(const struct dentry *dentry, |
142 | unsigned int len, const char *str, const struct qstr *name) | 142 | unsigned int len, const char *str, const struct qstr *name) |
143 | { | 143 | { |
144 | struct nls_table *t = MSDOS_SB(parent->d_sb)->nls_io; | 144 | struct nls_table *t = MSDOS_SB(dentry->d_sb)->nls_io; |
145 | unsigned int alen, blen; | 145 | unsigned int alen, blen; |
146 | 146 | ||
147 | /* A filename cannot end in '.' or we treat it like it has none */ | 147 | /* A filename cannot end in '.' or we treat it like it has none */ |
@@ -157,7 +157,7 @@ static int vfat_cmpi(const struct dentry *parent, const struct dentry *dentry, | |||
157 | /* | 157 | /* |
158 | * Case sensitive compare of two vfat names. | 158 | * Case sensitive compare of two vfat names. |
159 | */ | 159 | */ |
160 | static int vfat_cmp(const struct dentry *parent, const struct dentry *dentry, | 160 | static int vfat_cmp(const struct dentry *dentry, |
161 | unsigned int len, const char *str, const struct qstr *name) | 161 | unsigned int len, const char *str, const struct qstr *name) |
162 | { | 162 | { |
163 | unsigned int alen, blen; | 163 | unsigned int alen, blen; |
diff --git a/fs/hfs/hfs_fs.h b/fs/hfs/hfs_fs.h index e799ebe71b51..16f5172ee40d 100644 --- a/fs/hfs/hfs_fs.h +++ b/fs/hfs/hfs_fs.h | |||
@@ -233,7 +233,7 @@ extern const struct dentry_operations hfs_dentry_operations; | |||
233 | extern int hfs_hash_dentry(const struct dentry *, struct qstr *); | 233 | extern int hfs_hash_dentry(const struct dentry *, struct qstr *); |
234 | extern int hfs_strcmp(const unsigned char *, unsigned int, | 234 | extern int hfs_strcmp(const unsigned char *, unsigned int, |
235 | const unsigned char *, unsigned int); | 235 | const unsigned char *, unsigned int); |
236 | extern int hfs_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | 236 | extern int hfs_compare_dentry(const struct dentry *dentry, |
237 | unsigned int len, const char *str, const struct qstr *name); | 237 | unsigned int len, const char *str, const struct qstr *name); |
238 | 238 | ||
239 | /* trans.c */ | 239 | /* trans.c */ |
diff --git a/fs/hfs/string.c b/fs/hfs/string.c index ec9f164c35a5..3912209153a8 100644 --- a/fs/hfs/string.c +++ b/fs/hfs/string.c | |||
@@ -92,7 +92,7 @@ int hfs_strcmp(const unsigned char *s1, unsigned int len1, | |||
92 | * Test for equality of two strings in the HFS filename character ordering. | 92 | * Test for equality of two strings in the HFS filename character ordering. |
93 | * return 1 on failure and 0 on success | 93 | * return 1 on failure and 0 on success |
94 | */ | 94 | */ |
95 | int hfs_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | 95 | int hfs_compare_dentry(const struct dentry *dentry, |
96 | unsigned int len, const char *str, const struct qstr *name) | 96 | unsigned int len, const char *str, const struct qstr *name) |
97 | { | 97 | { |
98 | const unsigned char *n1, *n2; | 98 | const unsigned char *n1, *n2; |
diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h index 47e009666abd..a3f03b247463 100644 --- a/fs/hfsplus/hfsplus_fs.h +++ b/fs/hfsplus/hfsplus_fs.h | |||
@@ -520,8 +520,7 @@ int hfsplus_uni2asc(struct super_block *sb, const struct hfsplus_unistr *ustr, | |||
520 | int hfsplus_asc2uni(struct super_block *sb, struct hfsplus_unistr *ustr, | 520 | int hfsplus_asc2uni(struct super_block *sb, struct hfsplus_unistr *ustr, |
521 | int max_unistr_len, const char *astr, int len); | 521 | int max_unistr_len, const char *astr, int len); |
522 | int hfsplus_hash_dentry(const struct dentry *dentry, struct qstr *str); | 522 | int hfsplus_hash_dentry(const struct dentry *dentry, struct qstr *str); |
523 | int hfsplus_compare_dentry(const struct dentry *parent, | 523 | int hfsplus_compare_dentry(const struct dentry *dentry, unsigned int len, |
524 | const struct dentry *dentry, unsigned int len, | ||
525 | const char *str, const struct qstr *name); | 524 | const char *str, const struct qstr *name); |
526 | 525 | ||
527 | /* wrapper.c */ | 526 | /* wrapper.c */ |
diff --git a/fs/hfsplus/unicode.c b/fs/hfsplus/unicode.c index c13c8a240be3..e563939882f3 100644 --- a/fs/hfsplus/unicode.c +++ b/fs/hfsplus/unicode.c | |||
@@ -385,10 +385,10 @@ int hfsplus_hash_dentry(const struct dentry *dentry, struct qstr *str) | |||
385 | * Composed unicode characters are decomposed and case-folding is performed | 385 | * Composed unicode characters are decomposed and case-folding is performed |
386 | * if the appropriate bits are (un)set on the superblock. | 386 | * if the appropriate bits are (un)set on the superblock. |
387 | */ | 387 | */ |
388 | int hfsplus_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | 388 | int hfsplus_compare_dentry(const struct dentry *dentry, |
389 | unsigned int len, const char *str, const struct qstr *name) | 389 | unsigned int len, const char *str, const struct qstr *name) |
390 | { | 390 | { |
391 | struct super_block *sb = parent->d_sb; | 391 | struct super_block *sb = dentry->d_sb; |
392 | int casefold, decompose, size; | 392 | int casefold, decompose, size; |
393 | int dsize1, dsize2, len1, len2; | 393 | int dsize1, dsize2, len1, len2; |
394 | const u16 *dstr1, *dstr2; | 394 | const u16 *dstr1, *dstr2; |
diff --git a/fs/hpfs/dentry.c b/fs/hpfs/dentry.c index 60e6d334d79a..bb87d65f0d97 100644 --- a/fs/hpfs/dentry.c +++ b/fs/hpfs/dentry.c | |||
@@ -34,7 +34,7 @@ static int hpfs_hash_dentry(const struct dentry *dentry, struct qstr *qstr) | |||
34 | return 0; | 34 | return 0; |
35 | } | 35 | } |
36 | 36 | ||
37 | static int hpfs_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | 37 | static int hpfs_compare_dentry(const struct dentry *dentry, |
38 | unsigned int len, const char *str, const struct qstr *name) | 38 | unsigned int len, const char *str, const struct qstr *name) |
39 | { | 39 | { |
40 | unsigned al = len; | 40 | unsigned al = len; |
@@ -50,7 +50,7 @@ static int hpfs_compare_dentry(const struct dentry *parent, const struct dentry | |||
50 | 50 | ||
51 | if (hpfs_chk_name(name->name, &bl)) | 51 | if (hpfs_chk_name(name->name, &bl)) |
52 | return 1; | 52 | return 1; |
53 | if (hpfs_compare_names(parent->d_sb, str, al, name->name, bl, 0)) | 53 | if (hpfs_compare_names(dentry->d_sb, str, al, name->name, bl, 0)) |
54 | return 1; | 54 | return 1; |
55 | return 0; | 55 | return 0; |
56 | } | 56 | } |
diff --git a/fs/inode.c b/fs/inode.c index ad445542c285..7e3ef3af3db9 100644 --- a/fs/inode.c +++ b/fs/inode.c | |||
@@ -1729,7 +1729,6 @@ int dentry_needs_remove_privs(struct dentry *dentry) | |||
1729 | mask |= ATTR_KILL_PRIV; | 1729 | mask |= ATTR_KILL_PRIV; |
1730 | return mask; | 1730 | return mask; |
1731 | } | 1731 | } |
1732 | EXPORT_SYMBOL(dentry_needs_remove_privs); | ||
1733 | 1732 | ||
1734 | static int __remove_privs(struct dentry *dentry, int kill) | 1733 | static int __remove_privs(struct dentry *dentry, int kill) |
1735 | { | 1734 | { |
@@ -1749,8 +1748,8 @@ static int __remove_privs(struct dentry *dentry, int kill) | |||
1749 | */ | 1748 | */ |
1750 | int file_remove_privs(struct file *file) | 1749 | int file_remove_privs(struct file *file) |
1751 | { | 1750 | { |
1752 | struct dentry *dentry = file->f_path.dentry; | 1751 | struct dentry *dentry = file_dentry(file); |
1753 | struct inode *inode = d_inode(dentry); | 1752 | struct inode *inode = file_inode(file); |
1754 | int kill; | 1753 | int kill; |
1755 | int error = 0; | 1754 | int error = 0; |
1756 | 1755 | ||
@@ -1758,7 +1757,7 @@ int file_remove_privs(struct file *file) | |||
1758 | if (IS_NOSEC(inode)) | 1757 | if (IS_NOSEC(inode)) |
1759 | return 0; | 1758 | return 0; |
1760 | 1759 | ||
1761 | kill = file_needs_remove_privs(file); | 1760 | kill = dentry_needs_remove_privs(dentry); |
1762 | if (kill < 0) | 1761 | if (kill < 0) |
1763 | return kill; | 1762 | return kill; |
1764 | if (kill) | 1763 | if (kill) |
diff --git a/fs/internal.h b/fs/internal.h index cef0913e5d41..cc5a530e4f06 100644 --- a/fs/internal.h +++ b/fs/internal.h | |||
@@ -117,6 +117,7 @@ extern int vfs_open(const struct path *, struct file *, const struct cred *); | |||
117 | */ | 117 | */ |
118 | extern long prune_icache_sb(struct super_block *sb, struct shrink_control *sc); | 118 | extern long prune_icache_sb(struct super_block *sb, struct shrink_control *sc); |
119 | extern void inode_add_lru(struct inode *inode); | 119 | extern void inode_add_lru(struct inode *inode); |
120 | extern int dentry_needs_remove_privs(struct dentry *dentry); | ||
120 | 121 | ||
121 | /* | 122 | /* |
122 | * fs-writeback.c | 123 | * fs-writeback.c |
diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 761fade7680f..ad0c745ebad7 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c | |||
@@ -29,18 +29,15 @@ | |||
29 | #define BEQUIET | 29 | #define BEQUIET |
30 | 30 | ||
31 | static int isofs_hashi(const struct dentry *parent, struct qstr *qstr); | 31 | static int isofs_hashi(const struct dentry *parent, struct qstr *qstr); |
32 | static int isofs_dentry_cmpi(const struct dentry *parent, | 32 | static int isofs_dentry_cmpi(const struct dentry *dentry, |
33 | const struct dentry *dentry, | ||
34 | unsigned int len, const char *str, const struct qstr *name); | 33 | unsigned int len, const char *str, const struct qstr *name); |
35 | 34 | ||
36 | #ifdef CONFIG_JOLIET | 35 | #ifdef CONFIG_JOLIET |
37 | static int isofs_hashi_ms(const struct dentry *parent, struct qstr *qstr); | 36 | static int isofs_hashi_ms(const struct dentry *parent, struct qstr *qstr); |
38 | static int isofs_hash_ms(const struct dentry *parent, struct qstr *qstr); | 37 | static int isofs_hash_ms(const struct dentry *parent, struct qstr *qstr); |
39 | static int isofs_dentry_cmpi_ms(const struct dentry *parent, | 38 | static int isofs_dentry_cmpi_ms(const struct dentry *dentry, |
40 | const struct dentry *dentry, | ||
41 | unsigned int len, const char *str, const struct qstr *name); | 39 | unsigned int len, const char *str, const struct qstr *name); |
42 | static int isofs_dentry_cmp_ms(const struct dentry *parent, | 40 | static int isofs_dentry_cmp_ms(const struct dentry *dentry, |
43 | const struct dentry *dentry, | ||
44 | unsigned int len, const char *str, const struct qstr *name); | 41 | unsigned int len, const char *str, const struct qstr *name); |
45 | #endif | 42 | #endif |
46 | 43 | ||
@@ -235,7 +232,7 @@ isofs_hashi(const struct dentry *dentry, struct qstr *qstr) | |||
235 | } | 232 | } |
236 | 233 | ||
237 | static int | 234 | static int |
238 | isofs_dentry_cmpi(const struct dentry *parent, const struct dentry *dentry, | 235 | isofs_dentry_cmpi(const struct dentry *dentry, |
239 | unsigned int len, const char *str, const struct qstr *name) | 236 | unsigned int len, const char *str, const struct qstr *name) |
240 | { | 237 | { |
241 | return isofs_dentry_cmp_common(len, str, name, 0, 1); | 238 | return isofs_dentry_cmp_common(len, str, name, 0, 1); |
@@ -276,14 +273,14 @@ isofs_hashi_ms(const struct dentry *dentry, struct qstr *qstr) | |||
276 | } | 273 | } |
277 | 274 | ||
278 | static int | 275 | static int |
279 | isofs_dentry_cmp_ms(const struct dentry *parent, const struct dentry *dentry, | 276 | isofs_dentry_cmp_ms(const struct dentry *dentry, |
280 | unsigned int len, const char *str, const struct qstr *name) | 277 | unsigned int len, const char *str, const struct qstr *name) |
281 | { | 278 | { |
282 | return isofs_dentry_cmp_common(len, str, name, 1, 0); | 279 | return isofs_dentry_cmp_common(len, str, name, 1, 0); |
283 | } | 280 | } |
284 | 281 | ||
285 | static int | 282 | static int |
286 | isofs_dentry_cmpi_ms(const struct dentry *parent, const struct dentry *dentry, | 283 | isofs_dentry_cmpi_ms(const struct dentry *dentry, |
287 | unsigned int len, const char *str, const struct qstr *name) | 284 | unsigned int len, const char *str, const struct qstr *name) |
288 | { | 285 | { |
289 | return isofs_dentry_cmp_common(len, str, name, 1, 1); | 286 | return isofs_dentry_cmp_common(len, str, name, 1, 1); |
diff --git a/fs/isofs/namei.c b/fs/isofs/namei.c index 7b543e6b6526..aee592767f1d 100644 --- a/fs/isofs/namei.c +++ b/fs/isofs/namei.c | |||
@@ -22,7 +22,7 @@ isofs_cmp(struct dentry *dentry, const char *compare, int dlen) | |||
22 | qstr.len = dlen; | 22 | qstr.len = dlen; |
23 | if (likely(!dentry->d_op)) | 23 | if (likely(!dentry->d_op)) |
24 | return dentry->d_name.len != dlen || memcmp(dentry->d_name.name, compare, dlen); | 24 | return dentry->d_name.len != dlen || memcmp(dentry->d_name.name, compare, dlen); |
25 | return dentry->d_op->d_compare(NULL, NULL, dentry->d_name.len, dentry->d_name.name, &qstr); | 25 | return dentry->d_op->d_compare(NULL, dentry->d_name.len, dentry->d_name.name, &qstr); |
26 | } | 26 | } |
27 | 27 | ||
28 | /* | 28 | /* |
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 04baf0dfc40c..814b0c58016c 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c | |||
@@ -1572,7 +1572,7 @@ static int jfs_ci_hash(const struct dentry *dir, struct qstr *this) | |||
1572 | return 0; | 1572 | return 0; |
1573 | } | 1573 | } |
1574 | 1574 | ||
1575 | static int jfs_ci_compare(const struct dentry *parent, const struct dentry *dentry, | 1575 | static int jfs_ci_compare(const struct dentry *dentry, |
1576 | unsigned int len, const char *str, const struct qstr *name) | 1576 | unsigned int len, const char *str, const struct qstr *name) |
1577 | { | 1577 | { |
1578 | int i, result = 1; | 1578 | int i, result = 1; |
diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index 9add7ab747a5..17de5c13dfae 100644 --- a/fs/ncpfs/dir.c +++ b/fs/ncpfs/dir.c | |||
@@ -74,7 +74,7 @@ const struct inode_operations ncp_dir_inode_operations = | |||
74 | */ | 74 | */ |
75 | static int ncp_lookup_validate(struct dentry *, unsigned int); | 75 | static int ncp_lookup_validate(struct dentry *, unsigned int); |
76 | static int ncp_hash_dentry(const struct dentry *, struct qstr *); | 76 | static int ncp_hash_dentry(const struct dentry *, struct qstr *); |
77 | static int ncp_compare_dentry(const struct dentry *, const struct dentry *, | 77 | static int ncp_compare_dentry(const struct dentry *, |
78 | unsigned int, const char *, const struct qstr *); | 78 | unsigned int, const char *, const struct qstr *); |
79 | static int ncp_delete_dentry(const struct dentry *); | 79 | static int ncp_delete_dentry(const struct dentry *); |
80 | static void ncp_d_prune(struct dentry *dentry); | 80 | static void ncp_d_prune(struct dentry *dentry); |
@@ -154,7 +154,7 @@ ncp_hash_dentry(const struct dentry *dentry, struct qstr *this) | |||
154 | * the callers will handle races. | 154 | * the callers will handle races. |
155 | */ | 155 | */ |
156 | static int | 156 | static int |
157 | ncp_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | 157 | ncp_compare_dentry(const struct dentry *dentry, |
158 | unsigned int len, const char *str, const struct qstr *name) | 158 | unsigned int len, const char *str, const struct qstr *name) |
159 | { | 159 | { |
160 | struct inode *pinode; | 160 | struct inode *pinode; |
@@ -162,7 +162,7 @@ ncp_compare_dentry(const struct dentry *parent, const struct dentry *dentry, | |||
162 | if (len != name->len) | 162 | if (len != name->len) |
163 | return 1; | 163 | return 1; |
164 | 164 | ||
165 | pinode = d_inode_rcu(parent); | 165 | pinode = d_inode_rcu(dentry->d_parent); |
166 | if (!pinode) | 166 | if (!pinode) |
167 | return 1; | 167 | return 1; |
168 | 168 | ||
diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c index ffbb513c06c6..1b93650dda2f 100644 --- a/fs/proc/proc_sysctl.c +++ b/fs/proc/proc_sysctl.c | |||
@@ -834,7 +834,7 @@ static int sysctl_is_seen(struct ctl_table_header *p) | |||
834 | return res; | 834 | return res; |
835 | } | 835 | } |
836 | 836 | ||
837 | static int proc_sys_compare(const struct dentry *parent, const struct dentry *dentry, | 837 | static int proc_sys_compare(const struct dentry *dentry, |
838 | unsigned int len, const char *str, const struct qstr *name) | 838 | unsigned int len, const char *str, const struct qstr *name) |
839 | { | 839 | { |
840 | struct ctl_table_header *head; | 840 | struct ctl_table_header *head; |
diff --git a/include/linux/dcache.h b/include/linux/dcache.h index accfa1ef072a..5ff3e9a4fe5f 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h | |||
@@ -130,7 +130,7 @@ struct dentry_operations { | |||
130 | int (*d_revalidate)(struct dentry *, unsigned int); | 130 | int (*d_revalidate)(struct dentry *, unsigned int); |
131 | int (*d_weak_revalidate)(struct dentry *, unsigned int); | 131 | int (*d_weak_revalidate)(struct dentry *, unsigned int); |
132 | int (*d_hash)(const struct dentry *, struct qstr *); | 132 | int (*d_hash)(const struct dentry *, struct qstr *); |
133 | int (*d_compare)(const struct dentry *, const struct dentry *, | 133 | int (*d_compare)(const struct dentry *, |
134 | unsigned int, const char *, const struct qstr *); | 134 | unsigned int, const char *, const struct qstr *); |
135 | int (*d_delete)(const struct dentry *); | 135 | int (*d_delete)(const struct dentry *); |
136 | int (*d_init)(struct dentry *); | 136 | int (*d_init)(struct dentry *); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 498255e6914e..33f0e96db06f 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
@@ -2748,11 +2748,6 @@ extern struct inode *new_inode(struct super_block *sb); | |||
2748 | extern void free_inode_nonrcu(struct inode *inode); | 2748 | extern void free_inode_nonrcu(struct inode *inode); |
2749 | extern int should_remove_suid(struct dentry *); | 2749 | extern int should_remove_suid(struct dentry *); |
2750 | extern int file_remove_privs(struct file *); | 2750 | extern int file_remove_privs(struct file *); |
2751 | extern int dentry_needs_remove_privs(struct dentry *dentry); | ||
2752 | static inline int file_needs_remove_privs(struct file *file) | ||
2753 | { | ||
2754 | return dentry_needs_remove_privs(file->f_path.dentry); | ||
2755 | } | ||
2756 | 2751 | ||
2757 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); | 2752 | extern void __insert_inode_hash(struct inode *, unsigned long hashval); |
2758 | static inline void insert_inode_hash(struct inode *inode) | 2753 | static inline void insert_inode_hash(struct inode *inode) |