diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2011-07-17 22:27:22 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-07-17 23:22:48 -0400 |
| commit | 0916a5e45fbd2604a303c8cc18e6b2b7c815e4c9 (patch) | |
| tree | 94846a921e4c8b5c5607c7811e0787e0684a356f | |
| parent | 3cc0658e35124ace881f6942839dcae877c3eaed (diff) | |
hppfs_lookup(): don't open-code lookup_one_len()
... and it's getting it wrong, too - missing ->d_revalidate() calls when
it's dealing with filesystem (procfs) that has non-trivial ->d_revalidate()...
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
| -rw-r--r-- | fs/hppfs/hppfs.c | 19 |
1 files changed, 3 insertions, 16 deletions
diff --git a/fs/hppfs/hppfs.c b/fs/hppfs/hppfs.c index 7d6a0e92bcf0..85c098a499f3 100644 --- a/fs/hppfs/hppfs.c +++ b/fs/hppfs/hppfs.c | |||
| @@ -139,7 +139,8 @@ static int file_removed(struct dentry *dentry, const char *file) | |||
| 139 | static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry, | 139 | static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry, |
| 140 | struct nameidata *nd) | 140 | struct nameidata *nd) |
| 141 | { | 141 | { |
| 142 | struct dentry *proc_dentry, *new, *parent; | 142 | struct dentry *proc_dentry, *parent; |
| 143 | struct qstr *name = &dentry->d_name; | ||
| 143 | struct inode *inode; | 144 | struct inode *inode; |
| 144 | int err, deleted; | 145 | int err, deleted; |
| 145 | 146 | ||
| @@ -149,23 +150,9 @@ static struct dentry *hppfs_lookup(struct inode *ino, struct dentry *dentry, | |||
| 149 | else if (deleted) | 150 | else if (deleted) |
| 150 | return ERR_PTR(-ENOENT); | 151 | return ERR_PTR(-ENOENT); |
| 151 | 152 | ||
| 152 | err = -ENOMEM; | ||
| 153 | parent = HPPFS_I(ino)->proc_dentry; | 153 | parent = HPPFS_I(ino)->proc_dentry; |
| 154 | mutex_lock(&parent->d_inode->i_mutex); | 154 | mutex_lock(&parent->d_inode->i_mutex); |
| 155 | proc_dentry = d_lookup(parent, &dentry->d_name); | 155 | proc_dentry = lookup_one_len(name->name, parent, name->len); |
| 156 | if (proc_dentry == NULL) { | ||
| 157 | proc_dentry = d_alloc(parent, &dentry->d_name); | ||
| 158 | if (proc_dentry == NULL) { | ||
| 159 | mutex_unlock(&parent->d_inode->i_mutex); | ||
| 160 | goto out; | ||
| 161 | } | ||
| 162 | new = (*parent->d_inode->i_op->lookup)(parent->d_inode, | ||
| 163 | proc_dentry, NULL); | ||
| 164 | if (new) { | ||
| 165 | dput(proc_dentry); | ||
| 166 | proc_dentry = new; | ||
| 167 | } | ||
| 168 | } | ||
| 169 | mutex_unlock(&parent->d_inode->i_mutex); | 156 | mutex_unlock(&parent->d_inode->i_mutex); |
| 170 | 157 | ||
| 171 | if (IS_ERR(proc_dentry)) | 158 | if (IS_ERR(proc_dentry)) |
