Commit ff2fde9929feb2aef45377ce56b8b12df85dda69

Authored by Al Viro
1 parent e55fd01154

expand dentry_kill(dentry, 0) in shrink_dentry_list()

Result will be massaged to saner shape in the next commits.  It is
ugly, no questions - the point of that one is to be a provably
equivalent transformation (and it might be worth splitting a bit
more).

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

Showing 1 changed file with 17 additions and 13 deletions Side-by-side Diff

... ... @@ -801,6 +801,7 @@
801 801 struct dentry *dentry, *parent;
802 802  
803 803 while (!list_empty(list)) {
  804 + struct inode *inode;
804 805 dentry = list_entry(list->prev, struct dentry, d_lru);
805 806 spin_lock(&dentry->d_lock);
806 807 /*
807 808  
... ... @@ -828,23 +829,26 @@
828 829 continue;
829 830 }
830 831  
831   - parent = dentry_kill(dentry, 0);
832   - /*
833   - * If dentry_kill returns NULL, we have nothing more to do.
834   - */
835   - if (!parent)
836   - continue;
837   -
838   - if (unlikely(parent == dentry)) {
839   - /*
840   - * trylocks have failed and d_lock has been held the
841   - * whole time, so it could not have been added to any
842   - * other lists. Just add it back to the shrink list.
843   - */
  832 + inode = dentry->d_inode;
  833 + if (inode && unlikely(!spin_trylock(&inode->i_lock))) {
844 834 d_shrink_add(dentry, list);
845 835 spin_unlock(&dentry->d_lock);
846 836 continue;
847 837 }
  838 +
  839 + parent = NULL;
  840 + if (!IS_ROOT(dentry)) {
  841 + parent = dentry->d_parent;
  842 + if (unlikely(!spin_trylock(&parent->d_lock))) {
  843 + if (inode)
  844 + spin_unlock(&inode->i_lock);
  845 + d_shrink_add(dentry, list);
  846 + spin_unlock(&dentry->d_lock);
  847 + continue;
  848 + }
  849 + }
  850 +
  851 + __dentry_kill(dentry);
848 852 /*
849 853 * We need to prune ancestors too. This is necessary to prevent
850 854 * quadratic behavior of shrink_dcache_parent(), but is also