Commit e55fd011549eae01a230e3cace6f4d031b6a3453
1 parent
64fd72e0a4
Exists in
ti-lsk-linux-4.1.y
and in
12 other branches
split dentry_kill()
... into trylocks and everything else. The latter (actual killing) is __dentry_kill(). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Showing 1 changed file with 36 additions and 26 deletions Side-by-side Diff
fs/dcache.c
... | ... | @@ -441,36 +441,12 @@ |
441 | 441 | } |
442 | 442 | EXPORT_SYMBOL(d_drop); |
443 | 443 | |
444 | -/* | |
445 | - * Finish off a dentry we've decided to kill. | |
446 | - * dentry->d_lock must be held, returns with it unlocked. | |
447 | - * If ref is non-zero, then decrement the refcount too. | |
448 | - * Returns dentry requiring refcount drop, or NULL if we're done. | |
449 | - */ | |
450 | -static struct dentry * | |
451 | -dentry_kill(struct dentry *dentry, int unlock_on_failure) | |
452 | - __releases(dentry->d_lock) | |
444 | +static void __dentry_kill(struct dentry *dentry) | |
453 | 445 | { |
454 | - struct inode *inode; | |
455 | 446 | struct dentry *parent = NULL; |
456 | 447 | bool can_free = true; |
457 | - | |
458 | - inode = dentry->d_inode; | |
459 | - if (inode && !spin_trylock(&inode->i_lock)) { | |
460 | -relock: | |
461 | - if (unlock_on_failure) { | |
462 | - spin_unlock(&dentry->d_lock); | |
463 | - cpu_relax(); | |
464 | - } | |
465 | - return dentry; /* try again with same dentry */ | |
466 | - } | |
467 | 448 | if (!IS_ROOT(dentry)) |
468 | 449 | parent = dentry->d_parent; |
469 | - if (parent && !spin_trylock(&parent->d_lock)) { | |
470 | - if (inode) | |
471 | - spin_unlock(&inode->i_lock); | |
472 | - goto relock; | |
473 | - } | |
474 | 450 | |
475 | 451 | /* |
476 | 452 | * The dentry is now unrecoverably dead to the world. |
477 | 453 | |
478 | 454 | |
... | ... | @@ -514,10 +490,44 @@ |
514 | 490 | can_free = false; |
515 | 491 | } |
516 | 492 | spin_unlock(&dentry->d_lock); |
517 | -out: | |
518 | 493 | if (likely(can_free)) |
519 | 494 | dentry_free(dentry); |
495 | +} | |
496 | + | |
497 | +/* | |
498 | + * Finish off a dentry we've decided to kill. | |
499 | + * dentry->d_lock must be held, returns with it unlocked. | |
500 | + * If ref is non-zero, then decrement the refcount too. | |
501 | + * Returns dentry requiring refcount drop, or NULL if we're done. | |
502 | + */ | |
503 | +static struct dentry * | |
504 | +dentry_kill(struct dentry *dentry, int unlock_on_failure) | |
505 | + __releases(dentry->d_lock) | |
506 | +{ | |
507 | + struct inode *inode = dentry->d_inode; | |
508 | + struct dentry *parent = NULL; | |
509 | + | |
510 | + if (inode && unlikely(!spin_trylock(&inode->i_lock))) | |
511 | + goto failed; | |
512 | + | |
513 | + if (!IS_ROOT(dentry)) { | |
514 | + parent = dentry->d_parent; | |
515 | + if (unlikely(!spin_trylock(&parent->d_lock))) { | |
516 | + if (inode) | |
517 | + spin_unlock(&inode->i_lock); | |
518 | + goto failed; | |
519 | + } | |
520 | + } | |
521 | + | |
522 | + __dentry_kill(dentry); | |
520 | 523 | return parent; |
524 | + | |
525 | +failed: | |
526 | + if (unlock_on_failure) { | |
527 | + spin_unlock(&dentry->d_lock); | |
528 | + cpu_relax(); | |
529 | + } | |
530 | + return dentry; /* try again with same dentry */ | |
521 | 531 | } |
522 | 532 | |
523 | 533 | /* |