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 | /* | 
