Пример #1
0
/*! 2016-06-04 study -ing */
static struct kernfs_node *kernfs_find_ns(struct kernfs_node *parent,
					  const unsigned char *name,
					  const void *ns)
{
	struct rb_node *node = parent->dir.children.rb_node;
	bool has_ns = kernfs_ns_enabled(parent);
	unsigned int hash;

	lockdep_assert_held(&kernfs_mutex);

	if (has_ns != (bool)ns) {
		WARN(1, KERN_WARNING "kernfs: ns %s in '%s' for '%s'\n",
		     has_ns ? "required" : "invalid", parent->name, name);
		return NULL;
	}

	/*! name + ns 로 31bit hash 생성하여 return */
	hash = kernfs_name_hash(name, ns);
	/*! hash 비교해 가면서 원하는 kn을 찾는다.  */
	while (node) {
		struct kernfs_node *kn;
		int result;

		kn = rb_to_kn(node);
		/*! hash 와 kn->hash 비교  */
		result = kernfs_name_compare(hash, name, ns, kn);
		if (result < 0)
			node = node->rb_left;
		else if (result > 0)
			node = node->rb_right;
		else
			return kn;
	}
	return NULL;
}
Пример #2
0
static int kernfs_sd_compare(const struct kernfs_node *left,
                             const struct kernfs_node *right)
{
	return kernfs_name_compare(left->hash, left->name, left->ns, right);
}