Loading fs/dcache.c +23 −29 Original line number Diff line number Diff line Loading @@ -323,35 +323,16 @@ void dput(struct dentry *dentry) if (dentry->d_count == 1) might_sleep(); spin_lock(&dentry->d_lock); if (IS_ROOT(dentry)) parent = NULL; else parent = dentry->d_parent; if (dentry->d_count == 1) { if (!spin_trylock(&dcache_inode_lock)) { drop2: spin_unlock(&dentry->d_lock); goto repeat; } if (parent && !spin_trylock(&parent->d_lock)) { spin_unlock(&dcache_inode_lock); goto drop2; } } BUG_ON(!dentry->d_count); if (dentry->d_count > 1) { dentry->d_count--; if (dentry->d_count) { spin_unlock(&dentry->d_lock); if (parent) spin_unlock(&parent->d_lock); return; } /* * AV: ->d_delete() is _NOT_ allowed to block now. */ if (dentry->d_op && dentry->d_op->d_delete) { if (dentry->d_op->d_delete(dentry)) goto unhash_it; goto kill_it; } /* Unreachable? Get rid of it */ Loading @@ -362,17 +343,30 @@ void dput(struct dentry *dentry) dentry->d_flags |= DCACHE_REFERENCED; dentry_lru_add(dentry); dentry->d_count--; spin_unlock(&dentry->d_lock); if (parent) spin_unlock(&parent->d_lock); spin_unlock(&dcache_inode_lock); return; unhash_it: __d_drop(dentry); kill_it: if (!spin_trylock(&dcache_inode_lock)) { relock: spin_unlock(&dentry->d_lock); cpu_relax(); goto repeat; } if (IS_ROOT(dentry)) parent = NULL; else parent = dentry->d_parent; if (parent && !spin_trylock(&parent->d_lock)) { spin_unlock(&dcache_inode_lock); goto relock; } dentry->d_count--; /* if dentry was on the d_lru list delete it from there */ dentry_lru_del(dentry); /* if it was on the hash (d_delete case), then remove it */ __d_drop(dentry); dentry = d_kill(dentry, parent); if (dentry) goto repeat; Loading Loading
fs/dcache.c +23 −29 Original line number Diff line number Diff line Loading @@ -323,35 +323,16 @@ void dput(struct dentry *dentry) if (dentry->d_count == 1) might_sleep(); spin_lock(&dentry->d_lock); if (IS_ROOT(dentry)) parent = NULL; else parent = dentry->d_parent; if (dentry->d_count == 1) { if (!spin_trylock(&dcache_inode_lock)) { drop2: spin_unlock(&dentry->d_lock); goto repeat; } if (parent && !spin_trylock(&parent->d_lock)) { spin_unlock(&dcache_inode_lock); goto drop2; } } BUG_ON(!dentry->d_count); if (dentry->d_count > 1) { dentry->d_count--; if (dentry->d_count) { spin_unlock(&dentry->d_lock); if (parent) spin_unlock(&parent->d_lock); return; } /* * AV: ->d_delete() is _NOT_ allowed to block now. */ if (dentry->d_op && dentry->d_op->d_delete) { if (dentry->d_op->d_delete(dentry)) goto unhash_it; goto kill_it; } /* Unreachable? Get rid of it */ Loading @@ -362,17 +343,30 @@ void dput(struct dentry *dentry) dentry->d_flags |= DCACHE_REFERENCED; dentry_lru_add(dentry); dentry->d_count--; spin_unlock(&dentry->d_lock); if (parent) spin_unlock(&parent->d_lock); spin_unlock(&dcache_inode_lock); return; unhash_it: __d_drop(dentry); kill_it: if (!spin_trylock(&dcache_inode_lock)) { relock: spin_unlock(&dentry->d_lock); cpu_relax(); goto repeat; } if (IS_ROOT(dentry)) parent = NULL; else parent = dentry->d_parent; if (parent && !spin_trylock(&parent->d_lock)) { spin_unlock(&dcache_inode_lock); goto relock; } dentry->d_count--; /* if dentry was on the d_lru list delete it from there */ dentry_lru_del(dentry); /* if it was on the hash (d_delete case), then remove it */ __d_drop(dentry); dentry = d_kill(dentry, parent); if (dentry) goto repeat; Loading