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:
@@ -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));
|
TRACE(("InitNode - ENTER, bufstart is %p, record length is %d bytes\n", buffer, recLen));
|
||||||
|
|
||||||
|
rec->cache = NULL;
|
||||||
|
|
||||||
if (recLen > 0) {
|
if (recLen > 0) {
|
||||||
rec->extAttrRecLen = *(uint8 *)buffer++;
|
rec->extAttrRecLen = *(uint8 *)buffer++;
|
||||||
|
|
||||||
|
|||||||
@@ -89,6 +89,7 @@ typedef struct vnode
|
|||||||
/* Most drivers will probably want the first things defined here. */
|
/* Most drivers will probably want the first things defined here. */
|
||||||
vnode_id id;
|
vnode_id id;
|
||||||
vnode_id parID; // parent vnode ID.
|
vnode_id parID; // parent vnode ID.
|
||||||
|
void *cache; // for file cache
|
||||||
|
|
||||||
// End of members other drivers will definitely want.
|
// 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_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_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_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_open(void *_ns, void *_node, int omode, void **cookie);
|
||||||
static status_t fs_read(void *_ns, void *_node, void *cookie, off_t pos,
|
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;
|
nspace *ns = (nspace *)_ns;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
TRACE(("fs_rfsstat - ENTER\n"));
|
TRACE(("fs_read_fs_stat - ENTER\n"));
|
||||||
|
|
||||||
// Fill in device id.
|
// Fill in device id.
|
||||||
//fss->dev = ns->fd;
|
//fss->dev = ns->fd;
|
||||||
@@ -275,7 +277,7 @@ fs_read_fs_stat(void *_ns, struct fs_info *fss)
|
|||||||
// File system name
|
// File system name
|
||||||
strcpy(fss->fsh_name, "iso9660");
|
strcpy(fss->fsh_name, "iso9660");
|
||||||
|
|
||||||
TRACE(("fs_rfsstat - EXIT\n"));
|
TRACE(("fs_read_fs_stat - EXIT\n"));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -457,6 +459,10 @@ fs_read_vnode(void *_ns, vnode_id vnid, void **node, bool reenter)
|
|||||||
} else
|
} else
|
||||||
result = ENOMEM;
|
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)));
|
TRACE(("fs_read_vnode - EXIT, result is %s\n", strerror(result)));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -471,7 +477,7 @@ fs_release_vnode(void *ns, void *_node, bool reenter)
|
|||||||
(void)ns;
|
(void)ns;
|
||||||
(void)reenter;
|
(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 != NULL) {
|
||||||
if (node->id != ISO_ROOTNODE_ID) {
|
if (node->id != ISO_ROOTNODE_ID) {
|
||||||
@@ -479,16 +485,113 @@ fs_release_vnode(void *ns, void *_node, bool reenter)
|
|||||||
free (node->fileIDString);
|
free (node->fileIDString);
|
||||||
if (node->attr.slName != NULL)
|
if (node->attr.slName != NULL)
|
||||||
free (node->attr.slName);
|
free (node->attr.slName);
|
||||||
|
if (node->cache != NULL)
|
||||||
|
file_cache_delete(node->cache);
|
||||||
|
|
||||||
free(node);
|
free(node);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE(("fs_write_vnode - EXIT\n"));
|
TRACE(("fs_release_vnode - EXIT\n"));
|
||||||
return result;
|
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
|
static status_t
|
||||||
fs_read_stat(void *_ns, void *_node, struct stat *st)
|
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
|
static status_t
|
||||||
fs_read(void *_ns, void *_node, void *cookie, off_t pos, void *buf, size_t *len)
|
fs_read(void *_ns, void *_node, void *cookie, off_t pos, void *buf, size_t *len)
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
nspace *ns = (nspace *)_ns; // global stuff
|
nspace *ns = (nspace *)_ns; // global stuff
|
||||||
vnode *node = (vnode *)_node; // The read file vnode.
|
vnode *node = (vnode *)_node; // The read file vnode.
|
||||||
uint16 blockSize = ns->logicalBlkSize[FS_DATA_FORMAT];
|
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)));
|
TRACE(("fs_read - EXIT, result is %s\n", strerror(result)));
|
||||||
return 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;
|
(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))
|
if (!(node->flags & ISO_ISDIR))
|
||||||
result = EMFILE;
|
result = EMFILE;
|
||||||
@@ -737,7 +856,7 @@ fs_open_dir(void *_ns, void *_node, void **cookie)
|
|||||||
} else
|
} else
|
||||||
result = ENOMEM;
|
result = ENOMEM;
|
||||||
|
|
||||||
TRACE(("fs_opendir - EXIT\n"));
|
TRACE(("fs_open_dir - EXIT\n"));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -752,7 +871,7 @@ fs_read_dir(void *_ns, void *_node, void *_cookie, struct dirent *buffer,
|
|||||||
|
|
||||||
(void)_node;
|
(void)_node;
|
||||||
|
|
||||||
TRACE(("fs_readdir - ENTER\n"));
|
TRACE(("fs_read_dir - ENTER\n"));
|
||||||
|
|
||||||
result = ISOReadDirEnt(ns, dirCookie, buffer, bufferSize);
|
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)
|
if (result == ENOENT)
|
||||||
result = B_NO_ERROR;
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -782,13 +901,13 @@ fs_rewind_dir(void *ns, void *node, void* _cookie)
|
|||||||
(void)ns;
|
(void)ns;
|
||||||
(void)node;
|
(void)node;
|
||||||
|
|
||||||
//dprintf("fs_rewinddir - ENTER\n");
|
//dprintf("fs_rewind_dir - ENTER\n");
|
||||||
if (cookie != NULL) {
|
if (cookie != NULL) {
|
||||||
cookie->block = cookie->startBlock;
|
cookie->block = cookie->startBlock;
|
||||||
cookie->pos = 0;
|
cookie->pos = 0;
|
||||||
result = B_NO_ERROR;
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -803,8 +922,8 @@ fs_close_dir(void *ns, void *node, void *cookie)
|
|||||||
// ns - global, fs-specific struct for device
|
// ns - global, fs-specific struct for device
|
||||||
// node - directory to close
|
// node - directory to close
|
||||||
// cookie - current cookie for directory.
|
// cookie - current cookie for directory.
|
||||||
//dprintf("fs_closedir - ENTER\n");
|
//dprintf("fs_close_dir - ENTER\n");
|
||||||
//dprintf("fs_closedir - EXIT\n");
|
//dprintf("fs_close_dir - EXIT\n");
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -818,11 +937,11 @@ fs_free_dir_cookie(void *ns, void *node, void *cookie)
|
|||||||
// ns - global, fs-specific struct for device
|
// ns - global, fs-specific struct for device
|
||||||
// node - directory related to cookie
|
// node - directory related to cookie
|
||||||
// cookie - current cookie for directory, to free.
|
// cookie - current cookie for directory, to free.
|
||||||
//dprintf("fs_free_dircookie - ENTER\n");
|
//dprintf("fs_free_dir_cookie - ENTER\n");
|
||||||
if (cookie != NULL)
|
if (cookie != NULL)
|
||||||
free(cookie);
|
free(cookie);
|
||||||
|
|
||||||
//dprintf("fs_free_dircookie - EXIT\n");
|
//dprintf("fs_free_dir_cookie - EXIT\n");
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -876,7 +995,7 @@ static file_system_module_info sISO660FileSystem = {
|
|||||||
NULL, // &fs_read_pages
|
NULL, // &fs_read_pages
|
||||||
NULL, // &fs_write_pages
|
NULL, // &fs_write_pages
|
||||||
|
|
||||||
NULL, // &fs_get_file_map
|
&fs_get_file_map,
|
||||||
|
|
||||||
NULL, // &fs_ioctl
|
NULL, // &fs_ioctl
|
||||||
NULL, // &fs_set_flags
|
NULL, // &fs_set_flags
|
||||||
|
|||||||
Reference in New Issue
Block a user