diff options
Diffstat (limited to 'fs/pnode.c')
-rw-r--r-- | fs/pnode.c | 28 |
1 files changed, 17 insertions, 11 deletions
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 | /* |