filter_cache (struct backend *b, struct connection *conn,
              uint32_t count, uint64_t offset,
              uint32_t flags, int *err)
{
  struct backend_filter *f = container_of (b, struct backend_filter, backend);
  void *handle = connection_get_handle (conn, f->backend.i);
  struct b_conn nxdata = { .b = f->backend.next, .conn = conn };

  assert (flags == 0);

  debug ("%s: cache count=%" PRIu32 " offset=%" PRIu64 " flags=0x%" PRIx32,
         f->name, count, offset, flags);

  if (f->filter.cache)
    return f->filter.cache (&next_ops, &nxdata, handle,
                            count, offset, flags, err);
  else
    return f->backend.next->cache (f->backend.next, conn,
                                   count, offset, flags, err);
}
filter_cache (struct backend *b, struct connection *conn,
              uint32_t count, uint64_t offset,
              uint32_t flags, int *err)
{
  struct backend_filter *f = container_of (b, struct backend_filter, backend);
  void *handle = connection_get_handle (conn, f->backend.i);
  struct b_conn nxdata = { .b = f->backend.next, .conn = conn };

  assert (flags == 0);

  debug ("%s: cache count=%" PRIu32 " offset=%" PRIu64 " flags=0x%" PRIx32,
         f->name, count, offset, flags);

  if (f->filter.cache)
    return f->filter.cache (&next_ops, &nxdata, handle,
                            count, offset, flags, err);
  else
    return f->backend.next->cache (f->backend.next, conn,
                                   count, offset, flags, err);
}