2 * Copyright (c) 2005-2006, Stockholms Universitet
3 * (Stockholm University, Stockholm Sweden)
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the university nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
36 #include <arla_local.h>
39 * return pointer to block if it is in cache, else NULL
43 block_get(FCacheEntry
*node
, uint64_t offset
)
45 struct block
*entry
= NULL
;
48 assert(block_offset(offset
) == offset
);
50 for (item
= listhead(node
->blocks
);
52 item
= listnext(node
->blocks
, item
)) {
53 entry
= (struct block
*)listdata(item
);
55 if (entry
->offset
== offset
) {
56 fcache_block_lru(entry
);
67 * Caller needs to link the block into some lru.
71 block_add(FCacheEntry
*node
, uint64_t offset
)
75 #ifdef BLOCKS_PARANOIA
76 struct block
*old
= block_get(node
, offset
);
80 assert(block_offset(offset
) == offset
);
82 new = malloc(sizeof(*new));
87 new->flags
.kernelp
= FALSE
;
88 new->flags
.busy
= FALSE
;
91 new->block_le
= listaddhead(node
->blocks
, new);
97 * call callback for every block present in cache
101 block_foreach(FCacheEntry
*node
,
102 block_callback_t fun
,
106 Listitem
*item
, *prev
;
108 for (item
= listtail(node
->blocks
);
111 prev
= listprev(node
->blocks
, item
);
112 entry
= (struct block
*)listdata(item
);
119 * free all block internal resources
121 * Assumes the node is properly locked and that data is taken care of.
125 block_free(struct block
*block
)
127 listdel(block
->node
->blocks
, block
->block_le
);
132 * Return aggregate status for the node.
134 * If we only have busy blocks, return BLOCK_BUSY. XXX reverse this?
138 block_any(FCacheEntry
*node
)
141 Listitem
*item
, *prev
;
143 if (listemptyp(node
->blocks
))
146 for (item
= listtail(node
->blocks
);
149 prev
= listprev(node
->blocks
, item
);
150 entry
= (struct block
*)listdata(item
);
152 if (!entry
->flags
.busy
)
160 * Return TRUE if we have no data.
164 block_emptyp(FCacheEntry
*node
)
166 if (listemptyp(node
->blocks
))