dio_complete(dio, dio->block_in_file << dio->blkbits, dio->result); 
 /* Check for short read case */ transferred = dio->result; offset = dio->iocb->ki_pos;  if ((dio->rw == READ) && ((offset + transferred) > dio->i_size)) transferred = dio->i_size - offset;  dio_complete(dio, offset, transferred);  
static void finished_one_bio(struct dio *dio){	unsigned long flags;	spin_lock_irqsave(&dio->bio_lock, flags);	if (dio->bio_count == 1) {		if (dio->is_async) {			/*			 * Last reference to the dio is going away.			 * Drop spinlock and complete the DIO.			 */			spin_unlock_irqrestore(&dio->bio_lock, flags);			dio_complete(dio, dio->block_in_file << dio->blkbits,					dio->result);			/* Complete AIO later if falling back to buffered i/o */			if (dio->result == dio->size ||				((dio->rw == READ) && dio->result)) {				aio_complete(dio->iocb, dio->result, 0);				kfree(dio);				return;			} else {				/*				 * Falling back to buffered				 */				spin_lock_irqsave(&dio->bio_lock, flags);				dio->bio_count--;				if (dio->waiter)					wake_up_process(dio->waiter);				spin_unlock_irqrestore(&dio->bio_lock, flags);				return;			}		}	}	dio->bio_count--;	spin_unlock_irqrestore(&dio->bio_lock, flags);}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/29504ff3be784372c4e2f7e31681a3e0292c4d9a/direct-io.c/buggy/fs/direct-io.c