if (unlikely(ret == WRITEPAGE_ACTIVATE)) unlock_page(page); 
__mpage_writepages(struct address_space *mapping,		struct writeback_control *wbc, get_block_t get_block,		writepage_t writepage_fn){	struct backing_dev_info *bdi = mapping->backing_dev_info;	struct bio *bio = NULL;	sector_t last_block_in_bio = 0;	int ret = 0;	int done = 0;	int (*writepage)(struct page *page, struct writeback_control *wbc);	struct pagevec pvec;	int nr_pages;	pgoff_t index;	pgoff_t end = -1;		/* Inclusive */	int scanned = 0;	int is_range = 0;	if (wbc->nonblocking && bdi_write_congested(bdi)) {		wbc->encountered_congestion = 1;		return 0;	}	writepage = NULL;	if (get_block == NULL)		writepage = mapping->a_ops->writepage;	pagevec_init(&pvec, 0);	if (wbc->sync_mode == WB_SYNC_NONE) {		index = mapping->writeback_index; /* Start from prev offset */	} else {		index = 0;			  /* whole-file sweep */		scanned = 1;	}	if (wbc->start || wbc->end) {		index = wbc->start >> PAGE_CACHE_SHIFT;		end = wbc->end >> PAGE_CACHE_SHIFT;		is_range = 1;		scanned = 1;	}retry:	while (!done && (index <= end) &&			(nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,			PAGECACHE_TAG_DIRTY,			min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1))) {		unsigned i;		scanned = 1;		for (i = 0; i < nr_pages; i++) {			struct page *page = pvec.pages[i];			/*			 * At this point we hold neither mapping->tree_lock nor			 * lock on the page itself: the page may be truncated or			 * invalidated (changing page->mapping to NULL), or even			 * swizzled back from swapper_space to tmpfs file			 * mapping			 */			lock_page(page);			if (unlikely(page->mapping != mapping)) {				unlock_page(page);				continue;			}			if (unlikely(is_range) && page->index > end) {				done = 1;				unlock_page(page);				continue;			}			if (wbc->sync_mode != WB_SYNC_NONE)				wait_on_page_writeback(page);			if (PageWriteback(page) ||					!clear_page_dirty_for_io(page)) {				unlock_page(page);				continue;			}			if (writepage) {				ret = (*writepage)(page, wbc);				if (ret) {					if (ret == -ENOSPC)						set_bit(AS_ENOSPC,							&mapping->flags);					else						set_bit(AS_EIO,							&mapping->flags);				}			} else {				bio = __mpage_writepage(bio, page, get_block,						&last_block_in_bio, &ret, wbc,						writepage_fn);			}			if (ret || (--(wbc->nr_to_write) <= 0))				done = 1;			if (wbc->nonblocking && bdi_write_congested(bdi)) {				wbc->encountered_congestion = 1;				done = 1;			}		}		pagevec_release(&pvec);		cond_resched();	}	if (!scanned && !done) {		/*		 * We hit the last page and there is more work to be done: wrap		 * back to the start of the file		 */		scanned = 1;		index = 0;		goto retry;	}	if (!is_range)		mapping->writeback_index = index;	if (bio)		mpage_bio_submit(WRITE, bio);	return ret;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/552fca4cbe552520d85b21e839f289c880fa48d2/mpage.c/clean/fs/mpage.c