if (held_skb) atomic_dec(&held_skb->users); else return NULL; 
claw_pack_skb(struct claw_privbk *privptr){	struct sk_buff *new_skb,*held_skb;	struct chbk *p_ch = &privptr->channel[WRITE];	struct claw_env  *p_env = privptr->p_env;	int	pkt_cnt,pk_ind,so_far;	new_skb = NULL;		/* assume no dice */	pkt_cnt = 0;	CLAW_DBF_TEXT(4,trace,"PackSKBe");	if (!skb_queue_empty(&p_ch->collect_queue)) {	/* some data */		held_skb = skb_dequeue(&p_ch->collect_queue);		if (p_env->packing != DO_PACKED)			return held_skb;		if (held_skb)			atomic_dec(&held_skb->users);		else			return NULL;		/* get a new SKB we will pack at least one */		new_skb = dev_alloc_skb(p_env->write_size);		if (new_skb == NULL) {			atomic_inc(&held_skb->users);			skb_queue_head(&p_ch->collect_queue,held_skb);			return NULL;		}		/* we have packed packet and a place to put it  */		pk_ind = 1;		so_far = 0;		new_skb->cb[1] = 'P'; /* every skb on queue has pack header */		while ((pk_ind) && (held_skb != NULL)) {			if (held_skb->len+so_far <= p_env->write_size-8) {				memcpy(skb_put(new_skb,held_skb->len),					held_skb->data,held_skb->len);				privptr->stats.tx_packets++;				so_far += held_skb->len;				pkt_cnt++;				dev_kfree_skb_irq(held_skb);				held_skb = skb_dequeue(&p_ch->collect_queue);				if (held_skb)					atomic_dec(&held_skb->users);			} else {				pk_ind = 0;				atomic_inc(&held_skb->users);				skb_queue_head(&p_ch->collect_queue,held_skb);			}		}#ifdef IOTRACE		printk(KERN_INFO "%s: %s() Packed %d len %d\n",			p_env->ndev->name,			__FUNCTION__,pkt_cnt,new_skb->len);#endif	}	CLAW_DBF_TEXT(4,trace,"PackSKBx");	return new_skb;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/8e84c801bad50d2e0e9f802610d2c13f8d342230/claw.c/clean/drivers/s390/net/claw.c