nrt = rt6_cow(rt, &fl->fl6_dst, &fl->fl6_src); 
nrt = rt6_cow(rt, &fl->fl6_dst, &fl->fl6_src, NULL); 
struct dst_entry * ip6_route_output(struct sock *sk, struct flowi *fl){	struct fib6_node *fn;	struct rt6_info *rt;	int strict;	int attempts = 3;	strict = ipv6_addr_type(&fl->fl6_dst) & (IPV6_ADDR_MULTICAST|IPV6_ADDR_LINKLOCAL);relookup:	read_lock_bh(&rt6_lock);	fn = fib6_lookup(&ip6_routing_table, &fl->fl6_dst, &fl->fl6_src);restart:	rt = fn->leaf;	if ((rt->rt6i_flags & RTF_CACHE)) {		rt = rt6_device_match(rt, fl->oif, strict);		BACKTRACK();		dst_hold(&rt->u.dst);		goto out;	}	if (rt->rt6i_flags & RTF_DEFAULT) {		if (rt->rt6i_metric >= IP6_RT_PRIO_ADDRCONF)			rt = rt6_best_dflt(rt, fl->oif);	} else {		rt = rt6_device_match(rt, fl->oif, strict);		BACKTRACK();	}	if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) {		struct rt6_info *nrt;		dst_hold(&rt->u.dst);		read_unlock_bh(&rt6_lock);		nrt = rt6_cow(rt, &fl->fl6_dst, &fl->fl6_src);		dst_release(&rt->u.dst);		rt = nrt;		if (rt->u.dst.error != -EEXIST || --attempts <= 0)			goto out2;		/* Race condition! In the gap, when rt6_lock was		   released someone could insert this route.  Relookup.		*/		dst_release(&rt->u.dst);		goto relookup;	}	dst_hold(&rt->u.dst);out:	read_unlock_bh(&rt6_lock);out2:	rt->u.dst.lastuse = jiffies;	rt->u.dst.__use++;	return &rt->u.dst;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/0d51aa80a9b1db43920c0770c3bb842dd823c005/route.c/buggy/net/ipv6/route.c