if (atomic_dec_and_test(&lo->lo_pending)) 
if (unlikely(!pending)) 
static int loop_thread(void *data){	struct loop_device *lo = data;	struct bio *bio;	daemonize("loop%d", lo->lo_number);	/*	 * loop can be used in an encrypted device,	 * hence, it mustn't be stopped at all	 * because it could be indirectly used during suspension	 */	current->flags |= PF_NOFREEZE;	set_user_nice(current, -20);	lo->lo_state = Lo_bound;	atomic_inc(&lo->lo_pending);	/*	 * up sem, we are running	 */	up(&lo->lo_sem);	for (;;) {		down_interruptible(&lo->lo_bh_mutex);		/*		 * could be upped because of tear-down, not because of		 * pending work		 */		if (!atomic_read(&lo->lo_pending))			break;		bio = loop_get_bio(lo);		if (!bio) {			printk("loop: missing bio\n");			continue;		}		loop_handle_bio(lo, bio);		/*		 * upped both for pending work and tear-down, lo_pending		 * will hit zero then		 */		if (atomic_dec_and_test(&lo->lo_pending))			break;	}	up(&lo->lo_sem);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/35a82d1a53e1a9ad54efafcc940f9335beaed5c3/loop.c/buggy/drivers/block/loop.c