|
@@ -767,8 +767,18 @@ static int do_lookup(struct nameidata *nd, struct qstr *name,
|
|
|
struct path *path)
|
|
|
{
|
|
|
struct vfsmount *mnt = nd->path.mnt;
|
|
|
- struct dentry *dentry = __d_lookup(nd->path.dentry, name);
|
|
|
+ struct dentry *dentry;
|
|
|
+ /*
|
|
|
+ * See if the low-level filesystem might want
|
|
|
+ * to use its own hash..
|
|
|
+ */
|
|
|
+ if (nd->path.dentry->d_op && nd->path.dentry->d_op->d_hash) {
|
|
|
+ int err = nd->path.dentry->d_op->d_hash(nd->path.dentry, name);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+ }
|
|
|
|
|
|
+ dentry = __d_lookup(nd->path.dentry, name);
|
|
|
if (!dentry)
|
|
|
goto need_lookup;
|
|
|
if (dentry->d_op && dentry->d_op->d_revalidate)
|
|
@@ -868,16 +878,6 @@ static int link_path_walk(const char *name, struct nameidata *nd)
|
|
|
case 1:
|
|
|
continue;
|
|
|
}
|
|
|
- /*
|
|
|
- * See if the low-level filesystem might want
|
|
|
- * to use its own hash..
|
|
|
- */
|
|
|
- if (nd->path.dentry->d_op && nd->path.dentry->d_op->d_hash) {
|
|
|
- err = nd->path.dentry->d_op->d_hash(nd->path.dentry,
|
|
|
- &this);
|
|
|
- if (err < 0)
|
|
|
- break;
|
|
|
- }
|
|
|
/* This does the actual lookups.. */
|
|
|
err = do_lookup(nd, &this, &next);
|
|
|
if (err)
|
|
@@ -923,12 +923,6 @@ last_component:
|
|
|
case 1:
|
|
|
goto return_reval;
|
|
|
}
|
|
|
- if (nd->path.dentry->d_op && nd->path.dentry->d_op->d_hash) {
|
|
|
- err = nd->path.dentry->d_op->d_hash(nd->path.dentry,
|
|
|
- &this);
|
|
|
- if (err < 0)
|
|
|
- break;
|
|
|
- }
|
|
|
err = do_lookup(nd, &this, &next);
|
|
|
if (err)
|
|
|
break;
|