Revision 720db5deeb852b61e40007989c1390295ceece32 authored by Fam Zheng on 01 June 2018, 09:26:40 UTC, committed by Michael Roth on 21 June 2018, 01:45:04 UTC
We don't verify the request range against s->size in the I/O callbacks
except for raw_co_pwritev. This is inconsistent (especially for
raw_co_pwrite_zeroes and raw_co_pdiscard), so fix them, in the meanwhile
make the helper reusable by the coming new callbacks.

Note that in most cases the block layer already verifies the request
byte range against our reported image length, before invoking the driver
callbacks.  The exception is during image creating, after
blk_set_allow_write_beyond_eof(blk, true) is called. But in that case,
the requests are not directly from the user or guest. So there is no
visible behavior change in adding the check code.

The int64_t -> uint64_t inconsistency, as shown by the type casting, is
pre-existing due to the interface.

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Fam Zheng <famz@redhat.com>
Message-id: 20180601092648.24614-3-famz@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
(cherry picked from commit 384455385248762e74a080978f18f0c8f74757fe)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
1 parent 979e7ea
Raw File
page_cache.h
/*
 * Page cache for QEMU
 * The cache is base on a hash of the page address
 *
 * Copyright 2012 Red Hat, Inc. and/or its affiliates
 *
 * Authors:
 *  Orit Wasserman  <owasserm@redhat.com>
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 *
 */

#ifndef PAGE_CACHE_H
#define PAGE_CACHE_H

/* Page cache for storing guest pages */
typedef struct PageCache PageCache;

/**
 * cache_init: Initialize the page cache
 *
 *
 * Returns new allocated cache or NULL on error
 *
 * @cache_size: cache size in bytes
 * @page_size: cache page size
 * @errp: set *errp if the check failed, with reason
 */
PageCache *cache_init(int64_t cache_size, size_t page_size, Error **errp);
/**
 * cache_fini: free all cache resources
 * @cache pointer to the PageCache struct
 */
void cache_fini(PageCache *cache);

/**
 * cache_is_cached: Checks to see if the page is cached
 *
 * Returns %true if page is cached
 *
 * @cache pointer to the PageCache struct
 * @addr: page addr
 * @current_age: current bitmap generation
 */
bool cache_is_cached(const PageCache *cache, uint64_t addr,
                     uint64_t current_age);

/**
 * get_cached_data: Get the data cached for an addr
 *
 * Returns pointer to the data cached or NULL if not cached
 *
 * @cache pointer to the PageCache struct
 * @addr: page addr
 */
uint8_t *get_cached_data(const PageCache *cache, uint64_t addr);

/**
 * cache_insert: insert the page into the cache. the page cache
 * will dup the data on insert. the previous value will be overwritten
 *
 * Returns -1 when the page isn't inserted into cache
 *
 * @cache pointer to the PageCache struct
 * @addr: page address
 * @pdata: pointer to the page
 * @current_age: current bitmap generation
 */
int cache_insert(PageCache *cache, uint64_t addr, const uint8_t *pdata,
                 uint64_t current_age);

#endif
back to top