2 * Copyright (c) 2007 The DragonFly Project. All rights reserved.
4 * This code is derived from software contributed to The DragonFly Project
5 * by Matthew Dillon <dillon@backplane.com>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * 1. Redistributions of source code must retain the above copyright
12 * 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
15 * the documentation and/or other materials provided with the
17 * 3. Neither the name of The DragonFly Project nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific, prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * $DragonFly: src/sys/vfs/hammer/hammer_subs.c,v 1.2 2007/11/07 00:43:24 dillon Exp $
37 * HAMMER structural locking
43 hammer_lock(struct hammer_lock *lock)
45 thread_t td = curthread;
49 if (lock->locktd != td) {
50 while (lock->locktd != NULL) {
52 tsleep(lock, 0, "hmrlck", 0);
60 hammer_unlock(struct hammer_lock *lock)
62 KKASSERT(lock->locktd == curthread);
63 KKASSERT(lock->refs > 0);
65 if (--lock->refs == 0) {
76 hammer_ref(struct hammer_lock *lock)
84 hammer_unref(struct hammer_lock *lock)
92 hammer_lock_to_ref(struct hammer_lock *lock)
101 hammer_ref_to_lock(struct hammer_lock *lock)
110 hammer_to_unix_xid(uuid_t *uuid)
112 return(*(u_int32_t *)&uuid->node[2]);
116 hammer_to_timespec(u_int64_t hammerts, struct timespec *ts)
118 ts->tv_sec = hammerts / 1000000000;
119 ts->tv_nsec = hammerts % 1000000000;
123 * Convert a HAMMER filesystem object type to a vnode type
126 hammer_get_vnode_type(u_int8_t obj_type)
129 case HAMMER_OBJTYPE_DIRECTORY:
131 case HAMMER_OBJTYPE_REGFILE:
133 case HAMMER_OBJTYPE_DBFILE:
135 case HAMMER_OBJTYPE_FIFO:
137 case HAMMER_OBJTYPE_CDEV:
139 case HAMMER_OBJTYPE_BDEV:
141 case HAMMER_OBJTYPE_SOFTLINK:
150 hammer_get_obj_type(enum vtype vtype)
154 return(HAMMER_OBJTYPE_DIRECTORY);
156 return(HAMMER_OBJTYPE_REGFILE);
158 return(HAMMER_OBJTYPE_DBFILE);
160 return(HAMMER_OBJTYPE_FIFO);
162 return(HAMMER_OBJTYPE_CDEV);
164 return(HAMMER_OBJTYPE_BDEV);
166 return(HAMMER_OBJTYPE_SOFTLINK);
168 return(HAMMER_OBJTYPE_UNKNOWN);
174 * Return a namekey hash. The 64 bit namekey hash consists of a 32 bit
175 * crc in the MSB and 0 in the LSB. The caller will use the low bits to
176 * generate a unique key and will scan all entries with the same upper
177 * 32 bits when issuing a lookup.
180 hammer_directory_namekey(void *name, int len)
184 key = (int64_t)crc32(name, len) << 32;