vfs: spread struct mount - shrink_submounts/select_submounts
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
761d5c38eb
commit
692afc312b
|
@ -1244,7 +1244,7 @@ void umount_tree(struct mount *mnt, int propagate, struct list_head *kill)
|
||||||
list_splice(&tmp_list, kill);
|
list_splice(&tmp_list, kill);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void shrink_submounts(struct vfsmount *mnt, struct list_head *umounts);
|
static void shrink_submounts(struct mount *mnt, struct list_head *umounts);
|
||||||
|
|
||||||
static int do_umount(struct vfsmount *mnt, int flags)
|
static int do_umount(struct vfsmount *mnt, int flags)
|
||||||
{
|
{
|
||||||
|
@ -1322,7 +1322,7 @@ static int do_umount(struct vfsmount *mnt, int flags)
|
||||||
event++;
|
event++;
|
||||||
|
|
||||||
if (!(flags & MNT_DETACH))
|
if (!(flags & MNT_DETACH))
|
||||||
shrink_submounts(mnt, &umount_list);
|
shrink_submounts(real_mount(mnt), &umount_list);
|
||||||
|
|
||||||
retval = -EBUSY;
|
retval = -EBUSY;
|
||||||
if (flags & MNT_DETACH || !propagate_mount_busy(mnt, 2)) {
|
if (flags & MNT_DETACH || !propagate_mount_busy(mnt, 2)) {
|
||||||
|
@ -2121,32 +2121,32 @@ EXPORT_SYMBOL_GPL(mark_mounts_for_expiry);
|
||||||
* search the list of submounts for a given mountpoint, and move any
|
* search the list of submounts for a given mountpoint, and move any
|
||||||
* shrinkable submounts to the 'graveyard' list.
|
* shrinkable submounts to the 'graveyard' list.
|
||||||
*/
|
*/
|
||||||
static int select_submounts(struct vfsmount *parent, struct list_head *graveyard)
|
static int select_submounts(struct mount *parent, struct list_head *graveyard)
|
||||||
{
|
{
|
||||||
struct vfsmount *this_parent = parent;
|
struct mount *this_parent = parent;
|
||||||
struct list_head *next;
|
struct list_head *next;
|
||||||
int found = 0;
|
int found = 0;
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
next = this_parent->mnt_mounts.next;
|
next = this_parent->mnt.mnt_mounts.next;
|
||||||
resume:
|
resume:
|
||||||
while (next != &this_parent->mnt_mounts) {
|
while (next != &this_parent->mnt.mnt_mounts) {
|
||||||
struct list_head *tmp = next;
|
struct list_head *tmp = next;
|
||||||
struct vfsmount *mnt = list_entry(tmp, struct vfsmount, mnt_child);
|
struct mount *mnt = list_entry(tmp, struct mount, mnt.mnt_child);
|
||||||
|
|
||||||
next = tmp->next;
|
next = tmp->next;
|
||||||
if (!(mnt->mnt_flags & MNT_SHRINKABLE))
|
if (!(mnt->mnt.mnt_flags & MNT_SHRINKABLE))
|
||||||
continue;
|
continue;
|
||||||
/*
|
/*
|
||||||
* Descend a level if the d_mounts list is non-empty.
|
* Descend a level if the d_mounts list is non-empty.
|
||||||
*/
|
*/
|
||||||
if (!list_empty(&mnt->mnt_mounts)) {
|
if (!list_empty(&mnt->mnt.mnt_mounts)) {
|
||||||
this_parent = mnt;
|
this_parent = mnt;
|
||||||
goto repeat;
|
goto repeat;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!propagate_mount_busy(mnt, 1)) {
|
if (!propagate_mount_busy(&mnt->mnt, 1)) {
|
||||||
list_move_tail(&mnt->mnt_expire, graveyard);
|
list_move_tail(&mnt->mnt.mnt_expire, graveyard);
|
||||||
found++;
|
found++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2154,8 +2154,8 @@ resume:
|
||||||
* All done at this level ... ascend and resume the search
|
* All done at this level ... ascend and resume the search
|
||||||
*/
|
*/
|
||||||
if (this_parent != parent) {
|
if (this_parent != parent) {
|
||||||
next = this_parent->mnt_child.next;
|
next = this_parent->mnt.mnt_child.next;
|
||||||
this_parent = this_parent->mnt_parent;
|
this_parent = real_mount(this_parent->mnt.mnt_parent);
|
||||||
goto resume;
|
goto resume;
|
||||||
}
|
}
|
||||||
return found;
|
return found;
|
||||||
|
@ -2167,7 +2167,7 @@ resume:
|
||||||
*
|
*
|
||||||
* vfsmount_lock must be held for write
|
* vfsmount_lock must be held for write
|
||||||
*/
|
*/
|
||||||
static void shrink_submounts(struct vfsmount *mnt, struct list_head *umounts)
|
static void shrink_submounts(struct mount *mnt, struct list_head *umounts)
|
||||||
{
|
{
|
||||||
LIST_HEAD(graveyard);
|
LIST_HEAD(graveyard);
|
||||||
struct mount *m;
|
struct mount *m;
|
||||||
|
|
Loading…
Reference in New Issue