Re: [PATCH 1/7] shared subtree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]
  Powered by Linux