int Cache::
write(const void* src, int count, long long offset)
{
    int len;
    int n;

    if (size < offset + count)
    {
        setSize(offset + count);
    }

    for (len = 0;
         len < count && offset < size;
         len += n, offset += n, src = (u8*) src + n)
    {
        Page* page = getPage(offset);
        if (!page)
        {
            break;
        }

        n = Page::SIZE - Page::pageOffset(offset);
        if (count - len < n)
        {
            n = count - len;
        }
        if (size - offset < n)
        {
            n = size - offset;
        }

        if (n < Page::SIZE)
        {
            page->fill(backingStore);
        }

        n = page->write(src, n, Page::pageOffset(offset));

        page->filled = true;    // XXX

        page->change();
    }
    return len;
}