tentative at using file_cache API in iso9660, untested

minor cleanup in TRACE()


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@18474 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Jérôme Duval
2006-08-10 11:41:55 +00:00
parent deaaaa06f5
commit 5b4cb10932
3 changed files with 137 additions and 15 deletions
@@ -537,6 +537,8 @@ InitNode(vnode *rec, char *buffer, int *_bytesRead, uint8 joliet_level)
TRACE(("InitNode - ENTER, bufstart is %p, record length is %d bytes\n", buffer, recLen));
rec->cache = NULL;
if (recLen > 0) {
rec->extAttrRecLen = *(uint8 *)buffer++;
@@ -89,6 +89,7 @@ typedef struct vnode
/* Most drivers will probably want the first things defined here. */
vnode_id id;
vnode_id parID; // parent vnode ID.
void *cache; // for file cache
// End of members other drivers will definitely want.
@@ -57,6 +57,8 @@ static status_t fs_walk(void *_ns, void *_base, const char *file,
static status_t fs_read_vnode(void *_ns, vnode_id vnid, void **node, bool reenter);
static status_t fs_release_vnode(void *_ns, void *_node, bool reenter);
static status_t fs_get_file_map(fs_volume _fs, fs_vnode _node, off_t offset, size_t size,
struct file_io_vec *vecs, size_t *_count);
static status_t fs_read_stat(void *_ns, void *_node, struct stat *st);
static status_t fs_open(void *_ns, void *_node, int omode, void **cookie);
static status_t fs_read(void *_ns, void *_node, void *cookie, off_t pos,
@@ -236,7 +238,7 @@ fs_read_fs_stat(void *_ns, struct fs_info *fss)
nspace *ns = (nspace *)_ns;
int i;
TRACE(("fs_rfsstat - ENTER\n"));
TRACE(("fs_read_fs_stat - ENTER\n"));
// Fill in device id.
//fss->dev = ns->fd;
@@ -275,7 +277,7 @@ fs_read_fs_stat(void *_ns, struct fs_info *fss)
// File system name
strcpy(fss->fsh_name, "iso9660");
TRACE(("fs_rfsstat - EXIT\n"));
TRACE(("fs_read_fs_stat - EXIT\n"));
return 0;
}
@@ -457,6 +459,10 @@ fs_read_vnode(void *_ns, vnode_id vnid, void **node, bool reenter)
} else
result = ENOMEM;
if (result == B_OK && !(newNode->flags & ISO_ISDIR)) {
newNode->cache = file_cache_create(ns->id, vnid, newNode->dataLen[FS_DATA_FORMAT], ns->fdOfSession);
}
TRACE(("fs_read_vnode - EXIT, result is %s\n", strerror(result)));
return result;
}
@@ -471,7 +477,7 @@ fs_release_vnode(void *ns, void *_node, bool reenter)
(void)ns;
(void)reenter;
TRACE(("fs_write_vnode - ENTER (0x%x)\n", node));
TRACE(("fs_release_vnode - ENTER (0x%x)\n", node));
if (node != NULL) {
if (node->id != ISO_ROOTNODE_ID) {
@@ -479,16 +485,113 @@ fs_release_vnode(void *ns, void *_node, bool reenter)
free (node->fileIDString);
if (node->attr.slName != NULL)
free (node->attr.slName);
if (node->cache != NULL)
file_cache_delete(node->cache);
free(node);
}
}
TRACE(("fs_write_vnode - EXIT\n"));
TRACE(("fs_release_vnode - EXIT\n"));
return result;
}
static status_t
fs_get_file_map(fs_volume _fs, fs_vnode _node, off_t pos, size_t reqLen,
struct file_io_vec *vecs, size_t *_count)
{
nspace *ns = (nspace *)_fs; // global stuff
vnode *node = (vnode *)_node; // The read file vnode.
uint16 blockSize = ns->logicalBlkSize[FS_DATA_FORMAT];
uint32 startBlock = node->startLBN[FS_DATA_FORMAT] + (pos / blockSize);
off_t blockPos = pos % blockSize;
off_t numBlocks = 0;
uint32 dataLen = node->dataLen[FS_DATA_FORMAT];
size_t endLen = 0;
size_t startLen = 0;
size_t index = 0, max = *_count;
TRACE(("fs_get_file_map - ENTER (0x%x)\n", node));
// Allow an open to work on a dir, but no reads
if (node->flags & ISO_ISDIR)
return EISDIR;
if (pos < 0)
pos = 0;
*_count = 0;
// If passed-in requested length is bigger than file size, change it to
// file size.
if (reqLen + pos > dataLen)
reqLen = dataLen - pos;
// Compute the length of the partial start-block read, if any.
if (reqLen + blockPos <= blockSize)
startLen = reqLen;
else if (blockPos > 0)
startLen = blockSize - blockPos;
if (blockPos == 0 && reqLen >= blockSize) {
TRACE(("Setting startLen to 0\n"));
startLen = 0;
}
// Compute the length of the partial end-block read, if any.
if (reqLen + blockPos > blockSize)
endLen = (reqLen + blockPos) % blockSize;
// Compute the number of middle blocks to read.
numBlocks = ((reqLen - endLen - startLen) / blockSize);
if (pos >= dataLen) {
// If pos >= file length, return
return B_OK;
}
// Read in the first, potentially partial, block.
if (startLen > 0) {
vecs[index].offset = startBlock * blockSize + blockPos;
vecs[index].length = startLen;
startBlock++;
index++;
if (index >= max) {
// we're out of file_io_vecs; let's bail out
*_count = index;
return B_BUFFER_OVERFLOW;
}
}
// Read in the middle blocks.
if (numBlocks > 0) {
for (int32 i=startBlock; i<startBlock+numBlocks; i++) {
vecs[index].offset = i * blockSize;
vecs[index].length = blockSize;
index++;
if (index >= max) {
// we're out of file_io_vecs; let's bail out
*_count = index;
return B_BUFFER_OVERFLOW;
}
}
}
// Read in the last partial block.
if (endLen > 0) {
off_t endBlock = startBlock + numBlocks;
vecs[index].offset = endBlock * blockSize;
vecs[index].length = endLen;
index++;
}
*_count = index;
TRACE(("fs_get_file_map - EXIT\n"));
return B_OK;
}
static status_t
fs_read_stat(void *_ns, void *_node, struct stat *st)
{
@@ -539,6 +642,7 @@ fs_open(void *_ns, void *_node, int omode, void **cookie)
static status_t
fs_read(void *_ns, void *_node, void *cookie, off_t pos, void *buf, size_t *len)
{
#if 0
nspace *ns = (nspace *)_ns; // global stuff
vnode *node = (vnode *)_node; // The read file vnode.
uint16 blockSize = ns->logicalBlkSize[FS_DATA_FORMAT];
@@ -644,6 +748,21 @@ fs_read(void *_ns, void *_node, void *cookie, off_t pos, void *buf, size_t *len)
TRACE(("fs_read - EXIT, result is %s\n", strerror(result)));
return result;
#else
vnode *node = (vnode *)_node; // The read file vnode.
uint32 dataLen = node->dataLen[FS_DATA_FORMAT];
// set/check boundaries for pos/length
if (pos < 0) {
return B_BAD_VALUE;
}
if (pos >= dataLen) {
// If pos >= file length, return length of 0.
*len = 0;
return B_OK;
}
return file_cache_read(node->cache, pos, buf, len);
#endif
}
@@ -722,7 +841,7 @@ fs_open_dir(void *_ns, void *_node, void **cookie)
(void)_ns;
TRACE(("fs_opendir - ENTER, node is 0x%x\n", _node));
TRACE(("fs_open_dir - ENTER, node is 0x%x\n", _node));
if (!(node->flags & ISO_ISDIR))
result = EMFILE;
@@ -737,7 +856,7 @@ fs_open_dir(void *_ns, void *_node, void **cookie)
} else
result = ENOMEM;
TRACE(("fs_opendir - EXIT\n"));
TRACE(("fs_open_dir - EXIT\n"));
return result;
}
@@ -752,7 +871,7 @@ fs_read_dir(void *_ns, void *_node, void *_cookie, struct dirent *buffer,
(void)_node;
TRACE(("fs_readdir - ENTER\n"));
TRACE(("fs_read_dir - ENTER\n"));
result = ISOReadDirEnt(ns, dirCookie, buffer, bufferSize);
@@ -768,7 +887,7 @@ fs_read_dir(void *_ns, void *_node, void *_cookie, struct dirent *buffer,
if (result == ENOENT)
result = B_NO_ERROR;
TRACE(("fs_readdir - EXIT, result is %s\n", strerror(result)));
TRACE(("fs_read_dir - EXIT, result is %s\n", strerror(result)));
return result;
}
@@ -782,13 +901,13 @@ fs_rewind_dir(void *ns, void *node, void* _cookie)
(void)ns;
(void)node;
//dprintf("fs_rewinddir - ENTER\n");
//dprintf("fs_rewind_dir - ENTER\n");
if (cookie != NULL) {
cookie->block = cookie->startBlock;
cookie->pos = 0;
result = B_NO_ERROR;
}
//dprintf("fs_rewinddir - EXIT, result is %s\n", strerror(result));
//dprintf("fs_rewind_dir - EXIT, result is %s\n", strerror(result));
return result;
}
@@ -803,8 +922,8 @@ fs_close_dir(void *ns, void *node, void *cookie)
// ns - global, fs-specific struct for device
// node - directory to close
// cookie - current cookie for directory.
//dprintf("fs_closedir - ENTER\n");
//dprintf("fs_closedir - EXIT\n");
//dprintf("fs_close_dir - ENTER\n");
//dprintf("fs_close_dir - EXIT\n");
return B_OK;
}
@@ -818,11 +937,11 @@ fs_free_dir_cookie(void *ns, void *node, void *cookie)
// ns - global, fs-specific struct for device
// node - directory related to cookie
// cookie - current cookie for directory, to free.
//dprintf("fs_free_dircookie - ENTER\n");
//dprintf("fs_free_dir_cookie - ENTER\n");
if (cookie != NULL)
free(cookie);
//dprintf("fs_free_dircookie - EXIT\n");
//dprintf("fs_free_dir_cookie - EXIT\n");
return B_OK;
}
@@ -876,7 +995,7 @@ static file_system_module_info sISO660FileSystem = {
NULL, // &fs_read_pages
NULL, // &fs_write_pages
NULL, // &fs_get_file_map
&fs_get_file_map,
NULL, // &fs_ioctl
NULL, // &fs_set_flags