* Ported the FAT filesystem to the recent filesystem interface changes which
was, thanks to the detailed instructions from Ingo, quite doable. * Ported the (deprecated and now publically removed) notify_listener() calls to the respective new notify_* calls. * Fixed debug build. * Added the FAT filesystem back to the image. I only tested the filesystem briefly and everything seemed to work as expected (mounted the FAT part of my bootable Haiku memory stick, opened a few files and copied something to it). At least it should not be any more broken than before the interface changes ;-). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24987 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -134,8 +134,8 @@ BEOS_ADD_ONS_DRIVERS_NET = $(X86_ONLY)3com etherpci $(X86_ONLY)ipro1000
|
|||||||
BEOS_ADD_ONS_BUS_MANAGERS = pci $(X86_ONLY)ps2 $(X86_ONLY)isa ide scsi
|
BEOS_ADD_ONS_BUS_MANAGERS = pci $(X86_ONLY)ps2 $(X86_ONLY)isa ide scsi
|
||||||
config_manager agp_gart usb firewire
|
config_manager agp_gart usb firewire
|
||||||
;
|
;
|
||||||
BEOS_ADD_ONS_FILE_SYSTEMS = bfs ;
|
BEOS_ADD_ONS_FILE_SYSTEMS = bfs fat ;
|
||||||
#cdda fat googlefs iso9660 nfs $(GPL_ONLY)ntfs ;
|
#cdda googlefs iso9660 nfs $(GPL_ONLY)ntfs ;
|
||||||
|
|
||||||
|
|
||||||
# modules
|
# modules
|
||||||
|
|||||||
@@ -57,9 +57,9 @@ status_t set_mime_type(vnode *node, const char *filename)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_open_attrdir(void *_vol, void *_node, void **_cookie)
|
dosfs_open_attrdir(fs_volume *_vol, fs_vnode *_node, void **_cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
|
|
||||||
TOUCH(_node);
|
TOUCH(_node);
|
||||||
|
|
||||||
@@ -84,9 +84,9 @@ dosfs_open_attrdir(void *_vol, void *_node, void **_cookie)
|
|||||||
}
|
}
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_close_attrdir(void *_vol, void *_node, void *_cookie)
|
dosfs_close_attrdir(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
|
|
||||||
TOUCH(_node);
|
TOUCH(_node);
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ dosfs_close_attrdir(void *_vol, void *_node, void *_cookie)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_free_attrdir_cookie(void *_vol, void *_node, void *_cookie)
|
dosfs_free_attrdir_cookie(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
||||||
{
|
{
|
||||||
TOUCH(_vol); TOUCH(_node);
|
TOUCH(_vol); TOUCH(_node);
|
||||||
|
|
||||||
@@ -127,7 +127,7 @@ dosfs_free_attrdir_cookie(void *_vol, void *_node, void *_cookie)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_rewind_attrdir(void *_vol, void *_node, void *_cookie)
|
dosfs_rewind_attrdir(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
||||||
{
|
{
|
||||||
TOUCH(_vol); TOUCH(_node);
|
TOUCH(_vol); TOUCH(_node);
|
||||||
|
|
||||||
@@ -144,11 +144,11 @@ dosfs_rewind_attrdir(void *_vol, void *_node, void *_cookie)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_read_attrdir(void *_vol, void *_node, void *_cookie,
|
dosfs_read_attrdir(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
struct dirent *entry, size_t bufsize, uint32 *num)
|
struct dirent *entry, size_t bufsize, uint32 *num)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
int32 *cookie = (int32 *)_cookie;
|
int32 *cookie = (int32 *)_cookie;
|
||||||
|
|
||||||
TOUCH(bufsize);
|
TOUCH(bufsize);
|
||||||
@@ -183,11 +183,11 @@ dosfs_read_attrdir(void *_vol, void *_node, void *_cookie,
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_open_attr(void *_vol, void *_node, const char *name, int openMode,
|
dosfs_open_attr(fs_volume *_vol, fs_vnode *_node, const char *name,
|
||||||
fs_cookie *_cookie)
|
int openMode, void **_cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
|
|
||||||
if (strcmp(name, "BEOS:TYPE"))
|
if (strcmp(name, "BEOS:TYPE"))
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
@@ -207,24 +207,25 @@ dosfs_open_attr(void *_vol, void *_node, const char *name, int openMode,
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_close_attr(void *_vol, void *_node, fs_cookie cookie)
|
dosfs_close_attr(fs_volume *_vol, fs_vnode *_node, void *cookie)
|
||||||
{
|
{
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_free_attr_cookie(void *_vol, void *_node, fs_cookie cookie)
|
dosfs_free_attr_cookie(fs_volume *_vol, fs_vnode *_node, void *cookie)
|
||||||
{
|
{
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_read_attr_stat(void *_vol, void *_node, fs_cookie _cookie, struct stat *stat)
|
dosfs_read_attr_stat(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
|
struct stat *stat)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
|
|
||||||
DPRINTF(0, ("dosfs_read_attr_stat\n"));
|
DPRINTF(0, ("dosfs_read_attr_stat\n"));
|
||||||
|
|
||||||
@@ -253,11 +254,11 @@ dosfs_read_attr_stat(void *_vol, void *_node, fs_cookie _cookie, struct stat *st
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_read_attr(void *_vol, void *_node, fs_cookie _cookie, off_t pos,
|
dosfs_read_attr(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
||||||
void *buffer, size_t *_length)
|
void *buffer, size_t *_length)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
|
|
||||||
DPRINTF(0, ("dosfs_read_attr\n"));
|
DPRINTF(0, ("dosfs_read_attr\n"));
|
||||||
|
|
||||||
@@ -293,8 +294,8 @@ dosfs_read_attr(void *_vol, void *_node, fs_cookie _cookie, off_t pos,
|
|||||||
// suck up application attempts to set mime types; this hides an unsightly
|
// suck up application attempts to set mime types; this hides an unsightly
|
||||||
// error message printed out by zip
|
// error message printed out by zip
|
||||||
status_t
|
status_t
|
||||||
dosfs_write_attr(void *_vol, void *_node, fs_cookie _cookie, off_t pos,
|
dosfs_write_attr(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
const void *buffer, size_t *_length)
|
off_t pos, const void *buffer, size_t *_length)
|
||||||
{
|
{
|
||||||
DPRINTF(0, ("dosfs_write_attr\n"));
|
DPRINTF(0, ("dosfs_write_attr\n"));
|
||||||
|
|
||||||
|
|||||||
@@ -9,20 +9,22 @@
|
|||||||
|
|
||||||
status_t set_mime_type(vnode *node, const char *filename);
|
status_t set_mime_type(vnode *node, const char *filename);
|
||||||
|
|
||||||
status_t dosfs_open_attrdir(void *_vol, void *_node, void **_cookie);
|
status_t dosfs_open_attrdir(fs_volume *_vol, fs_vnode *_node, void **_cookie);
|
||||||
status_t dosfs_close_attrdir(void *_vol, void *_node, void *_cookie);
|
status_t dosfs_close_attrdir(fs_volume *_vol, fs_vnode *_node, void *_cookie);
|
||||||
status_t dosfs_free_attrdir_cookie(void *_vol, void *_node, void *_cookie);
|
status_t dosfs_free_attrdir_cookie(fs_volume *_vol, fs_vnode *_node,
|
||||||
status_t dosfs_rewind_attrdir(void *_vol, void *_node, void *_cookie);
|
void *_cookie);
|
||||||
status_t dosfs_read_attrdir(void *_vol, void *_node, void *_cookie,
|
status_t dosfs_rewind_attrdir(fs_volume *_vol, fs_vnode *_node, void *_cookie);
|
||||||
|
status_t dosfs_read_attrdir(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
struct dirent *buf, size_t bufsize, uint32 *num);
|
struct dirent *buf, size_t bufsize, uint32 *num);
|
||||||
status_t dosfs_open_attr(void *_vol, void *_node, const char *name, int openMode,
|
status_t dosfs_open_attr(fs_volume *_vol, fs_vnode *_node, const char *name,
|
||||||
fs_cookie *_cookie);
|
int openMode, void **_cookie);
|
||||||
status_t dosfs_close_attr(void *_vol, void *_node, fs_cookie cookie);
|
status_t dosfs_close_attr(fs_volume *_vol, fs_vnode *_node, void *cookie);
|
||||||
status_t dosfs_free_attr_cookie(void *_vol, void *_node, fs_cookie cookie);
|
status_t dosfs_free_attr_cookie(fs_volume *_vol, fs_vnode *_node, void *cookie);
|
||||||
status_t dosfs_read_attr_stat(void *_vol, void *_node, fs_cookie _cookie, struct stat *stat);
|
status_t dosfs_read_attr_stat(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
status_t dosfs_read_attr(void *_vol, void *_node, fs_cookie _cookie, off_t pos,
|
struct stat *stat);
|
||||||
void *buffer, size_t *_length);
|
status_t dosfs_read_attr(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
status_t dosfs_write_attr(void *_vol, void *_node, fs_cookie _cookie, off_t pos,
|
off_t pos, void *buffer, size_t *_length);
|
||||||
const void *buffer, size_t *_length);
|
status_t dosfs_write_attr(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
|
off_t pos, const void *buffer, size_t *_length);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include "fat.h"
|
#include "fat.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
#include "vcache.h"
|
#include "vcache.h"
|
||||||
|
#include "file.h"
|
||||||
|
|
||||||
#include "encodings.h"
|
#include "encodings.h"
|
||||||
|
|
||||||
@@ -432,7 +433,7 @@ findfile(nspace *vol, vnode *dir, const char *file, ino_t *vnid,
|
|||||||
if (vnid)
|
if (vnid)
|
||||||
*vnid = found_vnid;
|
*vnid = found_vnid;
|
||||||
if (node)
|
if (node)
|
||||||
result = get_vnode(vol->id, found_vnid, (void **)node);
|
result = get_vnode(vol->volume, found_vnid, (void **)node);
|
||||||
result = B_OK;
|
result = B_OK;
|
||||||
} else {
|
} else {
|
||||||
result = ENOENT;
|
result = ENOENT;
|
||||||
@@ -922,9 +923,10 @@ create_dir_entry(nspace *vol, vnode *dir, vnode *node, const char *name,
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_read_vnode(void *_vol, ino_t vnid, void **_node, bool reenter)
|
dosfs_read_vnode(fs_volume *_vol, ino_t vnid, fs_vnode *_node, int *_type,
|
||||||
|
uint32 *_flags, bool reenter)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace*)_vol;
|
nspace *vol = (nspace*)_vol->private_volume;
|
||||||
int result = B_NO_ERROR;
|
int result = B_NO_ERROR;
|
||||||
ino_t loc, dir_vnid;
|
ino_t loc, dir_vnid;
|
||||||
vnode *entry;
|
vnode *entry;
|
||||||
@@ -936,7 +938,9 @@ dosfs_read_vnode(void *_vol, ino_t vnid, void **_node, bool reenter)
|
|||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
}
|
}
|
||||||
|
|
||||||
*_node = NULL;
|
_node->private_node = NULL;
|
||||||
|
_node->ops = &gFATVnodeOps;
|
||||||
|
_flags = 0;
|
||||||
|
|
||||||
if (check_nspace_magic(vol, "dosfs_read_vnode")) {
|
if (check_nspace_magic(vol, "dosfs_read_vnode")) {
|
||||||
if (!reenter) UNLOCK_VOL(vol);
|
if (!reenter) UNLOCK_VOL(vol);
|
||||||
@@ -947,7 +951,8 @@ dosfs_read_vnode(void *_vol, ino_t vnid, void **_node, bool reenter)
|
|||||||
|
|
||||||
if (vnid == vol->root_vnode.vnid) {
|
if (vnid == vol->root_vnode.vnid) {
|
||||||
dprintf("??? dosfs_read_vnode called on root node ???\n");
|
dprintf("??? dosfs_read_vnode called on root node ???\n");
|
||||||
*_node = (void *)&(vol->root_vnode);
|
_node->private_node = (void *)&(vol->root_vnode);
|
||||||
|
*_type = make_mode(vol, &vol->root_vnode);
|
||||||
goto bi;
|
goto bi;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1043,7 +1048,8 @@ dosfs_read_vnode(void *_vol, ino_t vnid, void **_node, bool reenter)
|
|||||||
if (!(entry->mode & FAT_SUBDIR))
|
if (!(entry->mode & FAT_SUBDIR))
|
||||||
set_mime_type(entry, filename);
|
set_mime_type(entry, filename);
|
||||||
|
|
||||||
*_node = entry;
|
_node->private_node = entry;
|
||||||
|
*_type = make_mode(vol, entry);
|
||||||
|
|
||||||
bi2:
|
bi2:
|
||||||
diri_free(&iter);
|
diri_free(&iter);
|
||||||
@@ -1059,12 +1065,12 @@ bi:
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_walk(void *_vol, void *_dir, const char *file, ino_t *_vnid, int *_type)
|
dosfs_walk(fs_volume *_vol, fs_vnode *_dir, const char *file, ino_t *_vnid)
|
||||||
{
|
{
|
||||||
/* Starting at the base, find file in the subdir, and return path
|
/* Starting at the base, find file in the subdir, and return path
|
||||||
string and vnode id of file. */
|
string and vnode id of file. */
|
||||||
nspace *vol = (nspace*)_vol;
|
nspace *vol = (nspace*)_vol->private_volume;
|
||||||
vnode *dir = (vnode*)_dir;
|
vnode *dir = (vnode*)_dir->private_node;
|
||||||
vnode *vnode = NULL;
|
vnode *vnode = NULL;
|
||||||
status_t result = ENOENT;
|
status_t result = ENOENT;
|
||||||
|
|
||||||
@@ -1092,11 +1098,11 @@ dosfs_walk(void *_vol, void *_dir, const char *file, ino_t *_vnid, int *_type)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_access(void *_vol, void *_node, int mode)
|
dosfs_access(fs_volume *_vol, fs_vnode *_node, int mode)
|
||||||
{
|
{
|
||||||
status_t result = B_OK;
|
status_t result = B_OK;
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
@@ -1128,7 +1134,7 @@ dosfs_access(void *_vol, void *_node, int mode)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_readlink(void *_vol, void *_node, char *buf, size_t *bufsize)
|
dosfs_readlink(fs_volume *_vol, fs_vnode *_node, char *buf, size_t *bufsize)
|
||||||
{
|
{
|
||||||
TOUCH(_vol); TOUCH(_node); TOUCH(buf); TOUCH(bufsize);
|
TOUCH(_vol); TOUCH(_node); TOUCH(buf); TOUCH(bufsize);
|
||||||
|
|
||||||
@@ -1140,10 +1146,10 @@ dosfs_readlink(void *_vol, void *_node, char *buf, size_t *bufsize)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_opendir(void *_vol, void *_node, void **_cookie)
|
dosfs_opendir(fs_volume *_vol, fs_vnode *_node, void **_cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace*)_vol;
|
nspace *vol = (nspace*)_vol->private_volume;
|
||||||
vnode *node = (vnode*)_node;
|
vnode *node = (vnode*)_node->private_node;
|
||||||
dircookie *cookie = NULL;
|
dircookie *cookie = NULL;
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
@@ -1198,12 +1204,12 @@ bi:
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_readdir(void *_vol, void *_dir, void *_cookie,
|
dosfs_readdir(fs_volume *_vol, fs_vnode *_dir, void *_cookie,
|
||||||
struct dirent *entry, size_t bufsize, uint32 *num)
|
struct dirent *entry, size_t bufsize, uint32 *num)
|
||||||
{
|
{
|
||||||
int result = ENOENT;
|
int result = ENOENT;
|
||||||
nspace* vol = (nspace*)_vol;
|
nspace* vol = (nspace*)_vol->private_volume;
|
||||||
vnode *dir = (vnode *)_dir;
|
vnode *dir = (vnode *)_dir->private_node;
|
||||||
dircookie* cookie = (dircookie*)_cookie;
|
dircookie* cookie = (dircookie*)_cookie;
|
||||||
struct diri diri;
|
struct diri diri;
|
||||||
|
|
||||||
@@ -1279,10 +1285,10 @@ bi:
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_rewinddir(void *_vol, void *_node, void* _cookie)
|
dosfs_rewinddir(fs_volume *_vol, fs_vnode *_node, void* _cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = _vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = _node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
dircookie *cookie = (dircookie*)_cookie;
|
dircookie *cookie = (dircookie*)_cookie;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
@@ -1305,7 +1311,7 @@ dosfs_rewinddir(void *_vol, void *_node, void* _cookie)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_closedir(void *_vol, void *_node, void *_cookie)
|
dosfs_closedir(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
||||||
{
|
{
|
||||||
TOUCH(_vol); TOUCH(_node); TOUCH(_cookie);
|
TOUCH(_vol); TOUCH(_node); TOUCH(_cookie);
|
||||||
|
|
||||||
@@ -1316,15 +1322,16 @@ dosfs_closedir(void *_vol, void *_node, void *_cookie)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_free_dircookie(void *_vol, void *node, void *_cookie)
|
dosfs_free_dircookie(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = _vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
|
vnode *node = (vnode *)_node->private_node;
|
||||||
dircookie *cookie = _cookie;
|
dircookie *cookie = _cookie;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
if (check_nspace_magic(vol, "dosfs_free_dircookie")
|
if (check_nspace_magic(vol, "dosfs_free_dircookie")
|
||||||
|| check_vnode_magic((vnode *)node, "dosfs_free_dircookie")
|
|| check_vnode_magic(node, "dosfs_free_dircookie")
|
||||||
|| check_dircookie_magic((dircookie *)cookie, "dosfs_free_dircookie")) {
|
|| check_dircookie_magic((dircookie *)cookie, "dosfs_free_dircookie")) {
|
||||||
UNLOCK_VOL(vol);
|
UNLOCK_VOL(vol);
|
||||||
return EINVAL;
|
return EINVAL;
|
||||||
@@ -1336,7 +1343,7 @@ dosfs_free_dircookie(void *_vol, void *node, void *_cookie)
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(0, ("dosfs_free_dircookie (vnode id %Lx)\n", ((vnode*)node)->vnid));
|
DPRINTF(0, ("dosfs_free_dircookie (vnode id %Lx)\n", node->vnid));
|
||||||
|
|
||||||
cookie->magic = ~DIRCOOKIE_MAGIC;
|
cookie->magic = ~DIRCOOKIE_MAGIC;
|
||||||
free(cookie);
|
free(cookie);
|
||||||
|
|||||||
@@ -21,16 +21,19 @@ status_t create_volume_label(nspace *vol, const char name[11], uint32 *index);
|
|||||||
status_t create_dir_entry(nspace *vol, vnode *dir, vnode *node,
|
status_t create_dir_entry(nspace *vol, vnode *dir, vnode *node,
|
||||||
const char *name, uint32 *ns, uint32 *ne);
|
const char *name, uint32 *ns, uint32 *ne);
|
||||||
|
|
||||||
status_t dosfs_read_vnode(void *_vol, ino_t vnid, void **node, bool reenter);
|
status_t dosfs_read_vnode(fs_volume *_vol, ino_t vnid, fs_vnode *_node,
|
||||||
status_t dosfs_walk(void *_vol, void *_dir, const char *file,
|
int *_type, uint32 *_flags, bool reenter);
|
||||||
ino_t *_vnid, int *_type);
|
status_t dosfs_walk(fs_volume *_vol, fs_vnode *_dir, const char *file,
|
||||||
status_t dosfs_access(void *_vol, void *_node, int mode);
|
ino_t *_vnid);
|
||||||
status_t dosfs_readlink(void *_vol, void *_node, char *buf, size_t *bufsize);
|
status_t dosfs_access(fs_volume *_vol, fs_vnode *_node, int mode);
|
||||||
status_t dosfs_opendir(void *_vol, void *_node, void **cookie);
|
status_t dosfs_readlink(fs_volume *_vol, fs_vnode *_node, char *buf,
|
||||||
status_t dosfs_readdir(void *_vol, void *_node, void *cookie,
|
size_t *bufsize);
|
||||||
|
status_t dosfs_opendir(fs_volume *_vol, fs_vnode *_node, void **cookie);
|
||||||
|
status_t dosfs_readdir(fs_volume *_vol, fs_vnode *_node, void *cookie,
|
||||||
struct dirent *buf, size_t bufsize, uint32 *num);
|
struct dirent *buf, size_t bufsize, uint32 *num);
|
||||||
status_t dosfs_rewinddir(void *_vol, void *_node, void *cookie);
|
status_t dosfs_rewinddir(fs_volume *_vol, fs_vnode *_node, void *cookie);
|
||||||
status_t dosfs_closedir(void *_vol, void *_node, void *cookie);
|
status_t dosfs_closedir(fs_volume *_vol, fs_vnode *_node, void *cookie);
|
||||||
status_t dosfs_free_dircookie(void *_vol, void *_node, void *cookie);
|
status_t dosfs_free_dircookie(fs_volume *_vol, fs_vnode *_node,
|
||||||
|
void *cookie);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ static status_t get_fsinfo(nspace *vol, uint32 *free_count, uint32 *last_allocat
|
|||||||
int32 instances = 0;
|
int32 instances = 0;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
debug_fat(int argc, char **argv)
|
debug_fat_nspace(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 1; i < argc; i++) {
|
for (i = 1; i < argc; i++) {
|
||||||
@@ -154,8 +154,8 @@ lock_removable_device(int fd, bool state)
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
mount_fat_disk(const char *path, dev_t nsid, const int flags, nspace** newVol,
|
mount_fat_disk(const char *path, fs_volume *_vol, const int flags,
|
||||||
int fs_flags, int op_sync_mode)
|
nspace** newVol, int fs_flags, int op_sync_mode)
|
||||||
{
|
{
|
||||||
nspace *vol = NULL;
|
nspace *vol = NULL;
|
||||||
uint8 buf[512];
|
uint8 buf[512];
|
||||||
@@ -432,7 +432,8 @@ mount_fat_disk(const char *path, dev_t nsid, const int flags, nspace** newVol,
|
|||||||
|
|
||||||
// now we are convinced of the drive's validity
|
// now we are convinced of the drive's validity
|
||||||
|
|
||||||
vol->id = nsid;
|
vol->volume = _vol;
|
||||||
|
vol->id = _vol->id;
|
||||||
strncpy(vol->device,path,256);
|
strncpy(vol->device,path,256);
|
||||||
|
|
||||||
// this will be updated later if fsinfo exists
|
// this will be updated later if fsinfo exists
|
||||||
@@ -679,11 +680,11 @@ dosfs_free_identify_partition_cookie(partition_data *partition, void *_cookie)
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
dosfs_mount(dev_t nsid, const char *device, uint32 flags,
|
dosfs_mount(fs_volume *_vol, const char *device, uint32 flags,
|
||||||
const char *args, void **_data, ino_t *_rootID)
|
const char *args, ino_t *_rootID)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
nspace *vol;
|
nspace *vol;
|
||||||
void *handle;
|
void *handle;
|
||||||
int op_sync_mode = 0;
|
int op_sync_mode = 0;
|
||||||
int fs_flags = 0;
|
int fs_flags = 0;
|
||||||
@@ -722,22 +723,20 @@ dosfs_mount(dev_t nsid, const char *device, uint32 flags,
|
|||||||
flags |= 1;
|
flags |= 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (_data == NULL) {
|
|
||||||
dprintf("dosfs_mount passed NULL data pointer\n");
|
|
||||||
return EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try and mount volume as a FAT volume
|
// Try and mount volume as a FAT volume
|
||||||
if ((result = mount_fat_disk(device, nsid, flags, &vol, fs_flags, op_sync_mode)) == B_NO_ERROR) {
|
if ((result = mount_fat_disk(device, _vol, flags, &vol, fs_flags,
|
||||||
|
op_sync_mode)) == B_NO_ERROR) {
|
||||||
char name[32];
|
char name[32];
|
||||||
|
|
||||||
if (check_nspace_magic(vol, "dosfs_mount")) return EINVAL;
|
if (check_nspace_magic(vol, "dosfs_mount")) return EINVAL;
|
||||||
|
|
||||||
*_rootID = vol->root_vnode.vnid;
|
*_rootID = vol->root_vnode.vnid;
|
||||||
*_data = (void*)vol;
|
_vol->private_volume = (void *)vol;
|
||||||
|
_vol->ops = &gFATVolumeOps;
|
||||||
|
|
||||||
// You MUST do this. Create the vnode for the root.
|
// You MUST do this. Create the vnode for the root.
|
||||||
result = publish_vnode(nsid, *_rootID, (void*)&(vol->root_vnode));
|
result = publish_vnode(_vol, *_rootID, (void*)&(vol->root_vnode),
|
||||||
|
&gFATVnodeOps, make_mode(vol, &vol->root_vnode), 0);
|
||||||
if (result != B_NO_ERROR) {
|
if (result != B_NO_ERROR) {
|
||||||
dprintf("error creating new vnode (%s)\n", strerror(result));
|
dprintf("error creating new vnode (%s)\n", strerror(result));
|
||||||
goto error;
|
goto error;
|
||||||
@@ -749,10 +748,8 @@ dosfs_mount(dev_t nsid, const char *device, uint32 flags,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
load_driver_symbols("fat");
|
|
||||||
|
|
||||||
if (atomic_add(&instances, 1) == 0) {
|
if (atomic_add(&instances, 1) == 0) {
|
||||||
add_debugger_command("fat", debug_fat, "dump a fat nspace structure");
|
add_debugger_command("fat", debug_fat_nspace, "dump a fat nspace structure");
|
||||||
add_debugger_command("dvnode", debug_dvnode, "dump a fat vnode structure");
|
add_debugger_command("dvnode", debug_dvnode, "dump a fat vnode structure");
|
||||||
add_debugger_command("dfvnid", debug_dfvnid, "find a vnid in the vnid cache");
|
add_debugger_command("dfvnid", debug_dfvnid, "find a vnid in the vnid cache");
|
||||||
add_debugger_command("dfloc", debug_dfloc, "find a loc in the vnid cache");
|
add_debugger_command("dfloc", debug_dfloc, "find a loc in the vnid cache");
|
||||||
@@ -835,11 +832,11 @@ static status_t get_fsinfo(nspace *vol, uint32 *free_count, uint32 *last_allocat
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
dosfs_unmount(void *_vol)
|
dosfs_unmount(fs_volume *_vol)
|
||||||
{
|
{
|
||||||
int result = B_NO_ERROR;
|
int result = B_NO_ERROR;
|
||||||
|
|
||||||
nspace* vol = (nspace*)_vol;
|
nspace* vol = (nspace*)_vol->private_volume;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
@@ -853,12 +850,12 @@ dosfs_unmount(void *_vol)
|
|||||||
update_fsinfo(vol);
|
update_fsinfo(vol);
|
||||||
|
|
||||||
// Unlike in BeOS, we need to put the reference to our root node ourselves
|
// Unlike in BeOS, we need to put the reference to our root node ourselves
|
||||||
put_vnode(vol->id, vol->root_vnode.vnid);
|
put_vnode(_vol, vol->root_vnode.vnid);
|
||||||
block_cache_delete(vol->fBlockCache, true);
|
block_cache_delete(vol->fBlockCache, true);
|
||||||
|
|
||||||
#if DEBUG
|
#if DEBUG
|
||||||
if (atomic_add(&instances, -1) == 1) {
|
if (atomic_add(&instances, -1) == 1) {
|
||||||
remove_debugger_command("fat", debug_fat);
|
remove_debugger_command("fat", debug_fat_nspace);
|
||||||
remove_debugger_command("dvnode", debug_dvnode);
|
remove_debugger_command("dvnode", debug_dvnode);
|
||||||
remove_debugger_command("dfvnid", debug_dfvnid);
|
remove_debugger_command("dfvnid", debug_dfvnid);
|
||||||
remove_debugger_command("dfloc", debug_dfloc);
|
remove_debugger_command("dfloc", debug_dfloc);
|
||||||
@@ -885,9 +882,9 @@ dosfs_unmount(void *_vol)
|
|||||||
|
|
||||||
// dosfs_read_fs_stat - Fill in fs_info struct for device.
|
// dosfs_read_fs_stat - Fill in fs_info struct for device.
|
||||||
static status_t
|
static status_t
|
||||||
dosfs_read_fs_stat(void *_vol, struct fs_info * fss)
|
dosfs_read_fs_stat(fs_volume *_vol, struct fs_info * fss)
|
||||||
{
|
{
|
||||||
nspace* vol = (nspace*)_vol;
|
nspace* vol = (nspace*)_vol->private_volume;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
@@ -943,10 +940,10 @@ dosfs_read_fs_stat(void *_vol, struct fs_info * fss)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
dosfs_write_fs_stat(void *_vol, const struct fs_info * fss, uint32 mask)
|
dosfs_write_fs_stat(fs_volume *_vol, const struct fs_info * fss, uint32 mask)
|
||||||
{
|
{
|
||||||
status_t result = B_ERROR;
|
status_t result = B_ERROR;
|
||||||
nspace* vol = (nspace*)_vol;
|
nspace* vol = (nspace*)_vol->private_volume;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
@@ -1039,12 +1036,12 @@ bi: UNLOCK_VOL(vol);
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
dosfs_ioctl(void *_vol, void *_node, void *cookie, ulong code,
|
dosfs_ioctl(fs_volume *_vol, fs_vnode *_node, void *cookie, ulong code,
|
||||||
void *buf, size_t len)
|
void *buf, size_t len)
|
||||||
{
|
{
|
||||||
status_t result = B_OK;
|
status_t result = B_OK;
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
|
|
||||||
TOUCH(cookie); TOUCH(buf); TOUCH(len);
|
TOUCH(cookie); TOUCH(buf); TOUCH(len);
|
||||||
|
|
||||||
@@ -1148,9 +1145,9 @@ _dosfs_sync(nspace *vol)
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
dosfs_sync(void *_vol)
|
dosfs_sync(fs_volume *_vol)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
status_t err;
|
status_t err;
|
||||||
|
|
||||||
DPRINTF(0, ("dosfs_sync called on volume %lx\n", vol->id));
|
DPRINTF(0, ("dosfs_sync called on volume %lx\n", vol->id));
|
||||||
@@ -1164,10 +1161,10 @@ dosfs_sync(void *_vol)
|
|||||||
|
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
dosfs_fsync(void *_vol, void *_node)
|
dosfs_fsync(fs_volume *_vol, fs_vnode *_node)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
status_t err = B_OK;
|
status_t err = B_OK;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
@@ -1203,32 +1200,37 @@ dos_std_ops(int32 op, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static file_system_module_info sFATFileSystem = {
|
fs_volume_ops gFATVolumeOps = {
|
||||||
{
|
|
||||||
"file_systems/fat" B_CURRENT_FS_API_VERSION,
|
|
||||||
0,
|
|
||||||
dos_std_ops,
|
|
||||||
},
|
|
||||||
|
|
||||||
"FAT32 File System",
|
|
||||||
0, // DDM flags
|
|
||||||
|
|
||||||
// scanning
|
|
||||||
dosfs_identify_partition,
|
|
||||||
dosfs_scan_partition,
|
|
||||||
dosfs_free_identify_partition_cookie,
|
|
||||||
NULL, // free_partition_content_cookie()
|
|
||||||
|
|
||||||
&dosfs_mount,
|
|
||||||
&dosfs_unmount,
|
&dosfs_unmount,
|
||||||
&dosfs_read_fs_stat,
|
&dosfs_read_fs_stat,
|
||||||
&dosfs_write_fs_stat,
|
&dosfs_write_fs_stat,
|
||||||
&dosfs_sync,
|
&dosfs_sync,
|
||||||
|
&dosfs_read_vnode,
|
||||||
|
|
||||||
|
/* index directory & index operations */
|
||||||
|
NULL, //&fs_open_index_dir,
|
||||||
|
NULL, //&fs_close_index_dir,
|
||||||
|
NULL, //&fs_free_index_dir_cookie,
|
||||||
|
NULL, //&fs_read_index_dir,
|
||||||
|
NULL, //&fs_rewind_index_dir,
|
||||||
|
|
||||||
|
NULL, //&fs_create_index,
|
||||||
|
NULL, //&fs_remove_index,
|
||||||
|
NULL, //&fs_stat_index,
|
||||||
|
|
||||||
|
/* query operations */
|
||||||
|
NULL, //&fs_open_query,
|
||||||
|
NULL, //&fs_close_query,
|
||||||
|
NULL, //&fs_free_query_cookie,
|
||||||
|
NULL, //&fs_read_query,
|
||||||
|
NULL, //&fs_rewind_query,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
fs_vnode_ops gFATVnodeOps = {
|
||||||
/* vnode operations */
|
/* vnode operations */
|
||||||
&dosfs_walk,
|
&dosfs_walk,
|
||||||
&dosfs_get_vnode_name,
|
&dosfs_get_vnode_name,
|
||||||
&dosfs_read_vnode,
|
|
||||||
&dosfs_release_vnode,
|
&dosfs_release_vnode,
|
||||||
&dosfs_remove_vnode,
|
&dosfs_remove_vnode,
|
||||||
|
|
||||||
@@ -1272,7 +1274,7 @@ static file_system_module_info sFATFileSystem = {
|
|||||||
&dosfs_free_dircookie,
|
&dosfs_free_dircookie,
|
||||||
&dosfs_readdir,
|
&dosfs_readdir,
|
||||||
&dosfs_rewinddir,
|
&dosfs_rewinddir,
|
||||||
|
|
||||||
/* attribute directory operations */
|
/* attribute directory operations */
|
||||||
&dosfs_open_attrdir,
|
&dosfs_open_attrdir,
|
||||||
&dosfs_close_attrdir,
|
&dosfs_close_attrdir,
|
||||||
@@ -1292,24 +1294,26 @@ static file_system_module_info sFATFileSystem = {
|
|||||||
NULL, //&fs_write_attr_stat,
|
NULL, //&fs_write_attr_stat,
|
||||||
NULL, //&fs_rename_attr,
|
NULL, //&fs_rename_attr,
|
||||||
NULL, //&fs_remove_attr,
|
NULL, //&fs_remove_attr,
|
||||||
|
};
|
||||||
|
|
||||||
/* index directory & index operations */
|
|
||||||
NULL, //&fs_open_index_dir,
|
|
||||||
NULL, //&fs_close_index_dir,
|
|
||||||
NULL, //&fs_free_index_dir_cookie,
|
|
||||||
NULL, //&fs_read_index_dir,
|
|
||||||
NULL, //&fs_rewind_index_dir,
|
|
||||||
|
|
||||||
NULL, //&fs_create_index,
|
static file_system_module_info sFATFileSystem = {
|
||||||
NULL, //&fs_remove_index,
|
{
|
||||||
NULL, //&fs_stat_index,
|
"file_systems/fat" B_CURRENT_FS_API_VERSION,
|
||||||
|
0,
|
||||||
|
dos_std_ops,
|
||||||
|
},
|
||||||
|
|
||||||
/* query operations */
|
"FAT32 File System",
|
||||||
NULL, //&fs_open_query,
|
0, // DDM flags
|
||||||
NULL, //&fs_close_query,
|
|
||||||
NULL, //&fs_free_query_cookie,
|
// scanning
|
||||||
NULL, //&fs_read_query,
|
dosfs_identify_partition,
|
||||||
NULL, //&fs_rewind_query,
|
dosfs_scan_partition,
|
||||||
|
dosfs_free_identify_partition_cookie,
|
||||||
|
NULL, // free_partition_content_cookie()
|
||||||
|
|
||||||
|
&dosfs_mount,
|
||||||
};
|
};
|
||||||
|
|
||||||
module_info *modules[] = {
|
module_info *modules[] = {
|
||||||
|
|||||||
@@ -116,7 +116,8 @@ struct vcache_entry;
|
|||||||
typedef struct _nspace
|
typedef struct _nspace
|
||||||
{
|
{
|
||||||
uint32 magic;
|
uint32 magic;
|
||||||
dev_t id; // ID passed in to fs_mount
|
fs_volume *volume; // fs_volume passed in to fs_mount
|
||||||
|
dev_t id;
|
||||||
int fd; // File descriptor
|
int fd; // File descriptor
|
||||||
char device[256];
|
char device[256];
|
||||||
uint32 flags; // see <fcntl.be.h> for modes
|
uint32 flags; // see <fcntl.be.h> for modes
|
||||||
@@ -197,6 +198,9 @@ int check_nspace_magic(struct _nspace *t, char *funcname);
|
|||||||
|
|
||||||
#define TOUCH(x) ((void)(x))
|
#define TOUCH(x) ((void)(x))
|
||||||
|
|
||||||
|
extern fs_vnode_ops gFATVnodeOps;
|
||||||
|
extern fs_volume_ops gFATVolumeOps;
|
||||||
|
|
||||||
/* debug levels */
|
/* debug levels */
|
||||||
extern int debug_attr, debug_dir, debug_dlist, debug_dosfs, debug_encodings,
|
extern int debug_attr, debug_dir, debug_dlist, debug_dosfs, debug_encodings,
|
||||||
debug_fat, debug_file, debug_iter, debug_vcache;
|
debug_fat, debug_file, debug_iter, debug_vcache;
|
||||||
|
|||||||
@@ -47,10 +47,26 @@ typedef struct filecookie
|
|||||||
static CHECK_MAGIC(filecookie,struct filecookie, FILECOOKIE_MAGIC)
|
static CHECK_MAGIC(filecookie,struct filecookie, FILECOOKIE_MAGIC)
|
||||||
|
|
||||||
|
|
||||||
status_t
|
mode_t
|
||||||
dosfs_get_vnode_name(void *_ns, void *_node, char *buffer, size_t bufferSize)
|
make_mode(nspace *volume, vnode *node)
|
||||||
{
|
{
|
||||||
vnode *node = (vnode*)_node;
|
mode_t result = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH;
|
||||||
|
if (node->mode & FAT_SUBDIR) {
|
||||||
|
result &= ~S_IFREG;
|
||||||
|
result |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
|
||||||
|
}
|
||||||
|
if ((volume->flags & B_FS_IS_READONLY) || (node->mode & FAT_READ_ONLY))
|
||||||
|
result &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
dosfs_get_vnode_name(fs_volume *_ns, fs_vnode *_node, char *buffer,
|
||||||
|
size_t bufferSize)
|
||||||
|
{
|
||||||
|
vnode *node = (vnode*)_node->private_node;
|
||||||
strlcpy(buffer, node->filename, bufferSize);
|
strlcpy(buffer, node->filename, bufferSize);
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -105,7 +121,11 @@ status_t write_vnode_entry(nspace *vol, vnode *node)
|
|||||||
diri_mark_dirty(&diri);
|
diri_mark_dirty(&diri);
|
||||||
diri_free(&diri);
|
diri_free(&diri);
|
||||||
|
|
||||||
notify_listener(B_STAT_CHANGED, vol->id, 0, 0, node->vnid, NULL);
|
// TODO: figure out which stats have actually changed
|
||||||
|
notify_stat_changed(vol->id, node->vnid, B_STAT_MODE | B_STAT_UID
|
||||||
|
| B_STAT_GID | B_STAT_SIZE | B_STAT_ACCESS_TIME
|
||||||
|
| B_STAT_MODIFICATION_TIME | B_STAT_CREATION_TIME
|
||||||
|
| B_STAT_CHANGE_TIME);
|
||||||
|
|
||||||
return B_OK;
|
return B_OK;
|
||||||
}
|
}
|
||||||
@@ -114,10 +134,10 @@ status_t write_vnode_entry(nspace *vol, vnode *node)
|
|||||||
// called when fs is done with vnode
|
// called when fs is done with vnode
|
||||||
// after close, etc. free vnode resources here
|
// after close, etc. free vnode resources here
|
||||||
status_t
|
status_t
|
||||||
dosfs_release_vnode(void *_vol, void *_node, bool reenter)
|
dosfs_release_vnode(fs_volume *_vol, fs_vnode *_node, bool reenter)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
|
|
||||||
TOUCH(reenter);
|
TOUCH(reenter);
|
||||||
|
|
||||||
@@ -126,7 +146,7 @@ dosfs_release_vnode(void *_vol, void *_node, bool reenter)
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(0, ("dosfs_write_vnode (ino_t %Lx)\n", ((vnode *)_node)->vnid));
|
DPRINTF(0, ("dosfs_write_vnode (ino_t %Lx)\n", node->vnid));
|
||||||
|
|
||||||
if ((vol->fs_flags & FS_FLAGS_OP_SYNC) && node->dirty) {
|
if ((vol->fs_flags & FS_FLAGS_OP_SYNC) && node->dirty) {
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
@@ -152,10 +172,10 @@ dosfs_release_vnode(void *_vol, void *_node, bool reenter)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_rstat(void *_vol, void *_node, struct stat *st)
|
dosfs_rstat(fs_volume *_vol, fs_vnode *_node, struct stat *st)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace*)_vol;
|
nspace *vol = (nspace*)_vol->private_volume;
|
||||||
vnode *node = (vnode*)_node;
|
vnode *node = (vnode*)_node->private_node;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
@@ -169,13 +189,7 @@ dosfs_rstat(void *_vol, void *_node, struct stat *st)
|
|||||||
|
|
||||||
st->st_dev = vol->id;
|
st->st_dev = vol->id;
|
||||||
st->st_ino = node->vnid;
|
st->st_ino = node->vnid;
|
||||||
st->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH;
|
st->st_mode = make_mode(vol, node);
|
||||||
if (node->mode & FAT_SUBDIR) {
|
|
||||||
st->st_mode &= ~S_IFREG;
|
|
||||||
st->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH;
|
|
||||||
}
|
|
||||||
if ((vol->flags & B_FS_IS_READONLY) || (node->mode & FAT_READ_ONLY))
|
|
||||||
st->st_mode &= ~(S_IWUSR | S_IWGRP | S_IWOTH);
|
|
||||||
|
|
||||||
st->st_nlink = 1;
|
st->st_nlink = 1;
|
||||||
st->st_uid = 0;
|
st->st_uid = 0;
|
||||||
@@ -191,11 +205,12 @@ dosfs_rstat(void *_vol, void *_node, struct stat *st)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_wstat(void *_vol, void *_node, const struct stat *st, uint32 mask)
|
dosfs_wstat(fs_volume *_vol, fs_vnode *_node, const struct stat *st,
|
||||||
|
uint32 mask)
|
||||||
{
|
{
|
||||||
int err = B_OK;
|
int err = B_OK;
|
||||||
nspace *vol = (nspace*)_vol;
|
nspace *vol = (nspace*)_vol->private_volume;
|
||||||
vnode *node = (vnode*)_node;
|
vnode *node = (vnode*)_node->private_node;
|
||||||
bool dirty = false;
|
bool dirty = false;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
@@ -258,7 +273,6 @@ dosfs_wstat(void *_vol, void *_node, const struct stat *st, uint32 mask)
|
|||||||
|
|
||||||
if (dirty) {
|
if (dirty) {
|
||||||
write_vnode_entry(vol, node);
|
write_vnode_entry(vol, node);
|
||||||
notify_listener(B_STAT_CHANGED, vol->id, 0, 0, node->vnid, NULL);
|
|
||||||
|
|
||||||
if (vol->fs_flags & FS_FLAGS_OP_SYNC) {
|
if (vol->fs_flags & FS_FLAGS_OP_SYNC) {
|
||||||
// sync the filesystem
|
// sync the filesystem
|
||||||
@@ -276,11 +290,11 @@ dosfs_wstat(void *_vol, void *_node, const struct stat *st, uint32 mask)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_open(void *_vol, void *_node, int omode, void **_cookie)
|
dosfs_open(fs_volume *_vol, fs_vnode *_node, int omode, void **_cookie)
|
||||||
{
|
{
|
||||||
status_t result = EINVAL;
|
status_t result = EINVAL;
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode* node = (vnode*)_node;
|
vnode* node = (vnode*)_node->private_node;
|
||||||
filecookie *cookie;
|
filecookie *cookie;
|
||||||
|
|
||||||
*_cookie = NULL;
|
*_cookie = NULL;
|
||||||
@@ -349,11 +363,11 @@ error:
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_read(void *_vol, void *_node, void *_cookie, off_t pos,
|
dosfs_read(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
||||||
void *buf, size_t *len)
|
void *buf, size_t *len)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
filecookie *cookie = (filecookie *)_cookie;
|
filecookie *cookie = (filecookie *)_cookie;
|
||||||
//uint8 *buffer;
|
//uint8 *buffer;
|
||||||
//struct csi iter;
|
//struct csi iter;
|
||||||
@@ -505,11 +519,11 @@ bi:
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_write(void *_vol, void *_node, void *_cookie, off_t pos,
|
dosfs_write(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,
|
||||||
const void *buf, size_t *len)
|
const void *buf, size_t *len)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
filecookie *cookie = (filecookie *)_cookie;
|
filecookie *cookie = (filecookie *)_cookie;
|
||||||
//uint8 *buffer;
|
//uint8 *buffer;
|
||||||
//struct csi iter;
|
//struct csi iter;
|
||||||
@@ -706,10 +720,10 @@ bi:
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_close(void *_vol, void *_node, void *_cookie)
|
dosfs_close(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
|
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
@@ -720,7 +734,7 @@ dosfs_close(void *_vol, void *_node, void *_cookie)
|
|||||||
return EINVAL;
|
return EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
DPRINTF(0, ("dosfs_close (vnode id %Lx)\n", ((vnode *)_node)->vnid));
|
DPRINTF(0, ("dosfs_close (vnode id %Lx)\n", node->vnid));
|
||||||
|
|
||||||
if ((vol->fs_flags & FS_FLAGS_OP_SYNC) && node->dirty) {
|
if ((vol->fs_flags & FS_FLAGS_OP_SYNC) && node->dirty) {
|
||||||
_dosfs_sync(vol);
|
_dosfs_sync(vol);
|
||||||
@@ -734,10 +748,10 @@ dosfs_close(void *_vol, void *_node, void *_cookie)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_free_cookie(void *_vol, void *_node, void *_cookie)
|
dosfs_free_cookie(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
||||||
{
|
{
|
||||||
nspace *vol = _vol;
|
nspace *vol = _vol->private_volume;
|
||||||
vnode *node = _node;
|
vnode *node = _node->private_node;
|
||||||
filecookie *cookie = _cookie;
|
filecookie *cookie = _cookie;
|
||||||
LOCK_VOL(vol);
|
LOCK_VOL(vol);
|
||||||
|
|
||||||
@@ -760,11 +774,11 @@ dosfs_free_cookie(void *_vol, void *_node, void *_cookie)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_create(void *_vol, void *_dir, const char *name, int omode,
|
dosfs_create(fs_volume *_vol, fs_vnode *_dir, const char *name, int omode,
|
||||||
int perms, void **_cookie, ino_t *vnid)
|
int perms, void **_cookie, ino_t *vnid)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *dir = (vnode *)_dir, *file;
|
vnode *dir = (vnode *)_dir->private_node, *file;
|
||||||
filecookie *cookie;
|
filecookie *cookie;
|
||||||
status_t result = EINVAL;
|
status_t result = EINVAL;
|
||||||
bool dups_exist;
|
bool dups_exist;
|
||||||
@@ -815,21 +829,21 @@ dosfs_create(void *_vol, void *_dir, const char *name, int omode,
|
|||||||
if (result == B_OK) {
|
if (result == B_OK) {
|
||||||
if (omode & O_EXCL) {
|
if (omode & O_EXCL) {
|
||||||
dprintf("exclusive dosfs_create called on existing file %s\n", name);
|
dprintf("exclusive dosfs_create called on existing file %s\n", name);
|
||||||
put_vnode(vol->id, file->vnid);
|
put_vnode(_vol, file->vnid);
|
||||||
result = EEXIST;
|
result = EEXIST;
|
||||||
goto bi;
|
goto bi;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file->mode & FAT_SUBDIR) {
|
if (file->mode & FAT_SUBDIR) {
|
||||||
dprintf("can't dosfs_create over an existing subdirectory\n");
|
dprintf("can't dosfs_create over an existing subdirectory\n");
|
||||||
put_vnode(vol->id, file->vnid);
|
put_vnode(_vol, file->vnid);
|
||||||
result = EPERM;
|
result = EPERM;
|
||||||
goto bi;
|
goto bi;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file->disk_image) {
|
if (file->disk_image) {
|
||||||
dprintf("can't dosfs_create over a disk image\n");
|
dprintf("can't dosfs_create over a disk image\n");
|
||||||
put_vnode(vol->id, file->vnid);
|
put_vnode(_vol, file->vnid);
|
||||||
result = EPERM;
|
result = EPERM;
|
||||||
goto bi;
|
goto bi;
|
||||||
}
|
}
|
||||||
@@ -875,7 +889,7 @@ dosfs_create(void *_vol, void *_dir, const char *name, int omode,
|
|||||||
*vnid = dummy.vnid;
|
*vnid = dummy.vnid;
|
||||||
dummy.magic = ~VNODE_MAGIC;
|
dummy.magic = ~VNODE_MAGIC;
|
||||||
|
|
||||||
result = get_vnode(vol->id, *vnid, (void **)&file);
|
result = get_vnode(_vol, *vnid, (void **)&file);
|
||||||
if (result < B_OK) {
|
if (result < B_OK) {
|
||||||
if (vol->fs_flags & FS_FLAGS_OP_SYNC)
|
if (vol->fs_flags & FS_FLAGS_OP_SYNC)
|
||||||
_dosfs_sync(vol);
|
_dosfs_sync(vol);
|
||||||
@@ -892,7 +906,7 @@ dosfs_create(void *_vol, void *_dir, const char *name, int omode,
|
|||||||
cookie->ccache.cluster = file->cluster;
|
cookie->ccache.cluster = file->cluster;
|
||||||
*_cookie = cookie;
|
*_cookie = cookie;
|
||||||
|
|
||||||
notify_listener(B_ENTRY_CREATED, vol->id, dir->vnid, 0, *vnid, name);
|
notify_entry_created(vol->id, dir->vnid, name, *vnid);
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
@@ -910,10 +924,11 @@ bi: if (result != B_OK) free(cookie);
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_mkdir(void *_vol, void *_dir, const char *name, int perms, ino_t *_vnid)
|
dosfs_mkdir(fs_volume *_vol, fs_vnode *_dir, const char *name, int perms,
|
||||||
|
ino_t *_vnid)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *dir = (vnode *)_dir, dummy;
|
vnode *dir = (vnode *)_dir->private_node, dummy;
|
||||||
status_t result = EINVAL;
|
status_t result = EINVAL;
|
||||||
struct csi csi;
|
struct csi csi;
|
||||||
uchar *buffer;
|
uchar *buffer;
|
||||||
@@ -1037,7 +1052,7 @@ dosfs_mkdir(void *_vol, void *_dir, const char *name, int perms, ino_t *_vnid)
|
|||||||
|
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
|
||||||
notify_listener(B_ENTRY_CREATED, vol->id, dir->vnid, 0, dummy.vnid, name);
|
notify_entry_created(vol->id, dir->vnid, name, dummy.vnid);
|
||||||
|
|
||||||
result = B_OK;
|
result = B_OK;
|
||||||
|
|
||||||
@@ -1062,12 +1077,14 @@ bi: dummy.magic = ~VNODE_MAGIC;
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_rename(void *_vol, void *_odir, const char *oldname,
|
dosfs_rename(fs_volume *_vol, fs_vnode *_odir, const char *oldname,
|
||||||
void *_ndir, const char *newname)
|
fs_vnode *_ndir, const char *newname)
|
||||||
{
|
{
|
||||||
status_t result = EINVAL;
|
status_t result = EINVAL;
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *odir = (vnode *)_odir, *ndir = (vnode *)_ndir, *file, *file2;
|
vnode *odir = (vnode *)_odir->private_node;
|
||||||
|
vnode *ndir = (vnode *)_ndir->private_node;
|
||||||
|
vnode *file, *file2;
|
||||||
uint32 ns, ne;
|
uint32 ns, ne;
|
||||||
bool dups_exist;
|
bool dups_exist;
|
||||||
bool dirty = false;
|
bool dirty = false;
|
||||||
@@ -1137,11 +1154,11 @@ dosfs_rename(void *_vol, void *_odir, const char *oldname,
|
|||||||
if (vnid == vol->root_vnode.vnid)
|
if (vnid == vol->root_vnode.vnid)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
result = get_vnode(vol->id, vnid, (void **)&dir);
|
result = get_vnode(_vol, vnid, (void **)&dir);
|
||||||
if (result < B_OK)
|
if (result < B_OK)
|
||||||
goto bi1;
|
goto bi1;
|
||||||
parent = dir->dir_vnid;
|
parent = dir->dir_vnid;
|
||||||
put_vnode(vol->id, vnid);
|
put_vnode(_vol, vnid);
|
||||||
vnid = parent;
|
vnid = parent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1163,7 +1180,7 @@ dosfs_rename(void *_vol, void *_odir, const char *oldname,
|
|||||||
ns = file2->sindex; ne = file2->eindex;
|
ns = file2->sindex; ne = file2->eindex;
|
||||||
|
|
||||||
// let others know the old file is gone
|
// let others know the old file is gone
|
||||||
notify_listener(B_ENTRY_REMOVED, vol->id, ndir->vnid, 0, file2->vnid, NULL);
|
notify_entry_removed(vol->id, ndir->vnid, oldname, file2->vnid);
|
||||||
|
|
||||||
// Make sure this vnode 1) is in the vcache and 2) no longer has a
|
// Make sure this vnode 1) is in the vcache and 2) no longer has a
|
||||||
// location associated with it. See discussion in dosfs_unlink()
|
// location associated with it. See discussion in dosfs_unlink()
|
||||||
@@ -1173,8 +1190,8 @@ dosfs_rename(void *_vol, void *_odir, const char *oldname,
|
|||||||
// note we don't have to lock the file because the fat chain doesn't
|
// note we don't have to lock the file because the fat chain doesn't
|
||||||
// get wiped from the disk until dosfs_remove_vnode() is called; we'll
|
// get wiped from the disk until dosfs_remove_vnode() is called; we'll
|
||||||
// have a phantom chain in effect until the last file is closed.
|
// have a phantom chain in effect until the last file is closed.
|
||||||
remove_vnode(vol->id, file2->vnid); // must be done in this order
|
remove_vnode(_vol, file2->vnid); // must be done in this order
|
||||||
put_vnode(vol->id, file2->vnid);
|
put_vnode(_vol, file2->vnid);
|
||||||
|
|
||||||
dirty = true;
|
dirty = true;
|
||||||
|
|
||||||
@@ -1267,20 +1284,23 @@ dosfs_rename(void *_vol, void *_odir, const char *oldname,
|
|||||||
if (file->filename) strcpy(file->filename, newname);
|
if (file->filename) strcpy(file->filename, newname);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
notify_listener(B_ENTRY_MOVED, vol->id, odir->vnid, ndir->vnid, file->vnid, newname);
|
notify_entry_moved(vol->id, odir->vnid, oldname, ndir->vnid, newname,
|
||||||
|
file->vnid);
|
||||||
|
|
||||||
// update MIME information
|
// update MIME information
|
||||||
if(!(file->mode & FAT_SUBDIR)) {
|
if(!(file->mode & FAT_SUBDIR)) {
|
||||||
set_mime_type(file, newname);
|
set_mime_type(file, newname);
|
||||||
notify_listener(B_ATTR_CHANGED, vol->id, 0, 0, file->vnid, "BEOS:TYPE");
|
notify_attribute_changed(vol->id, file->vnid, "BEOS:TYPE",
|
||||||
|
B_ATTR_CHANGED);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
bi2:
|
bi2:
|
||||||
if (result != B_OK) put_vnode(vol->id, file2->vnid);
|
if (result != B_OK)
|
||||||
|
put_vnode(_vol, file2->vnid);
|
||||||
bi1:
|
bi1:
|
||||||
put_vnode(vol->id, file->vnid);
|
put_vnode(_vol, file->vnid);
|
||||||
bi:
|
bi:
|
||||||
if ((vol->fs_flags & FS_FLAGS_OP_SYNC) && dirty)
|
if ((vol->fs_flags & FS_FLAGS_OP_SYNC) && dirty)
|
||||||
_dosfs_sync(vol);
|
_dosfs_sync(vol);
|
||||||
@@ -1291,10 +1311,10 @@ bi:
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_remove_vnode(void *_vol, void *_node, bool reenter)
|
dosfs_remove_vnode(fs_volume *_vol, fs_vnode *_node, bool reenter)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
|
|
||||||
if (!reenter) { LOCK_VOL(vol); }
|
if (!reenter) { LOCK_VOL(vol); }
|
||||||
|
|
||||||
@@ -1345,11 +1365,11 @@ dosfs_remove_vnode(void *_vol, void *_node, bool reenter)
|
|||||||
|
|
||||||
// get rid of node or directory
|
// get rid of node or directory
|
||||||
static status_t
|
static status_t
|
||||||
do_unlink(void *_vol, void *_dir, const char *name, bool is_file)
|
do_unlink(fs_volume *_vol, fs_vnode *_dir, const char *name, bool is_file)
|
||||||
{
|
{
|
||||||
status_t result = EINVAL;
|
status_t result = EINVAL;
|
||||||
nspace *vol = (nspace *)_vol;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *dir = (vnode *)_dir, *file;
|
vnode *dir = (vnode *)_dir->private_node, *file;
|
||||||
ino_t vnid;
|
ino_t vnid;
|
||||||
|
|
||||||
if (!strcmp(name, "."))
|
if (!strcmp(name, "."))
|
||||||
@@ -1426,7 +1446,7 @@ do_unlink(void *_vol, void *_dir, const char *name, bool is_file)
|
|||||||
// shrink the parent directory (errors here are not disastrous)
|
// shrink the parent directory (errors here are not disastrous)
|
||||||
compact_directory(vol, dir);
|
compact_directory(vol, dir);
|
||||||
|
|
||||||
notify_listener(B_ENTRY_REMOVED, vol->id, dir->vnid, 0, file->vnid, NULL);
|
notify_entry_removed(vol->id, dir->vnid, name, file->vnid);
|
||||||
|
|
||||||
/* Set the loc to a unique value. This effectively removes it from the
|
/* Set the loc to a unique value. This effectively removes it from the
|
||||||
* vcache without releasing its vnid for reuse. It also nicely reserves
|
* vcache without releasing its vnid for reuse. It also nicely reserves
|
||||||
@@ -1438,15 +1458,17 @@ do_unlink(void *_vol, void *_dir, const char *name, bool is_file)
|
|||||||
|
|
||||||
// fsil doesn't call dosfs_write_vnode for us, so we have to free the
|
// fsil doesn't call dosfs_write_vnode for us, so we have to free the
|
||||||
// vnode manually here.
|
// vnode manually here.
|
||||||
remove_vnode(vol->id, file->vnid);
|
remove_vnode(_vol, file->vnid);
|
||||||
|
|
||||||
result = 0;
|
result = 0;
|
||||||
|
|
||||||
if (vol->fs_flags & FS_FLAGS_OP_SYNC)
|
if (vol->fs_flags & FS_FLAGS_OP_SYNC)
|
||||||
_dosfs_sync(vol);
|
_dosfs_sync(vol);
|
||||||
|
|
||||||
bi1:put_vnode(vol->id, vnid); // get 1 free
|
bi1:
|
||||||
bi: UNLOCK_VOL(vol);
|
put_vnode(_vol, vnid); // get 1 free
|
||||||
|
bi:
|
||||||
|
UNLOCK_VOL(vol);
|
||||||
|
|
||||||
if (result != B_OK) DPRINTF(0, ("do_unlink (%s)\n", strerror(result)));
|
if (result != B_OK) DPRINTF(0, ("do_unlink (%s)\n", strerror(result)));
|
||||||
|
|
||||||
@@ -1454,7 +1476,7 @@ bi: UNLOCK_VOL(vol);
|
|||||||
}
|
}
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_unlink(void *vol, void *dir, const char *name)
|
dosfs_unlink(fs_volume *vol, fs_vnode *dir, const char *name)
|
||||||
{
|
{
|
||||||
DPRINTF(1, ("dosfs_unlink called\n"));
|
DPRINTF(1, ("dosfs_unlink called\n"));
|
||||||
|
|
||||||
@@ -1463,7 +1485,7 @@ dosfs_unlink(void *vol, void *dir, const char *name)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_rmdir(void *vol, void *dir, const char *name)
|
dosfs_rmdir(fs_volume *vol, fs_vnode *dir, const char *name)
|
||||||
{
|
{
|
||||||
DPRINTF(1, ("dosfs_rmdir called\n"));
|
DPRINTF(1, ("dosfs_rmdir called\n"));
|
||||||
|
|
||||||
@@ -1472,7 +1494,7 @@ dosfs_rmdir(void *vol, void *dir, const char *name)
|
|||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
dosfs_can_page(fs_volume _fs, fs_vnode _v, fs_cookie _cookie)
|
dosfs_can_page(fs_volume *_vol, fs_vnode *_node, void *_cookie)
|
||||||
{
|
{
|
||||||
// ToDo: we're obviously not even asked...
|
// ToDo: we're obviously not even asked...
|
||||||
return false;
|
return false;
|
||||||
@@ -1480,11 +1502,12 @@ dosfs_can_page(fs_volume _fs, fs_vnode _v, fs_cookie _cookie)
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_read_pages(fs_volume _fs, fs_vnode _node, fs_cookie _cookie, off_t pos,
|
dosfs_read_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
const iovec *vecs, size_t count, size_t *_numBytes, bool reenter)
|
off_t pos, const iovec *vecs, size_t count, size_t *_numBytes,
|
||||||
|
bool reenter)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_fs;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
uint32 vecIndex = 0;
|
uint32 vecIndex = 0;
|
||||||
size_t vecOffset = 0;
|
size_t vecOffset = 0;
|
||||||
size_t bytesLeft = *_numBytes;
|
size_t bytesLeft = *_numBytes;
|
||||||
@@ -1532,11 +1555,12 @@ dosfs_read_pages(fs_volume _fs, fs_vnode _node, fs_cookie _cookie, off_t pos,
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_write_pages(fs_volume _fs, fs_vnode _node, fs_cookie _cookie, off_t pos,
|
dosfs_write_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
const iovec *vecs, size_t count, size_t *_numBytes, bool reenter)
|
off_t pos, const iovec *vecs, size_t count, size_t *_numBytes,
|
||||||
|
bool reenter)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_fs;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
uint32 vecIndex = 0;
|
uint32 vecIndex = 0;
|
||||||
size_t vecOffset = 0;
|
size_t vecOffset = 0;
|
||||||
size_t bytesLeft = *_numBytes;
|
size_t bytesLeft = *_numBytes;
|
||||||
@@ -1584,11 +1608,11 @@ dosfs_write_pages(fs_volume _fs, fs_vnode _node, fs_cookie _cookie, off_t pos,
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
dosfs_get_file_map(void *_fs, void *_node, off_t pos, size_t len,
|
dosfs_get_file_map(fs_volume *_vol, fs_vnode *_node, off_t pos, size_t len,
|
||||||
struct file_io_vec *vecs, size_t *_count)
|
struct file_io_vec *vecs, size_t *_count)
|
||||||
{
|
{
|
||||||
nspace *vol = (nspace *)_fs;
|
nspace *vol = (nspace *)_vol->private_volume;
|
||||||
vnode *node = (vnode *)_node;
|
vnode *node = (vnode *)_node->private_node;
|
||||||
struct csi iter;
|
struct csi iter;
|
||||||
int result = B_OK;
|
int result = B_OK;
|
||||||
size_t bytes_read = 0;
|
size_t bytes_read = 0;
|
||||||
|
|||||||
@@ -5,34 +5,42 @@
|
|||||||
#ifndef _DOSFS_FILE_H_
|
#ifndef _DOSFS_FILE_H_
|
||||||
#define _DOSFS_FILE_H_
|
#define _DOSFS_FILE_H_
|
||||||
|
|
||||||
status_t write_vnode_entry(nspace *vol, vnode *node);
|
mode_t make_mode(nspace *volume, vnode *node);
|
||||||
|
status_t write_vnode_entry(nspace *vol, vnode *node);
|
||||||
|
|
||||||
status_t dosfs_get_vnode_name(void *_ns, void *_node, char *buffer, size_t bufferSize);
|
status_t dosfs_get_vnode_name(fs_volume *_vol, fs_vnode *_node,
|
||||||
status_t dosfs_release_vnode(void *_vol, void *_node, bool reenter);
|
char *buffer, size_t bufferSize);
|
||||||
status_t dosfs_rstat(void *_vol, void *_node, struct stat *st);
|
status_t dosfs_release_vnode(fs_volume *_vol, fs_vnode *_node,
|
||||||
status_t dosfs_open(void *_vol, void *_node, int omode, void **cookie);
|
bool reenter);
|
||||||
status_t dosfs_read(void *_vol, void *_node, void *cookie, off_t pos,
|
status_t dosfs_rstat(fs_volume *_vol, fs_vnode *_node, struct stat *st);
|
||||||
void *buf, size_t *len);
|
status_t dosfs_open(fs_volume *_vol, fs_vnode *_node, int omode,
|
||||||
status_t dosfs_free_cookie(void *vol, void *node, void *cookie);
|
void **cookie);
|
||||||
status_t dosfs_close(void *vol, void *node, void *cookie);
|
status_t dosfs_read(fs_volume *_vol, fs_vnode *_node, void *cookie,
|
||||||
|
off_t pos, void *buf, size_t *len);
|
||||||
|
status_t dosfs_free_cookie(fs_volume *vol, fs_vnode *node, void *cookie);
|
||||||
|
status_t dosfs_close(fs_volume *vol, fs_vnode *node, void *cookie);
|
||||||
|
|
||||||
status_t dosfs_remove_vnode(void *vol, void *node, bool reenter);
|
status_t dosfs_remove_vnode(fs_volume *vol, fs_vnode *node, bool reenter);
|
||||||
status_t dosfs_create(void *vol, void *dir, const char *name,
|
status_t dosfs_create(fs_volume *vol, fs_vnode *dir, const char *name,
|
||||||
int omode, int perms, void **cookie, ino_t *vnid);
|
int omode, int perms, void **cookie, ino_t *vnid);
|
||||||
status_t dosfs_mkdir(void *vol, void *dir, const char *name, int perms, ino_t *_vnid);
|
status_t dosfs_mkdir(fs_volume *vol, fs_vnode *dir, const char *name,
|
||||||
status_t dosfs_rename(void *vol, void *olddir, const char *oldname,
|
int perms, ino_t *_vnid);
|
||||||
void *newdir, const char *newname);
|
status_t dosfs_rename(fs_volume *vol, fs_vnode *olddir, const char *oldname,
|
||||||
status_t dosfs_unlink(void *vol, void *dir, const char *name);
|
fs_vnode *newdir, const char *newname);
|
||||||
status_t dosfs_rmdir(void *vol, void *dir, const char *name);
|
status_t dosfs_unlink(fs_volume *vol, fs_vnode *dir, const char *name);
|
||||||
status_t dosfs_wstat(void *vol, void *node, const struct stat *st, uint32 mask);
|
status_t dosfs_rmdir(fs_volume *vol, fs_vnode *dir, const char *name);
|
||||||
status_t dosfs_write(void *vol, void *node, void *cookie, off_t pos,
|
status_t dosfs_wstat(fs_volume *vol, fs_vnode *node, const struct stat *st,
|
||||||
const void *buf, size_t *len);
|
uint32 mask);
|
||||||
status_t dosfs_get_file_map(void *fs, void *node, off_t pos, size_t reqLen,
|
status_t dosfs_write(fs_volume *vol, fs_vnode *node, void *cookie,
|
||||||
struct file_io_vec *vecs, size_t *_count);
|
off_t pos, const void *buf, size_t *len);
|
||||||
bool dosfs_can_page(fs_volume _fs, fs_vnode _v, fs_cookie _cookie);
|
status_t dosfs_get_file_map(fs_volume *_vol, fs_vnode *_node, off_t pos,
|
||||||
status_t dosfs_read_pages(fs_volume _fs, fs_vnode _node, fs_cookie _cookie, off_t pos,
|
size_t reqLen, struct file_io_vec *vecs, size_t *_count);
|
||||||
const iovec *vecs, size_t count, size_t *_numBytes, bool reenter);
|
bool dosfs_can_page(fs_volume *_vol, fs_vnode *_node, void *_cookie);
|
||||||
status_t dosfs_write_pages(fs_volume _fs, fs_vnode _node, fs_cookie _cookie, off_t pos,
|
status_t dosfs_read_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
const iovec *vecs, size_t count, size_t *_numBytes, bool reenter);
|
off_t pos, const iovec *vecs, size_t count, size_t *_numBytes,
|
||||||
|
bool reenter);
|
||||||
|
status_t dosfs_write_pages(fs_volume *_vol, fs_vnode *_node, void *_cookie,
|
||||||
|
off_t pos, const iovec *vecs, size_t count, size_t *_numBytes,
|
||||||
|
bool reenter);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user