rem: }
context: cache_prefetch_vnode(void *vnode, off_t offset, size_t size){	vm_cache_ref *cache;	if (vfs_get_vnode_cache(vnode, &cache) != B_OK) {		vfs_put_vnode(vnode);		return;	}	file_cache_ref *ref = (struct file_cache_ref *)((vnode_store *)cache->cache->store)->file_cache_ref;	off_t fileSize = cache->cache->virtual_size;	if (size > fileSize)		size = fileSize;	// we never fetch more than 4 MB at once	if (size > 4 * 1024 * 1024)		size = 4 * 1024 * 1024;	size_t bytesLeft = size, lastLeft = size;	off_t lastOffset = offset;	size_t lastSize = 0;	mutex_lock(&cache->lock);	for (; bytesLeft > 0; offset += B_PAGE_SIZE) {		// check if this page is already in memory		addr_t virtualAddress;	restart:		vm_page *page = vm_cache_lookup_page(cache, offset);		if (page != NULL) {			// it is, so let's satisfy in the first part of the request			if (lastOffset < offset) {				size_t requestSize = offset - lastOffset;				read_into_cache(ref, lastOffset, requestSize, NULL, 0);			}			if (bytesLeft <= B_PAGE_SIZE) {				// we've read the last page, so we're done!				goto out;			}			// prepare a potential gap request			lastOffset = offset + B_PAGE_SIZE;			lastLeft = bytesLeft - B_PAGE_SIZE;		}		if (bytesLeft <= B_PAGE_SIZE)			break;		bytesLeft -= B_PAGE_SIZE;	}	// read in the last part	read_into_cache(ref, lastOffset, lastLeft, NULL, 0);out:	mutex_unlock(&cache->lock);}