Patch "mnt: In umount_tree reuse mnt_list instead of mnt_hash" has been added to the 4.0-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
mnt: In umount_tree reuse mnt_list instead of mnt_hash
to the 4.0-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mnt-in-umount_tree-reuse-mnt_list-instead-of-mnt_hash.patch
and it can be found in the queue-4.0 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
c003b26ff98ca04a180ff34c38c007a3998d62f9Mon Sep 17 00:00:00 2001
From: "Eric W. Biederman" <[email protected]>
Date: Thu, 18 Dec 2014 13:10:48 -0600
Subject: mnt: In umount_tree reuse mnt_list instead of mnt_hash
From: "Eric W. Biederman" <[email protected]>
commit c003b26ff98ca04a180ff34c38c007a3998d62f9 upstream.
umount_tree builds a list of mounts that need to be unmounted. Utilize mnt_list for this purpose instead of mnt_hash. This begins to allow keeping a mount on the mnt_hash after it is unmounted, which is necessary for a properly functioning MNT_LOCKED implementation.
The fact that mnt_list is an ordinary list makding available list_move is nice bonus.
--- fs/namespace.c | 20 +++++++++++--------- fs/pnode.c | 6 +++--- fs/pnode.h | 2 +- 3 files changed, 15 insertions(+), 13 deletions(-)
fs/namespace.c +11 -9
@@ -1329,23 +1329,25 @@ enum umount_tree_flags {*/ static void umount_tree (struct mount *mnt,enum umount_tree_flags how) { -HLIST_HEAD (tmp_list); +LIST_HEAD (tmp_list);struct mount *p; -for (p = mnt; p; p =next_mnt (p, mnt)) { -hlist_del_init_rcu (&p->mnt_hash); -hlist_add_head (&p->mnt_hash, &tmp_list); - } +/* Gather the mounts to umount */ +for (p = mnt; p; p =next_mnt (p, mnt)) +list_move (&p->mnt_list, &tmp_list); -hlist_for_each_entry (p, &tmp_list, mnt_hash) +/* Hide the mounts from lookup_mnt and mnt_mounts */ +list_for_each_entry (p, &tmp_list, mnt_list) { +hlist_del_init_rcu (&p->mnt_hash);list_del_init (&p->mnt_child); + } +/* Add propogated mounts to the tmp_list */ if (how &UMOUNT_PROPAGATE )propagate_umount (&tmp_list); -while (!hlist_empty (&tmp_list)) { - p = hlist_entry(tmp_list.first, struct mount, mnt_hash); -hlist_del_init_rcu (&p->mnt_hash); +while (!list_empty (&tmp_list)) { + p = list_first_entry(&tmp_list, struct mount, mnt_list);list_del_init (&p->mnt_expire);list_del_init (&p->mnt_list);__touch_mnt_namespace (p->mnt_ns);
fs/pnode.c +3 -3
@@ -384,7 +384,7 @@ static void __propagate_umount(struct moif (child &&list_empty (&child->mnt_mounts)) {list_del_init (&child->mnt_child);hlist_del_init_rcu (&child->mnt_hash); -hlist_add_before_rcu (&child->mnt_hash, &mnt->mnt_hash); +list_move_tail (&child->mnt_list, &mnt->mnt_list); } } }
@@ -396,11 +396,11 @@ static void __propagate_umount(struct mo* * vfsmount lock must be held for write */ -int propagate_umount (struct hlist_head *list) +int propagate_umount (struct list_head *list) {struct mount *mnt; -hlist_for_each_entry (mnt, list, mnt_hash) +list_for_each_entry (mnt, list, mnt_list)__propagate_umount (mnt);return 0 ; }
fs/pnode.h +1 -1
@@ -40,7 +40,7 @@ static inline void set_mnt_shared(structvoid change_mnt_propagation (struct mount *,int );int propagate_mnt (struct mount *,struct mountpoint *,struct mount *,struct hlist_head *); -int propagate_umount (struct hlist_head *); +int propagate_umount (struct list_head *);int propagate_mount_busy (struct mount *,int );void mnt_release_group_id (struct mount *);int get_dominating_id (struct mount *mnt,const struct path *root);
Patches currently in stable-queue which might be from [email protected] are
queue-4.0/mnt-don-t-propagate-umounts-in-__detach_mounts.patch queue-4.0/mnt-add-mnt_umount-flag.patch queue-4.0/mnt-honor-mnt_locked-when-detaching-mounts.patch queue-4.0/mnt-delay-removal-from-the-mount-hash.patch queue-4.0/mnt-on-an-unmount-propagate-clearing-of-mnt_locked.patch queue-4.0/mnt-don-t-propagate-unmounts-to-locked-mounts.patch queue-4.0/mnt-factor-out-unhash_mnt-from-detach_mnt-and-umount_tree.patch queue-4.0/mnt-factor-umount_mnt-from-umount_tree.patch queue-4.0/mnt-fix-the-error-check-in-__detach_mounts.patch queue-4.0/mnt-update-detach_mounts-to-leave-mounts-connected.patch queue-4.0/mnt-improve-the-umount_tree-flags.patch queue-4.0/mnt-in-umount_tree-reuse-mnt_list-instead-of-mnt_hash.patch