diff options
-rw-r--r-- | fs/namespace.c | 2 | ||||
-rw-r--r-- | fs/pnode.c | 28 | ||||
-rw-r--r-- | fs/pnode.h | 3 |
3 files changed, 19 insertions, 14 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index c768f733c8d6..25c1dcf9e9eb 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -573,7 +573,7 @@ static struct vfsmount *clone_mnt(struct vfsmount *old, struct dentry *root, | |||
573 | mnt->mnt_master = old; | 573 | mnt->mnt_master = old; |
574 | CLEAR_MNT_SHARED(mnt); | 574 | CLEAR_MNT_SHARED(mnt); |
575 | } else if (!(flag & CL_PRIVATE)) { | 575 | } else if (!(flag & CL_PRIVATE)) { |
576 | if ((flag & CL_PROPAGATION) || IS_MNT_SHARED(old)) | 576 | if ((flag & CL_MAKE_SHARED) || IS_MNT_SHARED(old)) |
577 | list_add(&mnt->mnt_share, &old->mnt_share); | 577 | list_add(&mnt->mnt_share, &old->mnt_share); |
578 | if (IS_MNT_SLAVE(old)) | 578 | if (IS_MNT_SLAVE(old)) |
579 | list_add(&mnt->mnt_slave, &old->mnt_slave); | 579 | list_add(&mnt->mnt_slave, &old->mnt_slave); |
diff --git a/fs/pnode.c b/fs/pnode.c index 8d5f392ec3d3..5cc564a83149 100644 --- a/fs/pnode.c +++ b/fs/pnode.c | |||
@@ -86,7 +86,7 @@ static int do_make_slave(struct vfsmount *mnt) | |||
86 | 86 | ||
87 | /* | 87 | /* |
88 | * slave 'mnt' to a peer mount that has the | 88 | * slave 'mnt' to a peer mount that has the |
89 | * same root dentry. If none is available than | 89 | * same root dentry. If none is available then |
90 | * slave it to anything that is available. | 90 | * slave it to anything that is available. |
91 | */ | 91 | */ |
92 | while ((peer_mnt = next_peer(peer_mnt)) != mnt && | 92 | while ((peer_mnt = next_peer(peer_mnt)) != mnt && |
@@ -147,6 +147,11 @@ void change_mnt_propagation(struct vfsmount *mnt, int type) | |||
147 | * get the next mount in the propagation tree. | 147 | * get the next mount in the propagation tree. |
148 | * @m: the mount seen last | 148 | * @m: the mount seen last |
149 | * @origin: the original mount from where the tree walk initiated | 149 | * @origin: the original mount from where the tree walk initiated |
150 | * | ||
151 | * Note that peer groups form contiguous segments of slave lists. | ||
152 | * We rely on that in get_source() to be able to find out if | ||
153 | * vfsmount found while iterating with propagation_next() is | ||
154 | * a peer of one we'd found earlier. | ||
150 | */ | 155 | */ |
151 | static struct vfsmount *propagation_next(struct vfsmount *m, | 156 | static struct vfsmount *propagation_next(struct vfsmount *m, |
152 | struct vfsmount *origin) | 157 | struct vfsmount *origin) |
@@ -186,10 +191,6 @@ static struct vfsmount *get_source(struct vfsmount *dest, | |||
186 | { | 191 | { |
187 | struct vfsmount *p_last_src = NULL; | 192 | struct vfsmount *p_last_src = NULL; |
188 | struct vfsmount *p_last_dest = NULL; | 193 | struct vfsmount *p_last_dest = NULL; |
189 | *type = CL_PROPAGATION; | ||
190 | |||
191 | if (IS_MNT_SHARED(dest)) | ||
192 | *type |= CL_MAKE_SHARED; | ||
193 | 194 | ||
194 | while (last_dest != dest->mnt_master) { | 195 | while (last_dest != dest->mnt_master) { |
195 | p_last_dest = last_dest; | 196 | p_last_dest = last_dest; |
@@ -202,13 +203,18 @@ static struct vfsmount *get_source(struct vfsmount *dest, | |||
202 | do { | 203 | do { |
203 | p_last_dest = next_peer(p_last_dest); | 204 | p_last_dest = next_peer(p_last_dest); |
204 | } while (IS_MNT_NEW(p_last_dest)); | 205 | } while (IS_MNT_NEW(p_last_dest)); |
206 | /* is that a peer of the earlier? */ | ||
207 | if (dest == p_last_dest) { | ||
208 | *type = CL_MAKE_SHARED; | ||
209 | return p_last_src; | ||
210 | } | ||
205 | } | 211 | } |
206 | 212 | /* slave of the earlier, then */ | |
207 | if (dest != p_last_dest) { | 213 | *type = CL_SLAVE; |
208 | *type |= CL_SLAVE; | 214 | /* beginning of peer group among the slaves? */ |
209 | return last_src; | 215 | if (IS_MNT_SHARED(dest)) |
210 | } else | 216 | *type |= CL_MAKE_SHARED; |
211 | return p_last_src; | 217 | return last_src; |
212 | } | 218 | } |
213 | 219 | ||
214 | /* | 220 | /* |
diff --git a/fs/pnode.h b/fs/pnode.h index 958665d662af..6c7ef3252a26 100644 --- a/fs/pnode.h +++ b/fs/pnode.h | |||
@@ -21,8 +21,7 @@ | |||
21 | #define CL_SLAVE 0x02 | 21 | #define CL_SLAVE 0x02 |
22 | #define CL_COPY_ALL 0x04 | 22 | #define CL_COPY_ALL 0x04 |
23 | #define CL_MAKE_SHARED 0x08 | 23 | #define CL_MAKE_SHARED 0x08 |
24 | #define CL_PROPAGATION 0x10 | 24 | #define CL_PRIVATE 0x10 |
25 | #define CL_PRIVATE 0x20 | ||
26 | 25 | ||
27 | static inline void set_mnt_shared(struct vfsmount *mnt) | 26 | static inline void set_mnt_shared(struct vfsmount *mnt) |
28 | { | 27 | { |