Commit ff2fde9929feb2aef45377ce56b8b12df85dda69
1 parent
e55fd01154
Exists in
ti-lsk-linux-4.1.y
and in
12 other branches
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
fs/dcache.c
... | ... | @@ -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 |