diff options
| author | Andrew Morton <akpm@osdl.org> | 2006-05-15 12:44:30 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-05-15 14:20:57 -0400 |
| commit | eee391a66d774e644bf3cbb35403562e09d88bb2 (patch) | |
| tree | 1c04e7edb60a5c129c8e118decfea8b5ba5076a3 | |
| parent | be6e028b6422878df2e799a74609a03a553c7dad (diff) | |
[PATCH] revert "vfs: propagate mnt_flags into do_loopback/vfsmount"
Revert commit f6422f17d3a480f21917a3895e2a46b968f56a08, due to
Valdis.Kletnieks@vt.edu wrote:
>
> There seems to have been a bug introduced in this changeset:
>
> Am running 2.6.17-rc3-mm1. When this changeset is applied, 'mount --bind'
> misbehaves:
>
> > # mkdir /foo
> > # mount -t tmpfs -o rw,nosuid,nodev,noexec,noatime,nodiratime none /foo
> > # mkdir /foo/bar
> > # mount --bind /foo/bar /foo
> > # tail -2 /proc/mounts
> > none /foo tmpfs rw,nosuid,nodev,noexec,noatime,nodiratime 0 0
> > none /foo tmpfs rw 0 0
>
> Reverting this changeset causes both mounts to have the same options.
>
> (Thanks to Stephen Smalley for tracking down the changeset...)
>
Cc: Herbert Poetzl <herbert@13thfloor.at>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: <Valdis.Kletnieks@vt.edu>
Cc: Stephen Smalley <sds@tycho.nsa.gov>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
| -rw-r--r-- | fs/namespace.c | 7 |
1 files changed, 2 insertions, 5 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index 2c5f1f80bdc2..bf478addb852 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
| @@ -899,13 +899,11 @@ static int do_change_type(struct nameidata *nd, int flag) | |||
| 899 | /* | 899 | /* |
| 900 | * do loopback mount. | 900 | * do loopback mount. |
| 901 | */ | 901 | */ |
| 902 | static int do_loopback(struct nameidata *nd, char *old_name, unsigned long flags, int mnt_flags) | 902 | static int do_loopback(struct nameidata *nd, char *old_name, int recurse) |
| 903 | { | 903 | { |
| 904 | struct nameidata old_nd; | 904 | struct nameidata old_nd; |
| 905 | struct vfsmount *mnt = NULL; | 905 | struct vfsmount *mnt = NULL; |
| 906 | int recurse = flags & MS_REC; | ||
| 907 | int err = mount_is_safe(nd); | 906 | int err = mount_is_safe(nd); |
| 908 | |||
| 909 | if (err) | 907 | if (err) |
| 910 | return err; | 908 | return err; |
| 911 | if (!old_name || !*old_name) | 909 | if (!old_name || !*old_name) |
| @@ -939,7 +937,6 @@ static int do_loopback(struct nameidata *nd, char *old_name, unsigned long flags | |||
| 939 | spin_unlock(&vfsmount_lock); | 937 | spin_unlock(&vfsmount_lock); |
| 940 | release_mounts(&umount_list); | 938 | release_mounts(&umount_list); |
| 941 | } | 939 | } |
| 942 | mnt->mnt_flags = mnt_flags; | ||
| 943 | 940 | ||
| 944 | out: | 941 | out: |
| 945 | up_write(&namespace_sem); | 942 | up_write(&namespace_sem); |
| @@ -1353,7 +1350,7 @@ long do_mount(char *dev_name, char *dir_name, char *type_page, | |||
| 1353 | retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags, | 1350 | retval = do_remount(&nd, flags & ~MS_REMOUNT, mnt_flags, |
| 1354 | data_page); | 1351 | data_page); |
| 1355 | else if (flags & MS_BIND) | 1352 | else if (flags & MS_BIND) |
| 1356 | retval = do_loopback(&nd, dev_name, flags, mnt_flags); | 1353 | retval = do_loopback(&nd, dev_name, flags & MS_REC); |
| 1357 | else if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE)) | 1354 | else if (flags & (MS_SHARED | MS_PRIVATE | MS_SLAVE | MS_UNBINDABLE)) |
| 1358 | retval = do_change_type(&nd, flags); | 1355 | retval = do_change_type(&nd, flags); |
| 1359 | else if (flags & MS_MOVE) | 1356 | else if (flags & MS_MOVE) |
