--- src/sys/vfs/hammer/hammer_subs.c 2007/11/01 20:53:05 1.1 +++ src/sys/vfs/hammer/hammer_subs.c 2007/11/07 00:43:24 1.2 @@ -44,6 +44,8 @@ hammer_lock(struct hammer_lock *lock) { thread_t td = curthread; + crit_enter(); + ++lock->refs; if (lock->locktd != td) { while (lock->locktd != NULL) { lock->wanted = 1; @@ -51,7 +53,7 @@ hammer_lock(struct hammer_lock *lock) } lock->locktd = td; } - ++lock->refs; + crit_exit(); } void @@ -59,6 +61,7 @@ hammer_unlock(struct hammer_lock *lock) { KKASSERT(lock->locktd == curthread); KKASSERT(lock->refs > 0); + crit_enter(); if (--lock->refs == 0) { lock->locktd = NULL; if (lock->wanted) { @@ -66,5 +69,119 @@ hammer_unlock(struct hammer_lock *lock) wakeup(lock); } } + crit_exit(); +} + +void +hammer_ref(struct hammer_lock *lock) +{ + crit_enter(); + ++lock->refs; + crit_exit(); +} + +void +hammer_unref(struct hammer_lock *lock) +{ + crit_enter(); + --lock->refs; + crit_exit(); +} + +void +hammer_lock_to_ref(struct hammer_lock *lock) +{ + crit_enter(); + ++lock->refs; + hammer_unlock(lock); + crit_exit(); +} + +void +hammer_ref_to_lock(struct hammer_lock *lock) +{ + crit_enter(); + hammer_lock(lock); + --lock->refs; + crit_exit(); +} + +u_int32_t +hammer_to_unix_xid(uuid_t *uuid) +{ + return(*(u_int32_t *)&uuid->node[2]); +} + +void +hammer_to_timespec(u_int64_t hammerts, struct timespec *ts) +{ + ts->tv_sec = hammerts / 1000000000; + ts->tv_nsec = hammerts % 1000000000; +} + +/* + * Convert a HAMMER filesystem object type to a vnode type + */ +enum vtype +hammer_get_vnode_type(u_int8_t obj_type) +{ + switch(obj_type) { + case HAMMER_OBJTYPE_DIRECTORY: + return(VDIR); + case HAMMER_OBJTYPE_REGFILE: + return(VREG); + case HAMMER_OBJTYPE_DBFILE: + return(VDATABASE); + case HAMMER_OBJTYPE_FIFO: + return(VFIFO); + case HAMMER_OBJTYPE_CDEV: + return(VCHR); + case HAMMER_OBJTYPE_BDEV: + return(VBLK); + case HAMMER_OBJTYPE_SOFTLINK: + return(VLNK); + default: + return(VBAD); + } + /* not reached */ +} + +u_int8_t +hammer_get_obj_type(enum vtype vtype) +{ + switch(vtype) { + case VDIR: + return(HAMMER_OBJTYPE_DIRECTORY); + case VREG: + return(HAMMER_OBJTYPE_REGFILE); + case VDATABASE: + return(HAMMER_OBJTYPE_DBFILE); + case VFIFO: + return(HAMMER_OBJTYPE_FIFO); + case VCHR: + return(HAMMER_OBJTYPE_CDEV); + case VBLK: + return(HAMMER_OBJTYPE_BDEV); + case VLNK: + return(HAMMER_OBJTYPE_SOFTLINK); + default: + return(HAMMER_OBJTYPE_UNKNOWN); + } + /* not reached */ +} + +/* + * Return a namekey hash. The 64 bit namekey hash consists of a 32 bit + * crc in the MSB and 0 in the LSB. The caller will use the low bits to + * generate a unique key and will scan all entries with the same upper + * 32 bits when issuing a lookup. + */ +int64_t +hammer_directory_namekey(void *name, int len) +{ + int64_t key; + + key = (int64_t)crc32(name, len) << 32; + return(key); }