aboutsummaryrefslogtreecommitdiffstats
path: root/fs/autofs4
diff options
context:
space:
mode:
authorNick Piggin <npiggin@kernel.dk>2011-01-07 01:49:32 -0500
committerNick Piggin <npiggin@kernel.dk>2011-01-07 01:50:21 -0500
commitb7ab39f631f505edc2bbdb86620d5493f995c9da (patch)
tree62be97ebc7fc69ceb601f23312d335ebb8038ee7 /fs/autofs4
parent2304450783dfde7b0b94ae234edd0dbffa865073 (diff)
fs: dcache scale dentry refcount
Make d_count non-atomic and protect it with d_lock. This allows us to ensure a 0 refcount dentry remains 0 without dcache_lock. It is also fairly natural when we start protecting many other dentry members with d_lock. Signed-off-by: Nick Piggin <npiggin@kernel.dk>
Diffstat (limited to 'fs/autofs4')
-rw-r--r--fs/autofs4/expire.c8
-rw-r--r--fs/autofs4/root.c6
2 files changed, 7 insertions, 7 deletions
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c
index a796c9417fb1..413b5642e6cf 100644
--- a/fs/autofs4/expire.c
+++ b/fs/autofs4/expire.c
@@ -198,7 +198,7 @@ static int autofs4_tree_busy(struct vfsmount *mnt,
198 else 198 else
199 ino_count++; 199 ino_count++;
200 200
201 if (atomic_read(&p->d_count) > ino_count) { 201 if (p->d_count > ino_count) {
202 top_ino->last_used = jiffies; 202 top_ino->last_used = jiffies;
203 dput(p); 203 dput(p);
204 return 1; 204 return 1;
@@ -347,7 +347,7 @@ struct dentry *autofs4_expire_indirect(struct super_block *sb,
347 347
348 /* Path walk currently on this dentry? */ 348 /* Path walk currently on this dentry? */
349 ino_count = atomic_read(&ino->count) + 2; 349 ino_count = atomic_read(&ino->count) + 2;
350 if (atomic_read(&dentry->d_count) > ino_count) 350 if (dentry->d_count > ino_count)
351 goto next; 351 goto next;
352 352
353 /* Can we umount this guy */ 353 /* Can we umount this guy */
@@ -369,7 +369,7 @@ struct dentry *autofs4_expire_indirect(struct super_block *sb,
369 if (!exp_leaves) { 369 if (!exp_leaves) {
370 /* Path walk currently on this dentry? */ 370 /* Path walk currently on this dentry? */
371 ino_count = atomic_read(&ino->count) + 1; 371 ino_count = atomic_read(&ino->count) + 1;
372 if (atomic_read(&dentry->d_count) > ino_count) 372 if (dentry->d_count > ino_count)
373 goto next; 373 goto next;
374 374
375 if (!autofs4_tree_busy(mnt, dentry, timeout, do_now)) { 375 if (!autofs4_tree_busy(mnt, dentry, timeout, do_now)) {
@@ -383,7 +383,7 @@ struct dentry *autofs4_expire_indirect(struct super_block *sb,
383 } else { 383 } else {
384 /* Path walk currently on this dentry? */ 384 /* Path walk currently on this dentry? */
385 ino_count = atomic_read(&ino->count) + 1; 385 ino_count = atomic_read(&ino->count) + 1;
386 if (atomic_read(&dentry->d_count) > ino_count) 386 if (dentry->d_count > ino_count)
387 goto next; 387 goto next;
388 388
389 expired = autofs4_check_leaves(mnt, dentry, timeout, do_now); 389 expired = autofs4_check_leaves(mnt, dentry, timeout, do_now);
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c
index d34896cfb19f..7922509b5b2b 100644
--- a/fs/autofs4/root.c
+++ b/fs/autofs4/root.c
@@ -436,7 +436,7 @@ static struct dentry *autofs4_lookup_active(struct dentry *dentry)
436 spin_lock(&active->d_lock); 436 spin_lock(&active->d_lock);
437 437
438 /* Already gone? */ 438 /* Already gone? */
439 if (atomic_read(&active->d_count) == 0) 439 if (active->d_count == 0)
440 goto next; 440 goto next;
441 441
442 qstr = &active->d_name; 442 qstr = &active->d_name;
@@ -452,7 +452,7 @@ static struct dentry *autofs4_lookup_active(struct dentry *dentry)
452 goto next; 452 goto next;
453 453
454 if (d_unhashed(active)) { 454 if (d_unhashed(active)) {
455 dget(active); 455 dget_dlock(active);
456 spin_unlock(&active->d_lock); 456 spin_unlock(&active->d_lock);
457 spin_unlock(&sbi->lookup_lock); 457 spin_unlock(&sbi->lookup_lock);
458 spin_unlock(&dcache_lock); 458 spin_unlock(&dcache_lock);
@@ -507,7 +507,7 @@ static struct dentry *autofs4_lookup_expiring(struct dentry *dentry)
507 goto next; 507 goto next;
508 508
509 if (d_unhashed(expiring)) { 509 if (d_unhashed(expiring)) {
510 dget(expiring); 510 dget_dlock(expiring);
511 spin_unlock(&expiring->d_lock); 511 spin_unlock(&expiring->d_lock);
512 spin_unlock(&sbi->lookup_lock); 512 spin_unlock(&sbi->lookup_lock);
513 spin_unlock(&dcache_lock); 513 spin_unlock(&dcache_lock);