Fix handling of direct maps, broken in r275756. Previously, running

automount(8) would unmount direct map trigger nodes every second time.

MFC after:	1 month
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Edward Tomasz Napierala 2015-03-10 11:59:33 +00:00
parent 7a20e4799e
commit 12f1f00c30

View File

@ -661,23 +661,25 @@ node_find_x(struct node *node, const char *path)
char *tmp;
size_t tmplen;
//log_debugx("looking up %s in %s", path, node->n_key);
//log_debugx("looking up %s in %s", path, node_path(node));
tmp = node_path(node);
tmplen = strlen(tmp);
if (strncmp(tmp, path, tmplen) != 0) {
if (!node_is_direct_key(node)) {
tmp = node_path(node);
tmplen = strlen(tmp);
if (strncmp(tmp, path, tmplen) != 0) {
free(tmp);
return (NULL);
}
if (path[tmplen] != '/' && path[tmplen] != '\0') {
/*
* If we have two map entries like 'foo' and 'foobar', make
* sure the search for 'foobar' won't match 'foo' instead.
*/
free(tmp);
return (NULL);
}
free(tmp);
return (NULL);
}
if (path[tmplen] != '/' && path[tmplen] != '\0') {
/*
* If we have two map entries like 'foo' and 'foobar', make
* sure the search for 'foobar' won't match 'foo' instead.
*/
free(tmp);
return (NULL);
}
free(tmp);
TAILQ_FOREACH(child, &node->n_children, n_next) {
found = node_find_x(child, path);
@ -685,6 +687,9 @@ node_find_x(struct node *node, const char *path)
return (found);
}
if (node->n_parent == NULL || node_is_direct_key(node))
return (NULL);
return (node);
}
@ -693,9 +698,12 @@ node_find(struct node *root, const char *path)
{
struct node *node;
assert(root->n_parent == NULL);
node = node_find_x(root, path);
if (node == root)
return (NULL);
if (node != NULL)
assert(node != root);
return (node);
}