Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 280170
b: refs/heads/master
c: 0fb54e5
h: refs/heads/master
v: v3
  • Loading branch information
Al Viro committed Jan 4, 2012
1 parent dcf10a0 commit fe80cff
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4b8b21f4fe16ee15eec5c69ea5fb41b30e428e59
refs/heads/master: 0fb54e50562d8d6f4b1a4517ba9783a9c7c5c2b7
25 changes: 14 additions & 11 deletions trunk/fs/namespace.c
Original file line number Diff line number Diff line change
Expand Up @@ -1587,7 +1587,7 @@ static int invent_group_ids(struct mount *mnt, bool recurse)
* Must be called without spinlocks held, since this function can sleep
* in allocations.
*/
static int attach_recursive_mnt(struct vfsmount *source_mnt,
static int attach_recursive_mnt(struct mount *source_mnt,
struct path *path, struct path *parent_path)
{
LIST_HEAD(tree_list);
Expand All @@ -1597,27 +1597,27 @@ static int attach_recursive_mnt(struct vfsmount *source_mnt,
int err;

if (IS_MNT_SHARED(dest_mnt)) {
err = invent_group_ids(real_mount(source_mnt), true);
err = invent_group_ids(source_mnt, true);
if (err)
goto out;
}
err = propagate_mnt(dest_mnt, dest_dentry, source_mnt, &tree_list);
err = propagate_mnt(dest_mnt, dest_dentry, &source_mnt->mnt, &tree_list);
if (err)
goto out_cleanup_ids;

br_write_lock(vfsmount_lock);

if (IS_MNT_SHARED(dest_mnt)) {
for (p = real_mount(source_mnt); p; p = next_mnt(p, source_mnt))
for (p = source_mnt; p; p = next_mnt(p, &source_mnt->mnt))
set_mnt_shared(&p->mnt);
}
if (parent_path) {
detach_mnt(real_mount(source_mnt), parent_path);
attach_mnt(real_mount(source_mnt), path);
detach_mnt(source_mnt, parent_path);
attach_mnt(source_mnt, path);
touch_mnt_namespace(parent_path->mnt->mnt_ns);
} else {
mnt_set_mountpoint(dest_mnt, dest_dentry, source_mnt);
commit_tree(real_mount(source_mnt));
mnt_set_mountpoint(dest_mnt, dest_dentry, &source_mnt->mnt);
commit_tree(source_mnt);
}

list_for_each_entry_safe(child, p, &tree_list, mnt.mnt_hash) {
Expand All @@ -1630,7 +1630,7 @@ static int attach_recursive_mnt(struct vfsmount *source_mnt,

out_cleanup_ids:
if (IS_MNT_SHARED(dest_mnt))
cleanup_group_ids(real_mount(source_mnt), NULL);
cleanup_group_ids(source_mnt, NULL);
out:
return err;
}
Expand Down Expand Up @@ -1674,7 +1674,7 @@ static int graft_tree(struct vfsmount *mnt, struct path *path)
if (d_unlinked(path->dentry))
return -ENOENT;

return attach_recursive_mnt(mnt, path, NULL);
return attach_recursive_mnt(real_mount(mnt), path, NULL);
}

/*
Expand Down Expand Up @@ -1859,6 +1859,7 @@ static int do_move_mount(struct path *path, char *old_name)
{
struct path old_path, parent_path;
struct vfsmount *p;
struct mount *old;
int err = 0;
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
Expand All @@ -1883,6 +1884,8 @@ static int do_move_mount(struct path *path, char *old_name)
if (old_path.dentry != old_path.mnt->mnt_root)
goto out1;

old = real_mount(old_path.mnt);

if (!mnt_has_parent(old_path.mnt))
goto out1;

Expand All @@ -1906,7 +1909,7 @@ static int do_move_mount(struct path *path, char *old_name)
if (p == old_path.mnt)
goto out1;

err = attach_recursive_mnt(old_path.mnt, path, &parent_path);
err = attach_recursive_mnt(old, path, &parent_path);
if (err)
goto out1;

Expand Down

0 comments on commit fe80cff

Please sign in to comment.