 if (unlikely(bio_barrier(bi))) { bio_endio(bi, bi->bi_size, -EOPNOTSUPP); return 0; } 
static int make_request (request_queue_t *q, struct bio * bi){	mddev_t *mddev = q->queuedata;	raid5_conf_t *conf = mddev_to_conf(mddev);	const unsigned int raid_disks = conf->raid_disks;	const unsigned int data_disks = raid_disks - 1;	unsigned int dd_idx, pd_idx;	sector_t new_sector;	sector_t logical_sector, last_sector;	struct stripe_head *sh;	md_write_start(mddev, bi);	if (bio_data_dir(bi)==WRITE) {		disk_stat_inc(mddev->gendisk, writes);		disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi));	} else {		disk_stat_inc(mddev->gendisk, reads);		disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi));	}	logical_sector = bi->bi_sector & ~((sector_t)STRIPE_SECTORS-1);	last_sector = bi->bi_sector + (bi->bi_size>>9);	bi->bi_next = NULL;	bi->bi_phys_segments = 1;	/* over-loaded to count active stripes */	for (;logical_sector < last_sector; logical_sector += STRIPE_SECTORS) {		DEFINE_WAIT(w);				new_sector = raid5_compute_sector(logical_sector,						  raid_disks, data_disks, &dd_idx, &pd_idx, conf);		PRINTK("raid5: make_request, sector %llu logical %llu\n",			(unsigned long long)new_sector, 			(unsigned long long)logical_sector);	retry:		prepare_to_wait(&conf->wait_for_overlap, &w, TASK_UNINTERRUPTIBLE);		sh = get_active_stripe(conf, new_sector, pd_idx, (bi->bi_rw&RWA_MASK));		if (sh) {			if (!add_stripe_bio(sh, bi, dd_idx, (bi->bi_rw&RW_MASK))) {				/* Add failed due to overlap.  Flush everything				 * and wait a while				 */				raid5_unplug_device(mddev->queue);				release_stripe(sh);				schedule();				goto retry;			}			finish_wait(&conf->wait_for_overlap, &w);			raid5_plug_device(conf);			handle_stripe(sh);			release_stripe(sh);		} else {			/* cannot get stripe for read-ahead, just give-up */			clear_bit(BIO_UPTODATE, &bi->bi_flags);			finish_wait(&conf->wait_for_overlap, &w);			break;		}				}	spin_lock_irq(&conf->device_lock);	if (--bi->bi_phys_segments == 0) {		int bytes = bi->bi_size;		if ( bio_data_dir(bi) == WRITE )			md_write_end(mddev);		bi->bi_size = 0;		bi->bi_end_io(bi, bytes, 0);	}	spin_unlock_irq(&conf->device_lock);	return 0;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/e5dcdd80a60627371f40797426273048630dc8ca/raid5.c/buggy/drivers/md/raid5.c