aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ncpfs/ncplib_kernel.h
diff options
context:
space:
mode:
authorNick Piggin <npiggin@kernel.dk>2011-01-07 01:49:34 -0500
committerNick Piggin <npiggin@kernel.dk>2011-01-07 01:50:21 -0500
commit2fd6b7f50797f2e993eea59e0a0b8c6399c811dc (patch)
treece33b94b34844c09103836cf4cfa4364b742f217 /fs/ncpfs/ncplib_kernel.h
parentda5029563a0a026c64821b09e8e7b4fd81d3fe1b (diff)
fs: dcache scale subdirs
Protect d_subdirs and d_child with d_lock, except in filesystems that aren't using dcache_lock for these anyway (eg. using i_mutex). Note: if we change the locking rule in future so that ->d_child protection is provided only with ->d_parent->d_lock, it may allow us to reduce some locking. But it would be an exception to an otherwise regular locking scheme, so we'd have to see some good results. Probably not worthwhile. Signed-off-by: Nick Piggin <npiggin@kernel.dk>
Diffstat (limited to 'fs/ncpfs/ncplib_kernel.h')
-rw-r--r--fs/ncpfs/ncplib_kernel.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/ncpfs/ncplib_kernel.h b/fs/ncpfs/ncplib_kernel.h
index 244d1b73fda7..c4b718ff9a6b 100644
--- a/fs/ncpfs/ncplib_kernel.h
+++ b/fs/ncpfs/ncplib_kernel.h
@@ -194,6 +194,7 @@ ncp_renew_dentries(struct dentry *parent)
194 struct dentry *dentry; 194 struct dentry *dentry;
195 195
196 spin_lock(&dcache_lock); 196 spin_lock(&dcache_lock);
197 spin_lock(&parent->d_lock);
197 next = parent->d_subdirs.next; 198 next = parent->d_subdirs.next;
198 while (next != &parent->d_subdirs) { 199 while (next != &parent->d_subdirs) {
199 dentry = list_entry(next, struct dentry, d_u.d_child); 200 dentry = list_entry(next, struct dentry, d_u.d_child);
@@ -205,6 +206,7 @@ ncp_renew_dentries(struct dentry *parent)
205 206
206 next = next->next; 207 next = next->next;
207 } 208 }
209 spin_unlock(&parent->d_lock);
208 spin_unlock(&dcache_lock); 210 spin_unlock(&dcache_lock);
209} 211}
210 212
@@ -216,6 +218,7 @@ ncp_invalidate_dircache_entries(struct dentry *parent)
216 struct dentry *dentry; 218 struct dentry *dentry;
217 219
218 spin_lock(&dcache_lock); 220 spin_lock(&dcache_lock);
221 spin_lock(&parent->d_lock);
219 next = parent->d_subdirs.next; 222 next = parent->d_subdirs.next;
220 while (next != &parent->d_subdirs) { 223 while (next != &parent->d_subdirs) {
221 dentry = list_entry(next, struct dentry, d_u.d_child); 224 dentry = list_entry(next, struct dentry, d_u.d_child);
@@ -223,6 +226,7 @@ ncp_invalidate_dircache_entries(struct dentry *parent)
223 ncp_age_dentry(server, dentry); 226 ncp_age_dentry(server, dentry);
224 next = next->next; 227 next = next->next;
225 } 228 }
229 spin_unlock(&parent->d_lock);
226 spin_unlock(&dcache_lock); 230 spin_unlock(&dcache_lock);
227} 231}
228 232