* vcache is now using an rw_lock instead of a semaphore.

* Got rid of the lock typedef.
* Minor cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@31843 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2009-07-28 13:06:27 +00:00
parent 2e6adc56e4
commit 639f60b9b2
3 changed files with 47 additions and 37 deletions
+5 -6
View File
@@ -5,20 +5,19 @@
#ifndef _DOSFS_H_
#define _DOSFS_H_
#include <KernelExport.h>
#include <fs_interface.h>
#include <lock.h>
//#define DEBUG 1
typedef recursive_lock lock;
#define LOCK(l) recursive_lock_lock(&l);
#define UNLOCK(l) recursive_lock_unlock(&l);
/* for multiple reader/single writer locks */
#define READERS 100000
/* Unfortunately, ino_t's are defined as signed. This causes problems with
* programs (notably cp) that use the modulo of a ino_t as a
* hash function to index an array. This means the high bit of every ino_t
@@ -154,11 +153,11 @@ typedef struct _nspace
int fs_flags; // flags for this mount
lock vlock; // volume lock
recursive_lock vlock; // volume lock
// vcache state
struct {
sem_id vc_sem;
rw_lock lock;
ino_t cur_vnid;
uint32 cache_size;
struct vcache_entry **by_vnid, **by_loc;
+38 -31
View File
@@ -36,31 +36,36 @@ mapping table to translate vnode id's to locations. This file serves this
purpose.
*/
#define DPRINTF(a,b) if (debug_vcache > (a)) dprintf b
#define LOCK_CACHE_R \
acquire_sem(vol->vcache.vc_sem)
#define LOCK_CACHE_W \
acquire_sem_etc(vol->vcache.vc_sem, READERS, 0, 0)
#define UNLOCK_CACHE_R \
release_sem(vol->vcache.vc_sem)
#define UNLOCK_CACHE_W \
release_sem_etc(vol->vcache.vc_sem, READERS, 0)
#include <KernelExport.h>
#include "vcache.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "dosfs.h"
#include "vcache.h"
#include <KernelExport.h>
#include "dosfs.h"
#include "util.h"
#define DPRINTF(a,b) if (debug_vcache > (a)) dprintf b
#define LOCK_CACHE_R \
rw_lock_read_lock(&vol->vcache.lock)
#define LOCK_CACHE_W \
rw_lock_write_lock(&vol->vcache.lock)
#define UNLOCK_CACHE_R \
rw_lock_read_unlock(&vol->vcache.lock)
#define UNLOCK_CACHE_W \
rw_lock_write_unlock(&vol->vcache.lock)
#define hash(v) ((v) & (vol->vcache.cache_size-1))
struct vcache_entry {
ino_t vnid; /* originally reported vnid */
ino_t loc; /* where the file is now */
@@ -68,7 +73,9 @@ struct vcache_entry {
struct vcache_entry *next_loc; /* next entry in location hash table */
};
void dump_vcache(nspace *vol)
void
dump_vcache(nspace *vol)
{
uint32 i;
struct vcache_entry *c;
@@ -80,9 +87,9 @@ void dump_vcache(nspace *vol)
dprintf("%16Lx %16Lx\n", c->vnid, c->loc);
}
#define hash(v) ((v) & (vol->vcache.cache_size-1))
status_t init_vcache(nspace *vol)
status_t
init_vcache(nspace *vol)
{
char name[16];
DPRINTF(0, ("init_vcache called\n"));
@@ -93,12 +100,16 @@ status_t init_vcache(nspace *vol)
#else
vol->vcache.cache_size = 512; /* must be power of 2 */
#endif
vol->vcache.by_vnid = calloc(sizeof(struct vache_entry *), vol->vcache.cache_size);
vol->vcache.by_vnid = calloc(sizeof(struct vache_entry *),
vol->vcache.cache_size);
if (vol->vcache.by_vnid == NULL) {
dprintf("init_vcache: out of core\n");
return ENOMEM;
}
vol->vcache.by_loc = calloc(sizeof(struct vache_entry *), vol->vcache.cache_size);
vol->vcache.by_loc = calloc(sizeof(struct vache_entry *),
vol->vcache.cache_size);
if (vol->vcache.by_loc == NULL) {
dprintf("init_vcache: out of core\n");
free(vol->vcache.by_vnid);
@@ -107,13 +118,10 @@ status_t init_vcache(nspace *vol)
}
sprintf(name, "fat cache %lx", vol->id);
if ((vol->vcache.vc_sem = create_sem(READERS, name)) < 0) {
free(vol->vcache.by_vnid); vol->vcache.by_vnid = NULL;
free(vol->vcache.by_loc); vol->vcache.by_loc = NULL;
return vol->vcache.vc_sem;
}
rw_lock_init(&vol->vcache.lock, "fat cache");
DPRINTF(0, ("init_vcache: initialized vnid cache with %lx entries\n", vol->vcache.cache_size));
DPRINTF(0, ("init_vcache: initialized vnid cache with %lx entries\n",
vol->vcache.cache_size));
return 0;
}
@@ -129,7 +137,7 @@ uninit_vcache(nspace *vol)
LOCK_CACHE_W;
/* free entries */
for (i=0;i<vol->vcache.cache_size;i++) {
for (i = 0; i < vol->vcache.cache_size; i++) {
c = vol->vcache.by_vnid[i];
while (c) {
count++;
@@ -144,9 +152,8 @@ uninit_vcache(nspace *vol)
free(vol->vcache.by_vnid); vol->vcache.by_vnid = NULL;
free(vol->vcache.by_loc); vol->vcache.by_loc = NULL;
delete_sem(vol->vcache.vc_sem);
return 0;
rw_lock_destroy(&vol->vcache.lock);
return B_OK;
}
@@ -5,6 +5,10 @@
#ifndef _DOSFS_VCACHE_H_
#define _DOSFS_VCACHE_H_
#include "dosfs.h"
void dump_vcache(nspace *vol);
status_t init_vcache(nspace *vol);