> > static struct vfsmount *propagation_next(struct vfsmount *p, > > struct vfsmount *base) > > { > > /* first iterate over the slaves */ > > if (!list_empty(&p->mnt_slave_list)) > > return first_slave(p); > > I think this code should be > if (!list_empty(&p->mnt_slave)) > return next_slave(p); > > Right? I think I get the idea.
This is a depth-first search, so first_slave() is right. Here's a less buggy (and even more simplified) version of the function. Note: it must be called with 'origin' either on a slave list or at the root pnode. That's because the function checks if the all vfsmounts in a pnode have been traversed by looking at the emptiness of mnt_slave. So if origin was in a slave pnode, but is not the actual slave link, the algorithm will go off the starting pnode and up to it's master. So here's a preparation function that finds the right place to start the propagation. static struct vfsmount *propagation_first(struct vfsmount *p) { struct vfsmount *q = p; while (list_empty(&q->mnt_slave)) { q = next_shared(q); if (q == p) break; } return q; } static struct vfsmount *propagation_next(struct vfsmount *p, struct vfsmount *origin) { /* are there any slaves of this mount? */ if (!list_empty(&p->mnt_slave_list)) return first_slave(p); while (1) { /* if p->mnt_share is empty, this is a no-op */ p = next_shared(p); /* finished traversing? */ if (p == origin) break; /* more vfsmounts belong to the pnode? */ if (list_empty(&p->mnt_slave)) return p; /* more slaves? */ if (p->mnt_slave.next != &p->mnt_master->mnt_slave_list) return next_slave(p); /* back at master */ p = p->mnt_master; } return NULL; } - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/