version 1.23.2.1, 2008/06/18 16:33:59 |
version 1.27, 2008/07/03 09:56:15 |
Line 93 static TAILQ_HEAD(, dirhash) ufsdirhash_ |
|
Line 93 static TAILQ_HEAD(, dirhash) ufsdirhash_ |
|
/* Protects: ufsdirhash_list, `dh_list' field, ufs_dirhashmem. */ |
/* Protects: ufsdirhash_list, `dh_list' field, ufs_dirhashmem. */ |
static kmutex_t ufsdirhash_lock; |
static kmutex_t ufsdirhash_lock; |
|
|
|
static struct sysctllog *ufsdirhash_sysctl_log; |
|
|
/* |
/* |
* Locking order: |
* Locking order: |
* ufsdirhash_lock |
* ufsdirhash_lock |
Line 253 ufsdirhash_build(struct inode *ip) |
|
Line 255 ufsdirhash_build(struct inode *ip) |
|
return (0); |
return (0); |
|
|
fail: |
fail: |
|
DIRHASH_UNLOCK(dh); |
if (dh->dh_hash != NULL) { |
if (dh->dh_hash != NULL) { |
for (i = 0; i < narrays; i++) |
for (i = 0; i < narrays; i++) |
if (dh->dh_hash[i] != NULL) |
if (dh->dh_hash[i] != NULL) |
Line 1089 ufsdirhash_recycle(int wanted) |
|
Line 1092 ufsdirhash_recycle(int wanted) |
|
return (0); |
return (0); |
} |
} |
|
|
void |
static void |
ufsdirhash_init() |
ufsdirhash_sysctl_init(void) |
{ |
|
|
|
mutex_init(&ufsdirhash_lock, MUTEX_DEFAULT, IPL_NONE); |
|
ufsdirhashblk_cache = pool_cache_init(DH_NBLKOFF * sizeof(daddr_t), 0, |
|
0, 0, "dirhashblk", NULL, IPL_NONE, NULL, NULL, NULL); |
|
ufsdirhash_cache = pool_cache_init(sizeof(struct dirhash), 0, |
|
0, 0, "dirhash", NULL, IPL_NONE, NULL, NULL, NULL); |
|
TAILQ_INIT(&ufsdirhash_list); |
|
} |
|
|
|
void |
|
ufsdirhash_done(void) |
|
{ |
|
|
|
KASSERT(TAILQ_EMPTY(&ufsdirhash_list)); |
|
pool_cache_destroy(ufsdirhashblk_cache); |
|
pool_cache_destroy(ufsdirhash_cache); |
|
mutex_destroy(&ufsdirhash_lock); |
|
} |
|
|
|
SYSCTL_SETUP(sysctl_vfs_ufs_setup, "sysctl vfs.ufs.dirhash subtree setup") |
|
{ |
{ |
const struct sysctlnode *rnode, *cnode; |
const struct sysctlnode *rnode, *cnode; |
|
|
sysctl_createv(clog, 0, NULL, &rnode, |
sysctl_createv(&ufsdirhash_sysctl_log, 0, NULL, &rnode, |
CTLFLAG_PERMANENT, |
CTLFLAG_PERMANENT, |
CTLTYPE_NODE, "vfs", NULL, |
CTLTYPE_NODE, "vfs", NULL, |
NULL, 0, NULL, 0, |
NULL, 0, NULL, 0, |
CTL_VFS, CTL_EOL); |
CTL_VFS, CTL_EOL); |
|
|
sysctl_createv(clog, 0, &rnode, &rnode, |
sysctl_createv(&ufsdirhash_sysctl_log, 0, &rnode, &rnode, |
CTLFLAG_PERMANENT, |
CTLFLAG_PERMANENT, |
CTLTYPE_NODE, "ufs", |
CTLTYPE_NODE, "ufs", |
SYSCTL_DESCR("ufs"), |
SYSCTL_DESCR("ufs"), |
NULL, 0, NULL, 0, |
NULL, 0, NULL, 0, |
CTL_CREATE, CTL_EOL); |
CTL_CREATE, CTL_EOL); |
|
|
sysctl_createv(clog, 0, &rnode, &rnode, |
sysctl_createv(&ufsdirhash_sysctl_log, 0, &rnode, &rnode, |
CTLFLAG_PERMANENT, |
CTLFLAG_PERMANENT, |
CTLTYPE_NODE, "dirhash", |
CTLTYPE_NODE, "dirhash", |
SYSCTL_DESCR("dirhash"), |
SYSCTL_DESCR("dirhash"), |
NULL, 0, NULL, 0, |
NULL, 0, NULL, 0, |
CTL_CREATE, CTL_EOL); |
CTL_CREATE, CTL_EOL); |
|
|
sysctl_createv(clog, 0, &rnode, &cnode, |
sysctl_createv(&ufsdirhash_sysctl_log, 0, &rnode, &cnode, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLTYPE_INT, "minblocks", |
CTLTYPE_INT, "minblocks", |
SYSCTL_DESCR("minimum hashed directory size in blocks"), |
SYSCTL_DESCR("minimum hashed directory size in blocks"), |
NULL, 0, &ufs_dirhashminblks, 0, |
NULL, 0, &ufs_dirhashminblks, 0, |
CTL_CREATE, CTL_EOL); |
CTL_CREATE, CTL_EOL); |
|
|
sysctl_createv(clog, 0, &rnode, &cnode, |
sysctl_createv(&ufsdirhash_sysctl_log, 0, &rnode, &cnode, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLTYPE_INT, "maxmem", |
CTLTYPE_INT, "maxmem", |
SYSCTL_DESCR("maximum dirhash memory usage"), |
SYSCTL_DESCR("maximum dirhash memory usage"), |
NULL, 0, &ufs_dirhashmaxmem, 0, |
NULL, 0, &ufs_dirhashmaxmem, 0, |
CTL_CREATE, CTL_EOL); |
CTL_CREATE, CTL_EOL); |
|
|
sysctl_createv(clog, 0, &rnode, &cnode, |
sysctl_createv(&ufsdirhash_sysctl_log, 0, &rnode, &cnode, |
CTLFLAG_PERMANENT|CTLFLAG_READONLY, |
CTLFLAG_PERMANENT|CTLFLAG_READONLY, |
CTLTYPE_INT, "memused", |
CTLTYPE_INT, "memused", |
SYSCTL_DESCR("current dirhash memory usage"), |
SYSCTL_DESCR("current dirhash memory usage"), |
NULL, 0, &ufs_dirhashmem, 0, |
NULL, 0, &ufs_dirhashmem, 0, |
CTL_CREATE, CTL_EOL); |
CTL_CREATE, CTL_EOL); |
|
|
sysctl_createv(clog, 0, &rnode, &cnode, |
sysctl_createv(&ufsdirhash_sysctl_log, 0, &rnode, &cnode, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLFLAG_PERMANENT|CTLFLAG_READWRITE, |
CTLTYPE_INT, "docheck", |
CTLTYPE_INT, "docheck", |
SYSCTL_DESCR("enable extra sanity checks"), |
SYSCTL_DESCR("enable extra sanity checks"), |
NULL, 0, &ufs_dirhashcheck, 0, |
NULL, 0, &ufs_dirhashcheck, 0, |
CTL_CREATE, CTL_EOL); |
CTL_CREATE, CTL_EOL); |
} |
} |
|
|
|
void |
|
ufsdirhash_init() |
|
{ |
|
|
|
mutex_init(&ufsdirhash_lock, MUTEX_DEFAULT, IPL_NONE); |
|
ufsdirhashblk_cache = pool_cache_init(DH_NBLKOFF * sizeof(daddr_t), 0, |
|
0, 0, "dirhashblk", NULL, IPL_NONE, NULL, NULL, NULL); |
|
ufsdirhash_cache = pool_cache_init(sizeof(struct dirhash), 0, |
|
0, 0, "dirhash", NULL, IPL_NONE, NULL, NULL, NULL); |
|
TAILQ_INIT(&ufsdirhash_list); |
|
ufsdirhash_sysctl_init(); |
|
} |
|
|
|
void |
|
ufsdirhash_done(void) |
|
{ |
|
|
|
KASSERT(TAILQ_EMPTY(&ufsdirhash_list)); |
|
pool_cache_destroy(ufsdirhashblk_cache); |
|
pool_cache_destroy(ufsdirhash_cache); |
|
mutex_destroy(&ufsdirhash_lock); |
|
sysctl_teardown(&ufsdirhash_sysctl_log); |
|
} |