MacOS needs a ${CACHEDIR}/cores/ for core dumps to work
[arla.git] / arlad / blocks.c
blob3ce91c97777b06d4b6ab6917738a59135e96ca61
1 /*
2 * Copyright (c) 2005-2006, Stockholms Universitet
3 * (Stockholm University, Stockholm Sweden)
4 * All rights reserved.
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
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.
34 /* $Id$ */
36 #include <arla_local.h>
39 * return pointer to block if it is in cache, else NULL
42 struct block *
43 block_get(FCacheEntry *node, uint64_t offset)
45 struct block *entry = NULL;
46 Listitem *item;
48 assert(block_offset(offset) == offset);
50 for (item = listhead(node->blocks);
51 item;
52 item = listnext(node->blocks, item)) {
53 entry = (struct block *)listdata(item);
55 if (entry->offset == offset) {
56 fcache_block_lru(entry);
57 return entry;
61 return NULL;
65 * add a block
67 * Caller needs to link the block into some lru.
70 struct block *
71 block_add(FCacheEntry *node, uint64_t offset)
73 struct block *new;
75 #ifdef BLOCKS_PARANOIA
76 struct block *old = block_get(node, offset);
77 assert(!old);
78 #endif
80 assert(block_offset(offset) == offset);
82 new = malloc(sizeof(*new));
83 assert(new);
85 new->offset = offset;
86 new->node = node;
87 new->flags.kernelp = FALSE;
88 new->flags.busy = FALSE;
90 new->lru_le = NULL;
91 new->block_le = listaddhead(node->blocks, new);
93 return new;
97 * call callback for every block present in cache
100 void
101 block_foreach(FCacheEntry *node,
102 block_callback_t fun,
103 void *data)
105 struct block *entry;
106 Listitem *item, *prev;
108 for (item = listtail(node->blocks);
109 item;
110 item = prev) {
111 prev = listprev(node->blocks, item);
112 entry = (struct block *)listdata(item);
114 fun(entry, data);
119 * free all block internal resources
121 * Assumes the node is properly locked and that data is taken care of.
124 void
125 block_free(struct block *block)
127 listdel(block->node->blocks, block->block_le);
128 free(block);
132 * Return aggregate status for the node.
134 * If we only have busy blocks, return BLOCK_BUSY. XXX reverse this?
137 BlockState
138 block_any(FCacheEntry *node)
140 struct block *entry;
141 Listitem *item, *prev;
143 if (listemptyp(node->blocks))
144 return BLOCK_NONE;
146 for (item = listtail(node->blocks);
147 item;
148 item = prev) {
149 prev = listprev(node->blocks, item);
150 entry = (struct block *)listdata(item);
152 if (!entry->flags.busy)
153 return BLOCK_GOT;
156 return BLOCK_BUSY;
160 * Return TRUE if we have no data.
163 Bool
164 block_emptyp(FCacheEntry *node)
166 if (listemptyp(node->blocks))
167 return TRUE;
168 return FALSE;