//1.p存在左孩子,则使用p的左孩子的最右孩子替换p,然后重平衡树 //2.p不存在左孩子,则使用p的右孩子替换p,然后重平衡树 1.1 static void unlink_from_pool(struct inet_peer *p) { int do_free; do_free = 0; write_lock_bh(&peer_pool_lock); //在clean_up中,会设置refcnt=0的为1,防止其突然被删除 if (atomic_read(&p->refcnt) == 1) {//refcnt=1,说明,此节点没有引用计数 struct inet_peer **stack[PEER_MAXDEPTH]; struct inet_peer ***stackptr, ***delp; if (lookup(p->v4daddr,stack) != p)//查找要被删除的节点,路径上所有的节点保存在栈中,p为要删除的节点 BUG(); delp = stackptr - 1; //*delp[0]指向p节点在栈中的位置 if (p->avl_left == peer_avl_empty) {//如果p节点没有左孩子,情况1.1 *delp[0] = p->avl_right;//*delp[0]指向其右孩子 --stackptr;//stackptr指向p节点 } else {//p节点有左孩子,在左子树中寻找一个节点,替换p,情况1.2 struct inet_peer *t; t = lookup_rightempty(p);//t为p的左孩子的最右孩子 **--stackptr = t->