diff options
Diffstat (limited to 'fs/ocfs2/dcache.c')
-rw-r--r-- | fs/ocfs2/dcache.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/fs/ocfs2/dcache.c b/fs/ocfs2/dcache.c index 895532ac4d98..6d80ecc7834f 100644 --- a/fs/ocfs2/dcache.c +++ b/fs/ocfs2/dcache.c | |||
@@ -52,9 +52,15 @@ void ocfs2_dentry_attach_gen(struct dentry *dentry) | |||
52 | static int ocfs2_dentry_revalidate(struct dentry *dentry, | 52 | static int ocfs2_dentry_revalidate(struct dentry *dentry, |
53 | struct nameidata *nd) | 53 | struct nameidata *nd) |
54 | { | 54 | { |
55 | struct inode *inode = dentry->d_inode; | 55 | struct inode *inode; |
56 | int ret = 0; /* if all else fails, just return false */ | 56 | int ret = 0; /* if all else fails, just return false */ |
57 | struct ocfs2_super *osb = OCFS2_SB(dentry->d_sb); | 57 | struct ocfs2_super *osb; |
58 | |||
59 | if (nd->flags & LOOKUP_RCU) | ||
60 | return -ECHILD; | ||
61 | |||
62 | inode = dentry->d_inode; | ||
63 | osb = OCFS2_SB(dentry->d_sb); | ||
58 | 64 | ||
59 | mlog_entry("(0x%p, '%.*s')\n", dentry, | 65 | mlog_entry("(0x%p, '%.*s')\n", dentry, |
60 | dentry->d_name.len, dentry->d_name.name); | 66 | dentry->d_name.len, dentry->d_name.name); |
@@ -169,23 +175,25 @@ struct dentry *ocfs2_find_local_alias(struct inode *inode, | |||
169 | struct list_head *p; | 175 | struct list_head *p; |
170 | struct dentry *dentry = NULL; | 176 | struct dentry *dentry = NULL; |
171 | 177 | ||
172 | spin_lock(&dcache_lock); | 178 | spin_lock(&inode->i_lock); |
173 | |||
174 | list_for_each(p, &inode->i_dentry) { | 179 | list_for_each(p, &inode->i_dentry) { |
175 | dentry = list_entry(p, struct dentry, d_alias); | 180 | dentry = list_entry(p, struct dentry, d_alias); |
176 | 181 | ||
182 | spin_lock(&dentry->d_lock); | ||
177 | if (ocfs2_match_dentry(dentry, parent_blkno, skip_unhashed)) { | 183 | if (ocfs2_match_dentry(dentry, parent_blkno, skip_unhashed)) { |
178 | mlog(0, "dentry found: %.*s\n", | 184 | mlog(0, "dentry found: %.*s\n", |
179 | dentry->d_name.len, dentry->d_name.name); | 185 | dentry->d_name.len, dentry->d_name.name); |
180 | 186 | ||
181 | dget_locked(dentry); | 187 | dget_dlock(dentry); |
188 | spin_unlock(&dentry->d_lock); | ||
182 | break; | 189 | break; |
183 | } | 190 | } |
191 | spin_unlock(&dentry->d_lock); | ||
184 | 192 | ||
185 | dentry = NULL; | 193 | dentry = NULL; |
186 | } | 194 | } |
187 | 195 | ||
188 | spin_unlock(&dcache_lock); | 196 | spin_unlock(&inode->i_lock); |
189 | 197 | ||
190 | return dentry; | 198 | return dentry; |
191 | } | 199 | } |