 if (mapping->a_ops->get_xip_page) /* no bad return value, but ignore advice */ goto out; 
asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice){	struct file *file = fget(fd);	struct address_space *mapping;	struct backing_dev_info *bdi;	loff_t endbyte;	pgoff_t start_index;	pgoff_t end_index;	unsigned long nrpages;	int ret = 0;	if (!file)		return -EBADF;	mapping = file->f_mapping;	if (!mapping || len < 0) {		ret = -EINVAL;		goto out;	}	/* Careful about overflows. Len == 0 means "as much as possible" */	endbyte = offset + len;	if (!len || endbyte < len)		endbyte = -1;	bdi = mapping->backing_dev_info;	switch (advice) {	case POSIX_FADV_NORMAL:		file->f_ra.ra_pages = bdi->ra_pages;		break;	case POSIX_FADV_RANDOM:		file->f_ra.ra_pages = 0;		break;	case POSIX_FADV_SEQUENTIAL:		file->f_ra.ra_pages = bdi->ra_pages * 2;		break;	case POSIX_FADV_WILLNEED:	case POSIX_FADV_NOREUSE:		if (!mapping->a_ops->readpage) {			ret = -EINVAL;			break;		}		/* First and last PARTIAL page! */		start_index = offset >> PAGE_CACHE_SHIFT;		end_index = (endbyte-1) >> PAGE_CACHE_SHIFT;		/* Careful about overflow on the "+1" */		nrpages = end_index - start_index + 1;		if (!nrpages)			nrpages = ~0UL;				ret = force_page_cache_readahead(mapping, file,				start_index,				max_sane_readahead(nrpages));		if (ret > 0)			ret = 0;		break;	case POSIX_FADV_DONTNEED:		if (!bdi_write_congested(mapping->backing_dev_info))			filemap_flush(mapping);		/* First and last FULL page! */		start_index = (offset + (PAGE_CACHE_SIZE-1)) >> PAGE_CACHE_SHIFT;		end_index = (endbyte >> PAGE_CACHE_SHIFT);		if (end_index > start_index)			invalidate_mapping_pages(mapping, start_index, end_index-1);		break;	default:		ret = -EINVAL;	}out:	fput(file);	return ret;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/fe77ba6f4f97690baa4c756611a07f3cc033f6ae/fadvise.c/buggy/mm/fadvise.c