/* process a list of expirable mountpoints with the intent of discarding any mountpoints that aren't in use and haven't been touched since last we came here  */
void mark_mounts_for_expiry(struct list_head *mounts)
/* process a list of expirable mountpoints with the intent of discarding any mountpoints that aren't in use and haven't been touched since last we came here  */
void mark_mounts_for_expiry(struct list_head *mounts)
{
	struct vfsmount *mnt, *next;
	LIST_HEAD(graveyard);
	LIST_HEAD(umounts);
	if (list_empty(mounts))
		return;
	down_write(&namespace_sem);
	spin_lock(&vfsmount_lock);
	list_for_each_entry_safe(mnt, next, mounts, mnt_expire) {
		if (!xchg(&mnt->mnt_expiry_mark, 1) ||
			propagate_mount_busy(mnt, 1))
			continue;
		list_move(&mnt->mnt_expire, &graveyard);
	}
	while (!list_empty(&graveyard)) {
		mnt = list_first_entry(&graveyard, struct vfsmount, mnt_expire);
		touch_mnt_namespace(mnt->mnt_ns);
		umount_tree(mnt, 1, &umounts);
	}
	spin_unlock(&vfsmount_lock);
	up_write(&namespace_sem);
	release_mounts(&umounts);
}