sanitize lookup_hash prototype
Subsystems (5)
PATCH 1/1 sanitize lookup_hash prototype
->permission and ->lookup have a struct nameidata * argument these days to pass down lookup intents. Unfortunately some callers of lookup_hash don't actually pass this one down. For lookup_one_len() we don't have a struct nameidata to pass down, but as this function is a library function only used by filesystem code this is an acceptable limitation. All other callers should pass down the nameidata, so this patch changes the lookup_hash interface to only take a struct nameidata argument and derives the other two arguments to __lookup_hash from it. All callers already have the nameidata argument available so this is not a problem.
At the same time I'd like to deprecate the lookup_hash interface as there are better exported interfaces for filesystem usage. Before it can actually be removed I need to fix up rpc_pipefs.
fs/namei.c +10 -10
@@ -1173,9 +1173,9 @@return dentry; } -struct dentry *lookup_hash (struct qstr *name,struct dentry * base) +struct dentry *lookup_hash (struct nameidata *nd) { -return __lookup_hash (name, base,NULL ); +return __lookup_hash (&nd->last, nd->dentry, nd); }/* SMP-safe */
@@ -1199,7 +1199,7 @@ } this.hash =end_name_hash (hash); -return lookup_hash (&this, base); +return __lookup_hash (&this, base,NULL ); access:return ERR_PTR (-EACCES ); }
@@ -1538,7 +1538,7 @@ dir = nd->dentry; nd->flags &= ~LOOKUP_PARENT ;down (&dir->d_inode->i_sem); - path.dentry =__lookup_hash (&nd->last, nd->dentry, nd); + path.dentry =lookup_hash (nd); path.mnt = nd->mnt; do_last:
@@ -1640,7 +1640,7 @@ } dir = nd->dentry;down (&dir->d_inode->i_sem); - path.dentry =__lookup_hash (&nd->last, nd->dentry, nd); + path.dentry =lookup_hash (nd); path.mnt = nd->mnt;__putname (nd->last.name); goto do_last;
@@ -1672,7 +1672,7 @@/* * Do the final lookup. */ - dentry =lookup_hash (&nd->last, nd->dentry); + dentry =lookup_hash (nd);if (IS_ERR (dentry)) goto fail;
@@ -1907,7 +1907,7 @@ goto exit1; }down (&nd.dentry->d_inode->i_sem); - dentry =lookup_hash (&nd.last, nd.dentry); + dentry =lookup_hash (&nd); error =PTR_ERR (dentry);if (!IS_ERR (dentry)) { error =vfs_rmdir (nd.dentry->d_inode, dentry);
@@ -1976,7 +1976,7 @@if (nd.last_type !=LAST_NORM ) goto exit1;down (&nd.dentry->d_inode->i_sem); - dentry =lookup_hash (&nd.last, nd.dentry); + dentry =lookup_hash (&nd); error =PTR_ERR (dentry);if (!IS_ERR (dentry)) {/* Why not before? Because we want correct error value */
@@ -2319,7 +2319,7 @@ trap =lock_rename (new_dir, old_dir); - old_dentry =lookup_hash (&oldnd.last, old_dir); + old_dentry =lookup_hash (&oldnd); error =PTR_ERR (old_dentry);if (IS_ERR (old_dentry)) goto exit3;
@@ -2339,7 +2339,7 @@ error = -EINVAL ;if (old_dentry == trap) goto exit4; - new_dentry =lookup_hash (&newnd.last, new_dir); + new_dentry =lookup_hash (&newnd); error =PTR_ERR (new_dentry);if (IS_ERR (new_dentry)) goto exit4;
include/linux/namei.h +1 -1
@@ -74,7 +74,7 @@extern void release_open_intent (struct nameidata *);extern struct dentry *lookup_one_len (const char *,struct dentry *,int ); -extern struct dentry *lookup_hash (struct qstr *,struct dentry *); +extern struct dentry *lookup_hash (struct nameidata *);extern int follow_down (struct vfsmount **,struct dentry **);extern int follow_up (struct vfsmount **,struct dentry **);
net/sunrpc/rpc_pipe.c +2 -2
@@ -665,7 +665,7 @@return error; dir = nd.dentry->d_inode;down (&dir->i_sem); - dentry =lookup_hash (&nd.last, nd.dentry); + dentry =lookup_hash (&nd);if (IS_ERR (dentry)) { error =PTR_ERR (dentry); goto out_release;
@@ -726,7 +726,7 @@return error; dir = nd.dentry->d_inode;down (&dir->i_sem); - dentry =lookup_hash (&nd.last, nd.dentry); + dentry =lookup_hash (&nd);if (IS_ERR (dentry)) { error =PTR_ERR (dentry); goto out_release;
Documentation/feature-removal-schedule.txt +7 -0
@@ -95,3 +95,10 @@ to link against API-compatible library on top of libnfnetlink_queue instead of the current 'libipq'. Who: Harald Welte <[email protected]> + +--------------------------- + +What: EXPORT_SYMBOL(lookup_hash) +When: January 2006 +Why: Too low-level interface. Use lookup_one_len or lookup_create instead. +Who: Christoph Hellwig <[email protected]>
Quoted 11 lines · Christoph Hellwig
->permission and ->lookup have a struct nameidata * argument these days to pass down lookup intents. Unfortunately some callers of
lookup_hashdon't actually pass this one down. Forlookup_one_len()we don't have a struct nameidata to pass down, but as this function is a library function only used by filesystem code this is an acceptable limitation. All other callers should pass down the nameidata, so this patch changes thelookup_hashinterface to only take a struct nameidata argument and derives the other two arguments to__lookup_hashfrom it. All callers already have the nameidata argument available so this is not a problem.
Quoted 3 lines
At the same time I'd like to deprecate the
lookup_hashinterface as there are better exported interfaces for filesystem usage. Before it can actually be removed I need to fix uprpc_pipefs.
Sorry, the last patch was actually missing one hook in rpc_pipe.c, this one is correct:
fs/namei.c +10 -10
@@ -1173,9 +1173,9 @@return dentry; } -struct dentry *lookup_hash (struct qstr *name,struct dentry * base) +struct dentry *lookup_hash (struct nameidata *nd) { -return __lookup_hash (name, base,NULL ); +return __lookup_hash (&nd->last, nd->dentry, nd); }/* SMP-safe */
@@ -1199,7 +1199,7 @@ } this.hash =end_name_hash (hash); -return lookup_hash (&this, base); +return __lookup_hash (&this, base,NULL ); access:return ERR_PTR (-EACCES ); }
@@ -1538,7 +1538,7 @@ dir = nd->dentry; nd->flags &= ~LOOKUP_PARENT ;down (&dir->d_inode->i_sem); - path.dentry =__lookup_hash (&nd->last, nd->dentry, nd); + path.dentry =lookup_hash (nd); path.mnt = nd->mnt; do_last:
@@ -1640,7 +1640,7 @@ } dir = nd->dentry;down (&dir->d_inode->i_sem); - path.dentry =__lookup_hash (&nd->last, nd->dentry, nd); + path.dentry =lookup_hash (nd); path.mnt = nd->mnt;__putname (nd->last.name); goto do_last;
@@ -1672,7 +1672,7 @@/* * Do the final lookup. */ - dentry =lookup_hash (&nd->last, nd->dentry); + dentry =lookup_hash (nd);if (IS_ERR (dentry)) goto fail;
@@ -1907,7 +1907,7 @@ goto exit1; }down (&nd.dentry->d_inode->i_sem); - dentry =lookup_hash (&nd.last, nd.dentry); + dentry =lookup_hash (&nd); error =PTR_ERR (dentry);if (!IS_ERR (dentry)) { error =vfs_rmdir (nd.dentry->d_inode, dentry);
@@ -1976,7 +1976,7 @@if (nd.last_type !=LAST_NORM ) goto exit1;down (&nd.dentry->d_inode->i_sem); - dentry =lookup_hash (&nd.last, nd.dentry); + dentry =lookup_hash (&nd); error =PTR_ERR (dentry);if (!IS_ERR (dentry)) {/* Why not before? Because we want correct error value */
@@ -2319,7 +2319,7 @@ trap =lock_rename (new_dir, old_dir); - old_dentry =lookup_hash (&oldnd.last, old_dir); + old_dentry =lookup_hash (&oldnd); error =PTR_ERR (old_dentry);if (IS_ERR (old_dentry)) goto exit3;
@@ -2339,7 +2339,7 @@ error = -EINVAL ;if (old_dentry == trap) goto exit4; - new_dentry =lookup_hash (&newnd.last, new_dir); + new_dentry =lookup_hash (&newnd); error =PTR_ERR (new_dentry);if (IS_ERR (new_dentry)) goto exit4;
include/linux/namei.h +1 -1
@@ -74,7 +74,7 @@extern void release_open_intent (struct nameidata *);extern struct dentry *lookup_one_len (const char *,struct dentry *,int ); -extern struct dentry *lookup_hash (struct qstr *,struct dentry *); +extern struct dentry *lookup_hash (struct nameidata *);extern int follow_down (struct vfsmount **,struct dentry **);extern int follow_up (struct vfsmount **,struct dentry **);
net/sunrpc/rpc_pipe.c +3 -3
@@ -603,7 +603,7 @@return ERR_PTR (error); dir = nd->dentry->d_inode;down (&dir->i_sem); - dentry =lookup_hash (&nd->last, nd->dentry); + dentry =lookup_hash (nd);if (IS_ERR (dentry)) goto out_err;if (dentry->d_inode) {
@@ -665,7 +665,7 @@return error; dir = nd.dentry->d_inode;down (&dir->i_sem); - dentry =lookup_hash (&nd.last, nd.dentry); + dentry =lookup_hash (&nd);if (IS_ERR (dentry)) { error =PTR_ERR (dentry); goto out_release;
@@ -726,7 +726,7 @@return error; dir = nd.dentry->d_inode;down (&dir->i_sem); - dentry =lookup_hash (&nd.last, nd.dentry); + dentry =lookup_hash (&nd);if (IS_ERR (dentry)) { error =PTR_ERR (dentry); goto out_release;
Documentation/feature-removal-schedule.txt +7 -0
@@ -95,3 +95,10 @@ to link against API-compatible library on top of libnfnetlink_queue instead of the current 'libipq'. Who: Harald Welte <[email protected]> + +--------------------------- + +What: EXPORT_SYMBOL(lookup_hash) +When: January 2006 +Why: Too low-level interface. Use lookup_one_len or lookup_create instead. +Who: Christoph Hellwig <[email protected]>