vfs: spread struct mount - propagate_mnt()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
c937135d98
commit
a8d56d8e4f
|
@ -1595,23 +1595,23 @@ static int attach_recursive_mnt(struct mount *source_mnt,
|
||||||
struct path *path, struct path *parent_path)
|
struct path *path, struct path *parent_path)
|
||||||
{
|
{
|
||||||
LIST_HEAD(tree_list);
|
LIST_HEAD(tree_list);
|
||||||
struct vfsmount *dest_mnt = path->mnt;
|
struct mount *dest_mnt = real_mount(path->mnt);
|
||||||
struct dentry *dest_dentry = path->dentry;
|
struct dentry *dest_dentry = path->dentry;
|
||||||
struct mount *child, *p;
|
struct mount *child, *p;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (IS_MNT_SHARED(dest_mnt)) {
|
if (IS_MNT_SHARED(&dest_mnt->mnt)) {
|
||||||
err = invent_group_ids(source_mnt, true);
|
err = invent_group_ids(source_mnt, true);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
err = propagate_mnt(dest_mnt, dest_dentry, &source_mnt->mnt, &tree_list);
|
err = propagate_mnt(dest_mnt, dest_dentry, source_mnt, &tree_list);
|
||||||
if (err)
|
if (err)
|
||||||
goto out_cleanup_ids;
|
goto out_cleanup_ids;
|
||||||
|
|
||||||
br_write_lock(vfsmount_lock);
|
br_write_lock(vfsmount_lock);
|
||||||
|
|
||||||
if (IS_MNT_SHARED(dest_mnt)) {
|
if (IS_MNT_SHARED(&dest_mnt->mnt)) {
|
||||||
for (p = source_mnt; p; p = next_mnt(p, &source_mnt->mnt))
|
for (p = source_mnt; p; p = next_mnt(p, &source_mnt->mnt))
|
||||||
set_mnt_shared(p);
|
set_mnt_shared(p);
|
||||||
}
|
}
|
||||||
|
@ -1620,7 +1620,7 @@ static int attach_recursive_mnt(struct mount *source_mnt,
|
||||||
attach_mnt(source_mnt, path);
|
attach_mnt(source_mnt, path);
|
||||||
touch_mnt_namespace(parent_path->mnt->mnt_ns);
|
touch_mnt_namespace(parent_path->mnt->mnt_ns);
|
||||||
} else {
|
} else {
|
||||||
mnt_set_mountpoint(dest_mnt, dest_dentry, source_mnt);
|
mnt_set_mountpoint(&dest_mnt->mnt, dest_dentry, source_mnt);
|
||||||
commit_tree(source_mnt);
|
commit_tree(source_mnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1633,7 +1633,7 @@ static int attach_recursive_mnt(struct mount *source_mnt,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_cleanup_ids:
|
out_cleanup_ids:
|
||||||
if (IS_MNT_SHARED(dest_mnt))
|
if (IS_MNT_SHARED(&dest_mnt->mnt))
|
||||||
cleanup_group_ids(source_mnt, NULL);
|
cleanup_group_ids(source_mnt, NULL);
|
||||||
out:
|
out:
|
||||||
return err;
|
return err;
|
||||||
|
|
12
fs/pnode.c
12
fs/pnode.c
|
@ -217,18 +217,18 @@ static struct mount *get_source(struct mount *dest,
|
||||||
* @source_mnt: source mount.
|
* @source_mnt: source mount.
|
||||||
* @tree_list : list of heads of trees to be attached.
|
* @tree_list : list of heads of trees to be attached.
|
||||||
*/
|
*/
|
||||||
int propagate_mnt(struct vfsmount *dest_mnt, struct dentry *dest_dentry,
|
int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry,
|
||||||
struct vfsmount *source_mnt, struct list_head *tree_list)
|
struct mount *source_mnt, struct list_head *tree_list)
|
||||||
{
|
{
|
||||||
struct mount *m, *child;
|
struct mount *m, *child;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct mount *prev_dest_mnt = real_mount(dest_mnt);
|
struct mount *prev_dest_mnt = dest_mnt;
|
||||||
struct mount *prev_src_mnt = real_mount(source_mnt);
|
struct mount *prev_src_mnt = source_mnt;
|
||||||
LIST_HEAD(tmp_list);
|
LIST_HEAD(tmp_list);
|
||||||
LIST_HEAD(umount_list);
|
LIST_HEAD(umount_list);
|
||||||
|
|
||||||
for (m = propagation_next(real_mount(dest_mnt), real_mount(dest_mnt)); m;
|
for (m = propagation_next(dest_mnt, dest_mnt); m;
|
||||||
m = propagation_next(m, real_mount(dest_mnt))) {
|
m = propagation_next(m, dest_mnt)) {
|
||||||
int type;
|
int type;
|
||||||
struct mount *source;
|
struct mount *source;
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@ static inline void set_mnt_shared(struct mount *mnt)
|
||||||
}
|
}
|
||||||
|
|
||||||
void change_mnt_propagation(struct mount *, int);
|
void change_mnt_propagation(struct mount *, int);
|
||||||
int propagate_mnt(struct vfsmount *, struct dentry *, struct vfsmount *,
|
int propagate_mnt(struct mount *, struct dentry *, struct mount *,
|
||||||
struct list_head *);
|
struct list_head *);
|
||||||
int propagate_umount(struct list_head *);
|
int propagate_umount(struct list_head *);
|
||||||
int propagate_mount_busy(struct mount *, int);
|
int propagate_mount_busy(struct mount *, int);
|
||||||
|
|
Loading…
Reference in New Issue