lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 27 Oct 2006 10:32:35 +0400 From: Vasily Averin <vvs@...ru> To: David Howells <dhowells@...hat.com> CC: aviro@...hat.com, Neil Brown <neilb@...e.de>, Jan Blunck <jblunck@...e.de>, Olaf Hering <olh@...e.de>, Balbir Singh <balbir@...ibm.com>, Kirill Korotaev <dev@...nvz.org>, Linux Kernel Mailing List <linux-kernel@...r.kernel.org>, devel@...nvz.org, Andrew Morton <akpm@...l.org> Subject: Re: [Q] missing unused dentry in prune_dcache()? David Howells wrote: > Vasily Averin <vvs@...ru> wrote: > >> I've noticed one more minor issue in your patch: in >> shrink_dcache_for_umount_subtree() function you decrement >> dentry_stat.nr_dentry without dcache_lock. > > How about the attached patch? I'm sorry, but your patch is wrong: you have mixed calculation of 2 variables: dentry_stat.nr_unused -- were correct, it was decremented under dcache_lock. dentry_stat.nr_dentry -- were incorrect, it was decremented without dcache_lock. You should correct dentry_stat.nr_dentry, but instead you broke calculation of dentry_stat.nr_unused. I've fixed this issue by following patch. Thank you, Vasily Averin --- VFS: Fix an error in dentry_stat.nr_dentry counting From: Vasily Averin <vvs@...ru> Fix an error in dentry_stat.nr_dentry counting in shrink_dcache_for_umount_subtree() in which the count is modified without the dcache_lock held. Signed-Off-By: Vasily Averin <vvs@...ru> --- linux-2.6.19-rc3/fs/dcache.c.nrdntr 2006-10-26 15:14:51.000000000 +0400 +++ linux-2.6.19-rc3/fs/dcache.c 2006-10-27 10:24:07.000000000 +0400 @@ -554,6 +554,7 @@ repeat: static void shrink_dcache_for_umount_subtree(struct dentry *dentry) { struct dentry *parent; + unsigned detached = 0; BUG_ON(!IS_ROOT(dentry)); @@ -618,7 +619,7 @@ static void shrink_dcache_for_umount_sub atomic_dec(&parent->d_count); list_del(&dentry->d_u.d_child); - dentry_stat.nr_dentry--; /* For d_free, below */ + detached++; inode = dentry->d_inode; if (inode) { @@ -635,8 +636,8 @@ static void shrink_dcache_for_umount_sub /* finished when we fall off the top of the tree, * otherwise we ascend to the parent and move to the * next sibling if there is one */ - if (!parent) - return; + if (!parent) + goto out; dentry = parent; @@ -645,6 +646,11 @@ static void shrink_dcache_for_umount_sub dentry = list_entry(dentry->d_subdirs.next, struct dentry, d_u.d_child); } +out: + /* several dentries were freed, need to correct nr_dentry */ + spin_lock(&dcache_lock); + dentry_stat.nr_dentry -= detached; + spin_unlock(&dcache_lock); } /* - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists