From: Patch to sync 2.6.6-rc2-mm2 with the result of my discussion with Christoph Hellwig. Difference is that Christoph realised that merging may_umount_tree and may_umount was not worth it. They are now seperate functions. --- 25-akpm/fs/namespace.c | 35 ++++++++++++----------------------- 1 files changed, 12 insertions(+), 23 deletions(-) diff -puN fs/namespace.c~4-autofs4-2.6.0-expire-20040405-may_umount_tree-cleanup fs/namespace.c --- 25/fs/namespace.c~4-autofs4-2.6.0-expire-20040405-may_umount_tree-cleanup Mon Apr 26 13:42:39 2004 +++ 25-akpm/fs/namespace.c Mon Apr 26 13:42:39 2004 @@ -260,7 +260,15 @@ struct seq_operations mounts_op = { .show = show_vfsmnt }; -static int __may_umount_tree(struct vfsmount *mnt, int root_mnt_only) +/** + * may_umount_tree - check if a mount tree is busy + * @mnt: root of mount tree + * + * This is called to check if a tree of mounts has any + * open files, pwds, chroots or sub mounts that are + * busy. + */ +int may_umount_tree(struct vfsmount *mnt) { struct list_head *next; struct vfsmount *this_parent = mnt; @@ -270,14 +278,6 @@ static int __may_umount_tree(struct vfsm spin_lock(&vfsmount_lock); actual_refs = atomic_read(&mnt->mnt_count); minimum_refs = 2; - - if (root_mnt_only) { - spin_unlock(&vfsmount_lock); - if (actual_refs > minimum_refs) - return -EBUSY; - return 0; - } - repeat: next = this_parent->mnt_mounts.next; resume: @@ -308,19 +308,6 @@ resume: return 0; } -/** - * may_umount_tree - check if a mount tree is busy - * @mnt: root of mount tree - * - * This is called to check if a tree of mounts has any - * open files, pwds, chroots or sub mounts that are - * busy. - */ -int may_umount_tree(struct vfsmount *mnt) -{ - return __may_umount_tree(mnt, 0); -} - EXPORT_SYMBOL(may_umount_tree); /** @@ -338,7 +325,9 @@ EXPORT_SYMBOL(may_umount_tree); */ int may_umount(struct vfsmount *mnt) { - return __may_umount_tree(mnt, 1); + if (atomic_read(&mnt->mnt_count) > 2) + return -EBUSY; + return 0; } EXPORT_SYMBOL(may_umount); _