diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2010-01-16 12:57:40 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-01-16 12:57:40 -0500 |
commit | df1a1ad29739f032f8905310796e558589403d61 (patch) | |
tree | e8ef57ed776c5dd5615a6fbdb74609c631b7f2a9 | |
parent | 8ad08d8a0c3823e9b06ef84c362c9361be323d2d (diff) |
attach_recursive_mnt() needs to hold vfsmount_lock over set_mnt_shared()
race in mnt_flags update
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/namespace.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index 461090a57b33..4de493ea67cf 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -1354,12 +1354,12 @@ static int attach_recursive_mnt(struct vfsmount *source_mnt, | |||
1354 | if (err) | 1354 | if (err) |
1355 | goto out_cleanup_ids; | 1355 | goto out_cleanup_ids; |
1356 | 1356 | ||
1357 | spin_lock(&vfsmount_lock); | ||
1358 | |||
1357 | if (IS_MNT_SHARED(dest_mnt)) { | 1359 | if (IS_MNT_SHARED(dest_mnt)) { |
1358 | for (p = source_mnt; p; p = next_mnt(p, source_mnt)) | 1360 | for (p = source_mnt; p; p = next_mnt(p, source_mnt)) |
1359 | set_mnt_shared(p); | 1361 | set_mnt_shared(p); |
1360 | } | 1362 | } |
1361 | |||
1362 | spin_lock(&vfsmount_lock); | ||
1363 | if (parent_path) { | 1363 | if (parent_path) { |
1364 | detach_mnt(source_mnt, parent_path); | 1364 | detach_mnt(source_mnt, parent_path); |
1365 | attach_mnt(source_mnt, path); | 1365 | attach_mnt(source_mnt, path); |