first changes for new FS API support

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@28365 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Gerasim Troeglazov
2008-10-29 03:06:32 +00:00
parent 7c1db8e668
commit 31aa96d87f
7 changed files with 275 additions and 605 deletions
@@ -56,13 +56,16 @@ status_t set_mime(vnode *node, const char *filename)
#ifdef __HAIKU__
status_t
fs_open_attrib_dir(void *_ns, void *_node, void **_cookie)
fs_open_attrib_dir(fs_volume *_vol, fs_vnode *_node, void **_cookie)
{
nspace *ns = (nspace *)_vol->private_volume;
#else
int
fs_open_attrib_dir(void *_ns, void *_node, void **_cookie)
#endif
{
nspace *ns = (nspace *)_ns;
#endif
int result = B_NO_ERROR;
ERRPRINT("fs_open_attrdir - ENTER\n");
@@ -87,13 +90,15 @@ exit:
#ifdef __HAIKU__
status_t
fs_close_attrib_dir(void *_ns, void *_node, void *_cookie)
fs_close_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie)
{
nspace *ns = (nspace *)_vol->private_volume;
#else
int
fs_close_attrib_dir(void *_ns, void *_node, void *_cookie)
#endif
{
nspace *ns = (nspace *)_ns;
#endif
ERRPRINT("fs_close_attrdir - ENTER\n");
@@ -110,13 +115,16 @@ fs_close_attrib_dir(void *_ns, void *_node, void *_cookie)
#ifdef __HAIKU__
status_t
fs_free_attrib_dir_cookie(void *_ns, void *_node, void *_cookie)
fs_free_attrib_dir_cookie(fs_volume *_vol, fs_vnode *_node, void *_cookie)
{
nspace *ns = (nspace *)_vol->private_volume;
#else
int
fs_free_attrib_dir_cookie(void *_ns, void *_node, void *_cookie)
#endif
{
nspace *ns = (nspace *)_ns;
#endif
int result = B_NO_ERROR;
LOCK_VOL(ns);
@@ -143,13 +151,15 @@ exit:
#ifdef __HAIKU__
status_t
fs_rewind_attrib_dir(void *_ns, void *_node, void *_cookie)
fs_rewind_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie)
{
nspace *ns = (nspace *)_vol->private_volume;
#else
int
fs_rewind_attrib_dir(void *_ns, void *_node, void *_cookie)
#endif
{
nspace *ns = (nspace *)_ns;
#endif
int result = B_NO_ERROR;
LOCK_VOL(ns);
@@ -176,14 +186,17 @@ exit:
#ifdef __HAIKU__
status_t
fs_read_attrib_dir(void *_ns, void *_node, void *_cookie, struct dirent *entry, size_t bufsize, uint32 *num)
fs_read_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie, struct dirent *entry, size_t bufsize, uint32 *num)
{
nspace *ns = (nspace *)_vol->private_volume;
vnode *node = (vnode *)_node->private_node;
#else
int
fs_read_attrib_dir(void *_ns, void *_node, void *_cookie, long *num, struct dirent *entry, size_t bufsize)
#endif
{
nspace *ns = (nspace *)_ns;
vnode *node = (vnode *)_node;
#endif
int32 *cookie = (int32 *)_cookie;
LOCK_VOL(ns);
@@ -233,10 +246,10 @@ fs_read_attrib_stat(void *_ns, void *_node, const char *name, struct attr_info *
#ifdef __HAIKU__
status_t
fs_open_attrib(void *_ns, void *_node, const char *name, int openMode, fs_cookie *_cookie)
fs_open_attrib(fs_volume *_vol, fs_vnode *_node, const char *name, int openMode, void **_cookie)
{
nspace *ns = (nspace *)_ns;
vnode *node = (vnode *)_node;
nspace *ns = (nspace *)_vol->private_volume;
vnode *node = (vnode *)_node->private_node;
int result = B_NO_ERROR;
LOCK_VOL(ns);
@@ -267,7 +280,7 @@ exit:
#ifdef __HAIKU__
status_t
fs_close_attrib(void *_ns, void *_node, fs_cookie cookie)
fs_close_attrib(fs_volume *_vol, fs_vnode *_node, void *cookie)
{
return B_NO_ERROR;
}
@@ -275,7 +288,7 @@ fs_close_attrib(void *_ns, void *_node, fs_cookie cookie)
#ifdef __HAIKU__
status_t
fs_free_attrib_cookie(void *_ns, void *_node, fs_cookie cookie)
fs_free_attrib_cookie(fs_volume *_vol, fs_vnode *_node, void *cookie)
{
return B_NO_ERROR;
}
@@ -283,10 +296,10 @@ fs_free_attrib_cookie(void *_ns, void *_node, fs_cookie cookie)
#ifdef __HAIKU__
status_t
fs_read_attrib_stat(void *_ns, void *_node, fs_cookie _cookie, struct stat *stat)
fs_read_attrib_stat(fs_volume *_vol, fs_vnode *_node, void *_cookie,struct stat *stat)
{
nspace *ns = (nspace *)_ns;
vnode *node = (vnode *)_node;
nspace *ns = (nspace *)_vol->private_volume;
vnode *node = (vnode *)_node->private_node;
int result = B_NO_ERROR;
LOCK_VOL(ns);
@@ -318,14 +331,17 @@ exit:
#ifdef __HAIKU__
status_t
fs_read_attrib(void *_ns, void *_node, fs_cookie _cookie, off_t pos, void *buffer, size_t *_length)
fs_read_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie, off_t pos,void *buffer, size_t *_length)
{
nspace *ns = (nspace *)_vol->private_volume;
vnode *node = (vnode *)_node->private_node;
#else
int
fs_read_attrib(void *_ns, void *_node, const char *name, int type, void *buffer, size_t *_length, off_t pos)
#endif
{
nspace *ns = (nspace *)_ns;
vnode *node = (vnode *)_node;
#endif
int result = B_NO_ERROR;
LOCK_VOL(ns);
@@ -365,13 +381,15 @@ exit:
#ifdef __HAIKU__
status_t
fs_write_attrib(void *_ns, void *_node, fs_cookie _cookie, off_t pos,const void *buffer, size_t *_length)
fs_write_attrib(fs_volume *_vol, fs_vnode *_node, void *_cookie,off_t pos, const void *buffer, size_t *_length)
{
nspace *ns = (nspace *)_vol->private_volume;
#else
int
fs_write_attrib(void *_ns, void *_node, const char *name, int type, const void *buffer, size_t *_length, off_t pos)
#endif
{
nspace *ns = (nspace *)_ns;
#endif
int result = B_NO_ERROR;
LOCK_VOL(ns);
@@ -15,31 +15,16 @@
status_t set_mime(vnode *node, const char *filename);
#ifdef __HAIKU__
status_t fs_open_attrib_dir(void *_vol, void *_node, void **_cookie);
status_t fs_close_attrib_dir(void *_vol, void *_node, void *_cookie);
status_t fs_free_attrib_dir_cookie(void *_vol, void *_node, void *_cookie);
status_t fs_rewind_attrib_dir(void *_vol, void *_node, void *_cookie);
status_t fs_read_attrib_dir(void *_vol, void *_node, void *_cookie, struct dirent *buf, size_t bufsize, uint32 *num);
status_t fs_open_attrib(void *_vol, void *_node, const char *name, int openMode,fs_cookie *_cookie);
status_t fs_close_attrib(void *_vol, void *_node, fs_cookie cookie);
status_t fs_free_attrib_cookie(void *_vol, void *_node, fs_cookie cookie);
status_t fs_read_attrib_stat(void *_vol, void *_node, fs_cookie _cookie, struct stat *stat);
status_t fs_read_attrib(void *_vol, void *_node, fs_cookie _cookie, off_t pos,void *buffer, size_t *_length);
status_t fs_write_attrib(void *_vol, void *_node, fs_cookie _cookie, off_t pos, const void *buffer, size_t *_length);
#else
int fs_open_attrib_dir(void *_vol, void *_node, void **_cookie);
int fs_close_attrib_dir(void *_vol, void *_node, void *_cookie);
int fs_free_attrib_dir_cookie(void *_vol, void *_node, void *_cookie);
int fs_rewind_attrib_dir(void *_vol, void *_node, void *_cookie);
int fs_read_attrib_dir(void *_vol, void *_node, void *_cookie, long *num, struct dirent *buf, size_t bufsize);
int fs_read_attrib_stat(void *_vol, void *_node, const char *name, struct attr_info *buf);
int fs_read_attrib(void *_vol, void *_node, const char *name, int type, void *buf, size_t *len, off_t pos);
int fs_write_attrib(void *_vol, void *_node, const char *name, int type, const void *buf, size_t *len, off_t pos);
#endif //__HAIKU__
status_t fs_open_attrib_dir(fs_volume *_vol, fs_vnode *_node, void **_cookie);
status_t fs_close_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie);
status_t fs_free_attrib_dir_cookie(fs_volume *_vol, fs_vnode *_node, void *_cookie);
status_t fs_rewind_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie);
status_t fs_read_attrib_dir(fs_volume *_vol, fs_vnode *_node, void *_cookie, struct dirent *buf, size_t bufsize, uint32 *num);
status_t fs_open_attrib(fs_volume *_vol, fs_vnode *_node, const char *name, int openMode, void **_cookie);
status_t fs_close_attrib(fs_volume *_vol, fs_vnode *_node, void *cookie);
status_t fs_free_attrib_cookie(fs_volume *_vol, fs_vnode *_node, void *cookie);
status_t fs_read_attrib_stat(fs_volume *_vol, fs_vnode *_node, void *cookie, struct stat *stat);
status_t fs_read_attrib(fs_volume *_vol, fs_vnode *_node, void *cookie, off_t pos,void *buffer, size_t *_length);
status_t fs_write_attrib(fs_volume *_vol, fs_vnode *_node, void *cookie, off_t pos, const void *buffer, size_t *_length);
#endif
+112 -297
View File
@@ -41,7 +41,6 @@
#include "volume_util.h"
#include "fs_func.h"
#ifdef __HAIKU__
typedef struct identify_cookie {
NTFS_BOOT_SECTOR boot;
@@ -117,15 +116,10 @@ fs_free_identify_partition_cookie(partition_data *partition, void *_cookie)
identify_cookie *cookie = (identify_cookie *)_cookie;
free(cookie);
}
#endif //__HAIKU__
#ifdef __HAIKU__
status_t
fs_mount(dev_t nsid, const char *device, ulong flags, const char *args, void **data, ino_t *vnid)
#else
int
fs_mount(nspace_id nsid, const char *device, ulong flags, void *parms, size_t len, void **data, ino_t *vnid)
#endif
fs_mount(fs_volume *_vol, const char *device, ulong flags, const char *args, ino_t *_rootID)
{
nspace *ns;
vnode *newNode = NULL;
@@ -153,15 +147,7 @@ fs_mount(nspace_id nsid, const char *device, ulong flags, void *parms, size_t le
strcpy(ns->devicePath,device);
sprintf(lockname, "ntfs_lock %lx", ns->id);
#ifdef __HAIKU__
recursive_lock_init_etc(&(ns->vlock), lockname, MUTEX_FLAG_CLONE_NAME);
#else
if ((result = new_lock(&(ns->vlock), lockname)) != B_OK) {
ERRPRINT("fs_mount - error creating lock (%s)\n", strerror(result));
goto exit;
}
#endif
handle = load_driver_settings("ntfs");
ns->show_sys_files = ! (strcasecmp(get_driver_parameter(handle, "hide_sys_files", "true", "true"), "true") == 0);
@@ -183,19 +169,20 @@ fs_mount(nspace_id nsid, const char *device, ulong flags, void *parms, size_t le
result = errno;
if (result == B_NO_ERROR) {
*vnid = FILE_root;
*data = (void*)ns;
ns->id = nsid;
*_rootID = FILE_root;
ns->id = _vol->id;
_vol->private_volume = (void *)ns;
_vol->ops = &gNTFSVolumeOps;
newNode = (vnode*)ntfs_calloc( sizeof(vnode) );
if ( newNode == NULL )
result = ENOMEM;
else {
newNode->vnid = *vnid;
newNode->vnid = *_rootID;
newNode->parent_vnid = -1;
result = publish_vnode( nsid, *vnid, (void*)newNode );
result = publish_vnode( _vol, *_rootID, (void*)newNode, &gNTFSVnodeOps, 0777, 0);
if ( result != B_NO_ERROR ) {
free( ns );
result = EINVAL;
@@ -216,26 +203,17 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_unmount(void *_ns)
#else
int
fs_unmount(void *_ns)
#endif
fs_unmount(fs_volume *_vol)
{
nspace *ns = (nspace*)_ns;
nspace *ns = (nspace*)_vol->private_volume;
status_t result = B_NO_ERROR;
ERRPRINT("fs_unmount - ENTER\n");
ntfs_umount( ns->ntvol, true );
#ifdef __HAIKU__
recursive_lock_destroy(&(ns->vlock));
#else
free_lock(&(ns->vlock));
#endif
free( ns );
@@ -244,15 +222,10 @@ fs_unmount(void *_ns)
return result;
}
#ifdef __HAIKU__
status_t
fs_rfsstat( void *_ns, struct fs_info * fss )
#else
int
fs_rfsstat( void *_ns, struct fs_info * fss )
#endif
fs_rfsstat( fs_volume *_vol, struct fs_info * fss )
{
nspace *ns = (nspace*)_ns;
nspace *ns = (nspace*)_vol->private_volume;
int i;
LOCK_VOL(ns);
@@ -288,15 +261,11 @@ fs_rfsstat( void *_ns, struct fs_info * fss )
return B_NO_ERROR;
}
#ifdef __HAIKU__
status_t
fs_wfsstat(void *_vol, const struct fs_info * fss, uint32 mask)
#else
int
fs_wfsstat(void *_vol, struct fs_info *fss, long mask)
#endif
fs_wfsstat( fs_volume *_vol, const struct fs_info * fss, uint32 mask)
{
nspace* ns = (nspace*)_vol;
nspace* ns = (nspace*)_vol->private_volume;
status_t result = B_NO_ERROR;
if (ns->flags & B_FS_IS_READONLY) {
@@ -306,11 +275,7 @@ fs_wfsstat(void *_vol, struct fs_info *fss, long mask)
LOCK_VOL(ns);
#ifdef __HAIKU__
if (mask & FS_WRITE_FSINFO_NAME) {
#else
if (mask & WFSSTAT_NAME) {
#endif
result = ntfs_change_label( ns->ntvol, (char*)fss->volume_name );
goto exit;
}
@@ -322,16 +287,11 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_walk(void *_ns, void *_base, const char *file, ino_t *vnid,int *_type)
#else
int
fs_walk(void *_ns, void *_base, const char *file, char **newpath, ino_t *vnid)
#endif
fs_walk(fs_volume *_vol, fs_vnode *_dir, const char *file, ino_t *vnid)
{
nspace *ns = (nspace*)_ns;
vnode *baseNode = (vnode*)_base;
nspace *ns = (nspace*)_vol->private_volume;
vnode *baseNode = (vnode*)_dir->private_node;
vnode *newNode = NULL;
ntfschar *unicode = NULL;
ntfs_inode *bi = NULL;
@@ -342,18 +302,18 @@ fs_walk(void *_ns, void *_base, const char *file, char **newpath, ino_t *vnid)
ERRPRINT("fs_walk - ENTER : find for \"%s\"\n",file);
if(ns == NULL || _base == NULL || file == NULL || vnid == NULL) {
if(ns == NULL || _dir == NULL || file == NULL || vnid == NULL) {
result = EINVAL;
goto exit;
}
if ( !strcmp( file, "." ) ) {
*vnid = baseNode->vnid;
if ( get_vnode( ns->id, *vnid, (void**)&newNode ) != 0 )
if ( get_vnode( _vol, *vnid, (void**)&newNode ) != 0 )
result = ENOENT;
} else if ( !strcmp( file, ".." ) && baseNode->vnid != FILE_root ) {
*vnid = baseNode->parent_vnid;
if ( get_vnode( ns->id, *vnid, (void**)&newNode ) != 0 )
if ( get_vnode( _vol, *vnid, (void**)&newNode ) != 0 )
result = ENOENT;
} else {
unicode = ntfs_calloc(MAX_PATH);
@@ -379,7 +339,7 @@ fs_walk(void *_ns, void *_base, const char *file, char **newpath, ino_t *vnid)
goto exit;
}
if( get_vnode( ns->id, *vnid, (void**)&newNode ) !=0 )
if( get_vnode( _vol, *vnid, (void**)&newNode ) !=0 )
result = ENOENT;
if(newNode!=NULL)
@@ -395,12 +355,11 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_get_vnode_name(void *_ns, void *_node, char *buffer, size_t bufferSize)
fs_get_vnode_name(fs_volume *_vol, fs_vnode *_vnode, char *buffer, size_t bufferSize)
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_vnode->private_node;
ntfs_inode *ni=NULL;
status_t result = B_NO_ERROR;
@@ -433,19 +392,13 @@ exit:
return result;
}
#endif
#ifdef __HAIKU__
status_t
fs_read_vnode(void *_ns, ino_t vnid, void **node, bool reenter)
#else
int
fs_read_vnode(void *_ns, ino_t vnid, char reenter, void **node)
#endif
fs_read_vnode(fs_volume *_vol, ino_t vnid, fs_vnode *_node, int *_type, uint32 *_flags, bool reenter)
{
nspace *ns = (nspace*)_ns;
nspace *ns = (nspace*)_vol->private_volume;
vnode *newNode = NULL;
ntfs_inode *ni=NULL;
status_t result = B_NO_ERROR;
@@ -455,6 +408,10 @@ fs_read_vnode(void *_ns, ino_t vnid, char reenter, void **node)
ERRPRINT("fs_read_vnode - ENTER\n");
_node->private_node = NULL;
_node->ops = &gNTFSVnodeOps;
_flags = 0;
newNode = (vnode*)ntfs_calloc( sizeof(vnode) );
if ( newNode != NULL ) {
char *name = NULL;
@@ -479,7 +436,8 @@ fs_read_vnode(void *_ns, ino_t vnid, char reenter, void **node)
}
}
*node = (void*)newNode;
_node->private_node = newNode;
*_type = 0666;
}
else
result = ENOMEM;
@@ -496,16 +454,11 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_write_vnode( void *_ns, void *_node, bool reenter )
#else
int
fs_write_vnode( void *_ns, void *_node, char reenter )
#endif
fs_write_vnode( fs_volume *_vol, fs_vnode *_node, bool reenter )
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_node->private_node;
status_t result = B_NO_ERROR;
if ( !reenter )
@@ -524,16 +477,11 @@ fs_write_vnode( void *_ns, void *_node, char reenter )
return result;
}
#ifdef __HAIKU__
status_t
fs_remove_vnode( void *_ns, void *_node, bool reenter )
#else
int
fs_remove_vnode( void *_ns, void *_node, char reenter )
#endif
fs_remove_vnode( fs_volume *_vol, fs_vnode *_node, bool reenter )
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_node->private_node;
status_t result = B_NO_ERROR;
if ( !reenter )
@@ -552,16 +500,11 @@ fs_remove_vnode( void *_ns, void *_node, char reenter )
return result;
}
#ifdef __HAIKU__
status_t
fs_rstat( void *_ns, void *_node, struct stat *stbuf )
#else
int
fs_rstat( void *_ns, void *_node, struct stat *stbuf )
#endif
fs_rstat( fs_volume *_vol, fs_vnode *_node, struct stat *stbuf )
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_node->private_node;
ntfs_inode *ni = NULL;
ntfs_attr *na;
status_t result = B_NO_ERROR;
@@ -659,16 +602,11 @@ exit:
}
#ifdef __HAIKU__
status_t
fs_wstat(void *_vol, void *_node, const struct stat *st, uint32 mask)
#else
int
fs_wstat(void *_vol, void *_node, struct stat *st, long mask)
#endif
fs_wstat( fs_volume *_vol, fs_vnode *_node, const struct stat *st, uint32 mask )
{
nspace *ns = (nspace*)_vol;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_node->private_node;
ntfs_inode *ni = NULL;
status_t result = B_NO_ERROR;
@@ -682,11 +620,8 @@ fs_wstat(void *_vol, void *_node, struct stat *st, long mask)
goto exit;
}
#ifdef __HAIKU__
if ( mask & B_STAT_SIZE ) {
#else
if (mask & WSTAT_SIZE) {
#endif
ERRPRINT("fs_wstat: setting file size to %Lx\n", st->st_size);
if ( ni->mrec->flags & MFT_RECORD_IS_DIRECTORY ) {
@@ -704,30 +639,19 @@ fs_wstat(void *_vol, void *_node, struct stat *st, long mask)
ntfs_mark_free_space_outdated(ns);
#ifdef __HAIKU__
notify_stat_changed(ns->id, MREF(ni->mft_no), mask);
#else
notify_listener(B_STAT_CHANGED, ns->id, 0, 0, MREF(ni->mft_no), NULL);
#endif
}
}
#ifdef __HAIKU__
if (mask & B_STAT_MODIFICATION_TIME) {
#else
if (mask & WSTAT_MTIME) {
#endif
ERRPRINT("fs_wstat: setting modification time\n");
ni->last_access_time = st->st_atime;
ni->last_data_change_time = st->st_mtime;
ni->last_mft_change_time = st->st_ctime;
#ifdef __HAIKU__
notify_stat_changed(ns->id, MREF(ni->mft_no), mask);
#else
notify_listener(B_STAT_CHANGED, ns->id, 0, 0, MREF(ni->mft_no), NULL);
#endif
}
exit:
@@ -743,15 +667,10 @@ exit:
}
#ifdef __HAIKU__
status_t
fs_sync(void *_ns)
#else
int
fs_sync(void *_ns)
#endif
fs_sync(fs_volume *_vol)
{
nspace *ns = (nspace *)_ns;
nspace *ns = (nspace *)_vol->private_volume;
LOCK_VOL(ns);
@@ -765,16 +684,11 @@ fs_sync(void *_ns)
}
#ifdef __HAIKU__
status_t
fs_fsync(void *_ns, void *_node)
#else
int
fs_fsync(void *_ns, void *_node)
#endif
fs_fsync(fs_volume *_vol, fs_vnode *_node)
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_node->private_node;
ntfs_inode *ni = NULL;
status_t result = B_NO_ERROR;
@@ -807,16 +721,11 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_open(void *_ns, void *_node, int omode, void **_cookie)
#else
int
fs_open(void *_ns, void *_node, int omode, void **_cookie)
#endif
fs_open(fs_volume *_vol, fs_vnode *_node, int omode, void **_cookie)
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_node->private_node;
filecookie *cookie=NULL;
ntfs_inode *ni=NULL;
ntfs_attr *na = NULL;
@@ -872,16 +781,11 @@ exit:
}
#ifdef __HAIKU__
status_t
fs_create(void *_ns, void *_dir, const char *name, int omode, int perms, void **_cookie, ino_t *_vnid)
#else
int
fs_create(void *_ns, void *_dir, const char *name, int omode, int perms, ino_t *_vnid, void **_cookie)
#endif
fs_create(fs_volume *_vol, fs_vnode *_dir, const char *name, int omode, int perms, void **_cookie, ino_t *_vnid)
{
nspace *ns = (nspace*)_ns;
vnode *dir = (vnode*)_dir;
nspace *ns = (nspace*)_vol->private_volume;
vnode *dir = (vnode*)_dir->private_node;
filecookie *cookie = NULL;
vnode *newNode = NULL;
ntfs_attr *na = NULL;
@@ -900,7 +804,7 @@ fs_create(void *_ns, void *_dir, const char *name, int omode, int perms, ino_t *
ERRPRINT("fs_create - ENTER: name=%s\n",name);
if(_ns==NULL || _dir==NULL) {
if(_vol==NULL || _dir==NULL) {
result = EINVAL;
goto exit;
}
@@ -964,15 +868,11 @@ fs_create(void *_ns, void *_dir, const char *name, int omode, int perms, ino_t *
set_mime(newNode, name);
result = B_NO_ERROR;
result = publish_vnode(ns->id, *_vnid, (void*)newNode);
result = publish_vnode(_vol, *_vnid, (void*)newNode,&gNTFSVnodeOps, 0777, 0);
ntfs_mark_free_space_outdated(ns);
#ifdef __HAIKU__
notify_entry_created(ns->id, MREF( bi->mft_no ), name, *_vnid);
#else
notify_listener(B_ENTRY_CREATED, ns->id, MREF( bi->mft_no ), 0, *_vnid, name);
#endif
} else
result = errno;
@@ -1001,16 +901,11 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_read( void *_ns, void *_node, void *_cookie, off_t offset, void *buf, size_t *len )
#else
int
fs_read( void *_ns, void *_node, void *_cookie, off_t offset, void *buf, size_t *len )
#endif
fs_read( fs_volume *_vol, fs_vnode *_dir, void *_cookie, off_t offset, void *buf, size_t *len )
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_dir->private_node;
//filecookie *cookie = (filecookie*)_cookie; //temporary not used
ntfs_inode *ni = NULL;
ntfs_attr *na = NULL;
@@ -1083,16 +978,11 @@ exit2:
}
#ifdef __HAIKU__
status_t
fs_write( void *_ns, void *_node, void *_cookie, off_t offset, const void *buf, size_t *len )
#else
int
fs_write( void *_ns, void *_node, void *_cookie, off_t offset, const void *buf, size_t *len )
#endif
fs_write( fs_volume *_vol, fs_vnode *_dir, void *_cookie, off_t offset, const void *buf, size_t *len )
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_dir->private_node;
filecookie *cookie = (filecookie*)_cookie;
ntfs_inode *ni = NULL;
ntfs_attr *na = NULL;
@@ -1186,13 +1076,8 @@ exit2:
}
#ifdef __HAIKU__
status_t
fs_close(void *ns, void *node, void *cookie)
#else
int
fs_close(void *ns, void *node, void *cookie)
#endif
fs_close(fs_volume *_vol, fs_vnode *_node, void *cookie)
{
ERRPRINT("fs_close - ENTER\n");
@@ -1200,13 +1085,8 @@ fs_close(void *ns, void *node, void *cookie)
return B_NO_ERROR;
}
#ifdef __HAIKU__
status_t
fs_free_cookie( void *ns, void *node, void *cookie )
#else
int
fs_free_cookie( void *ns, void *node, void *cookie )
#endif
fs_free_cookie( fs_volume *_vol, fs_vnode *_node, void *cookie )
{
ERRPRINT("fs_free_cookie - ENTER\n");
@@ -1217,13 +1097,8 @@ fs_free_cookie( void *ns, void *node, void *cookie )
return B_NO_ERROR;
}
#ifdef __HAIKU__
status_t
fs_access( void *ns, void *node, int mode )
#else
int
fs_access( void *ns, void *node, int mode )
#endif
fs_access( fs_volume *_vol, fs_vnode *_node, int mode )
{
ERRPRINT("fs_access - ENTER\n");
@@ -1231,16 +1106,11 @@ fs_access( void *ns, void *node, int mode )
return B_NO_ERROR;
}
#ifdef __HAIKU__
status_t
fs_readlink(void *_ns, void *_node, char *buff, size_t *buff_size)
#else
int
fs_readlink(void *_ns, void *_node, char *buff, size_t *buff_size)
#endif
fs_readlink(fs_volume *_vol, fs_vnode *_node, char *buff, size_t *buff_size)
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_node->private_node;
ntfs_attr *na = NULL;
INTX_FILE *intx_file = NULL;
ntfs_inode *ni = NULL;
@@ -1331,16 +1201,11 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_create_symlink(void *_ns, void *_dir, const char *name, const char *target, int mode)
#else
int
fs_create_symlink(void *_ns, void *_dir, const char *name, const char *target)
#endif
fs_create_symlink(fs_volume *_vol, fs_vnode *_dir, const char *name, const char *target, int mode)
{
nspace *ns = (nspace*)_ns;
vnode *dir = (vnode*)_dir;
nspace *ns = (nspace*)_vol->private_volume;
vnode *dir = (vnode*)_dir->private_node;
ntfs_inode *sym = NULL;
ntfs_inode *bi = NULL;
vnode *symnode = NULL;
@@ -1397,16 +1262,12 @@ fs_create_symlink(void *_ns, void *_dir, const char *name, const char *target)
else
set_mime(symnode, name);
if ((result = publish_vnode(ns->id, MREF(sym->mft_no), symnode)) != 0)
if ((result = publish_vnode(_vol, MREF(sym->mft_no), symnode,&gNTFSVnodeOps, 0777, 0)) != 0)
ERRPRINT("fs_symlink - new_vnode failed for vnid %Ld: %s\n", MREF(sym->mft_no), strerror(result));
put_vnode(ns->id, MREF(sym->mft_no) );
put_vnode(_vol, MREF(sym->mft_no) );
#ifdef __HAIKU__
notify_entry_created(ns->id, MREF( bi->mft_no ), name, MREF(sym->mft_no));
#else
notify_listener(B_ENTRY_CREATED, ns->id, MREF(bi->mft_no), 0, MREF(sym->mft_no), name);
#endif
exit:
@@ -1423,16 +1284,11 @@ exit:
}
#ifdef __HAIKU__
status_t
fs_mkdir(void *_ns, void *_node, const char *name, int perms, ino_t *_vnid)
#else
int
fs_mkdir(void *_ns, void *_node, const char *name, int perms)
#endif
fs_mkdir(fs_volume *_vol, fs_vnode *_dir, const char *name, int perms, ino_t *_vnid)
{
nspace *ns = (nspace*)_ns;
vnode *dir = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *dir = (vnode*)_dir->private_node;
vnode *newNode =NULL;
ntfschar *uname = NULL;
int uname_len;
@@ -1449,7 +1305,7 @@ fs_mkdir(void *_ns, void *_node, const char *name, int perms)
ERRPRINT("fs_mkdir - ENTER: name=%s\n",name);
if(_ns==NULL || _node==NULL || name==NULL) {
if(_vol==NULL || _dir==NULL || name==NULL) {
result = EINVAL;
goto exit;
}
@@ -1460,14 +1316,6 @@ fs_mkdir(void *_ns, void *_node, const char *name, int perms)
goto exit;
}
#ifndef __HAIKU__
if (is_vnode_removed(ns->id, MREF(bi->mft_no)) > 0) {
ERRPRINT("fs_mkdir - called in removed directory\n");
result = EPERM;
goto exit;
}
#endif
if (! bi->mrec->flags & MFT_RECORD_IS_DIRECTORY) {
result = EINVAL;
goto exit;
@@ -1495,20 +1343,15 @@ fs_mkdir(void *_ns, void *_node, const char *name, int perms)
newNode->parent_vnid = MREF(bi->mft_no);
set_mime(newNode, ".***");
result = publish_vnode(ns->id, vnid, (void*)newNode);
#ifdef __HAIKU__
result = publish_vnode(_vol, vnid, (void*)newNode,&gNTFSVnodeOps, 0777, 0);
*_vnid = vnid;
#endif
put_vnode(ns->id, MREF(ni->mft_no));
put_vnode(_vol, MREF(ni->mft_no));
ntfs_mark_free_space_outdated(ns);
#ifdef __HAIKU__
notify_entry_created(ns->id, MREF( bi->mft_no ), name, vnid);
#else
notify_listener(B_ENTRY_CREATED, ns->id, MREF( bi->mft_no ), 0, vnid, name);
#endif
}
else
result = errno;
@@ -1527,17 +1370,12 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *newname)
#else
int
fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *newname)
#endif
fs_rename(fs_volume *_vol, fs_vnode *_odir, const char *oldname, fs_vnode *_ndir, const char *newname)
{
nspace *ns = (nspace*)_ns;
vnode *odir = (vnode*)_odir;
vnode *ndir = (vnode*)_ndir;
nspace *ns = (nspace*)_vol->private_volume;
vnode *odir = (vnode*)_odir->private_node;
vnode *ndir = (vnode*)_ndir->private_node;
vnode *onode = NULL;
vnode *nnode = NULL;
@@ -1564,7 +1402,7 @@ fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *
ERRPRINT("fs_rename - oldname:%s newname:%s\n", oldname, newname);
if (_ns == NULL || _odir == NULL || _ndir == NULL
if (_vol == NULL || _odir == NULL || _ndir == NULL
|| oldname == NULL || *oldname == '\0'
|| newname == NULL || *newname == '\0'
|| !strcmp(oldname, ".") || !strcmp(oldname, "..")
@@ -1604,7 +1442,7 @@ fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *
goto exit;
}
result = get_vnode( ns->id, ovnid, (void**)&onode );
result = get_vnode( _vol, ovnid, (void**)&onode );
if( result != B_NO_ERROR)
goto exit;
@@ -1614,12 +1452,12 @@ fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *
if(ndi!=NULL) {
nvnid = MREF( ntfs_inode_lookup_by_name(ndi, unewname, unewname_len) );
if (nvnid != (u64) -1)
get_vnode( ns->id, nvnid, (void**)&nnode );
get_vnode( _vol, nvnid, (void**)&nnode );
}
if(nnode!=NULL) {
result = EINVAL;
put_vnode(ns->id, nnode->vnid);
put_vnode(_vol, nnode->vnid);
goto exit;
}
@@ -1652,25 +1490,20 @@ fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *
onode->parent_vnid = MREF( ndi->mft_no );
#ifdef __HAIKU__
notify_entry_moved(ns->id, MREF( odi->mft_no ), oldname, MREF( ndi->mft_no ), newname, onode->vnid );
notify_attribute_changed(ns->id, onode->vnid, "BEOS:TYPE", B_ATTR_CHANGED);
#else
notify_listener(B_ENTRY_MOVED, ns->id, MREF( odi->mft_no ), MREF( ndi->mft_no ), MREF( onode->vnid ), newname);
notify_listener(B_ATTR_CHANGED, ns->id, 0, 0, onode->vnid, "BEOS:TYPE");
#endif
put_vnode(ns->id, onode->vnid );
put_vnode(_vol, onode->vnid );
} else { //renaming
nvnid = MREF( ntfs_inode_lookup_by_name(odi, unewname, unewname_len) );
if (nvnid != (u64) -1)
get_vnode( ns->id, nvnid, (void**)&nnode );
get_vnode( _vol, nvnid, (void**)&nnode );
if(nnode!=NULL) {
result = EINVAL;
put_vnode(ns->id, nnode->vnid);
put_vnode( _vol, nnode->vnid);
goto exit;
}
@@ -1700,14 +1533,9 @@ fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *
}
ntfs_delete(oi, odi, uoldname, uoldname_len);
#ifdef __HAIKU__
notify_entry_moved(ns->id, MREF( odi->mft_no ), oldname, MREF( odi->mft_no ), newname, onode->vnid );
notify_attribute_changed(ns->id, onode->vnid, "BEOS:TYPE", B_ATTR_CHANGED);
#else
notify_listener(B_ENTRY_MOVED, ns->id, MREF( odi->mft_no ), MREF( odi->mft_no ), MREF( onode->vnid ), newname);
notify_listener(B_ATTR_CHANGED, ns->id, 0, 0, onode->vnid, "BEOS:TYPE");
#endif
put_vnode(ns->id, onode->vnid );
put_vnode(_vol, onode->vnid );
}
@@ -1729,9 +1557,10 @@ exit:
}
status_t
do_unlink(nspace *vol, vnode *dir, const char *name, bool isdir)
do_unlink(fs_volume *_vol, vnode *dir, const char *name, bool isdir)
{
ino_t vnid;
nspace *vol = (nspace*)_vol->private_volume;
ino_t vnid;
vnode *node = NULL;
ntfs_inode *ni = NULL;
ntfs_inode *bi = NULL;
@@ -1758,7 +1587,7 @@ do_unlink(nspace *vol, vnode *dir, const char *name, bool isdir)
goto exit1;
}
result = get_vnode(vol->id, vnid, (void**) & node);
result = get_vnode(_vol, vnid, (void**) & node);
if(result != B_NO_ERROR || node==NULL)
{
@@ -1793,15 +1622,11 @@ do_unlink(nspace *vol, vnode *dir, const char *name, bool isdir)
node->parent_vnid = dir->vnid;
#ifdef __HAIKU__
notify_entry_removed(vol->id, dir->vnid, name, vnid);
#else
notify_listener(B_ENTRY_REMOVED, vol->id, MREF(dir->vnid), 0, vnid, NULL);
#endif
result = remove_vnode(vol->id, vnid);
result = remove_vnode(_vol, vnid);
exit2:
put_vnode(vol->id, vnid);
put_vnode(_vol, vnid);
exit1:
if(uname!=NULL)
free(uname);
@@ -1816,16 +1641,11 @@ exit1:
}
#ifdef __HAIKU__
status_t
fs_rmdir(void *_ns, void *_node, const char *name)
#else
int
fs_rmdir(void *_ns, void *_node, const char *name)
#endif
fs_rmdir(fs_volume *_vol, fs_vnode *_dir, const char *name)
{
nspace *ns = (nspace*)_ns;
vnode *dir = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *dir = (vnode*)_dir->private_node;
status_t result = B_NO_ERROR;
if (ns->flags & B_FS_IS_READONLY) {
@@ -1852,7 +1672,7 @@ fs_rmdir(void *_ns, void *_node, const char *name)
goto exit1;
}
result = do_unlink(ns, dir, name, true);
result = do_unlink(_vol, dir, name, true);
ntfs_mark_free_space_outdated(ns);
@@ -1866,16 +1686,11 @@ exit1:
}
#ifdef __HAIKU__
status_t
fs_unlink(void *_ns, void *_node, const char *name)
#else
int
fs_unlink(void *_ns, void *_node, const char *name)
#endif
fs_unlink(fs_volume *_vol, fs_vnode *_dir, const char *name)
{
nspace *ns = (nspace*)_ns;
vnode *dir = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *dir = (vnode*)_dir->private_node;
status_t result = B_NO_ERROR;
if (ns->flags & B_FS_IS_READONLY) {
@@ -1902,7 +1717,7 @@ fs_unlink(void *_ns, void *_node, const char *name)
goto exit;
}
result = do_unlink(ns, dir, name, false);
result = do_unlink(_vol, dir, name, false);
ntfs_mark_free_space_outdated(ns);
+34 -67
View File
@@ -42,80 +42,47 @@
#include "lock.h"
#include "volume_util.h"
extern fs_vnode_ops gNTFSVnodeOps;
extern fs_volume_ops gNTFSVolumeOps;
#ifdef __HAIKU__
float fs_identify_partition(int fd, partition_data *partition, void **_cookie);
status_t fs_scan_partition(int fd, partition_data *partition, void *_cookie);
void fs_free_identify_partition_cookie(partition_data *partition, void *_cookie);
status_t fs_mount(dev_t nsid, const char *device, ulong flags, const char *args, void **data, ino_t *vnid);
status_t fs_create_symlink(void *_ns, void *_dir, const char *name, const char *target, int mode);
status_t fs_create(void *_ns, void *_dir, const char *name, int omode, int perms, void **_cookie, ino_t *_vnid);
status_t fs_walk(void *_ns, void *_base, const char *file, ino_t *vnid,int *_type);
status_t fs_get_vnode_name(void *_ns, void *_node, char *buffer, size_t bufferSize);
status_t fs_unmount(void *_ns);
status_t fs_rfsstat(void *_ns, struct fs_info *);
status_t fs_wfsstat(void *_vol, const struct fs_info *fss, uint32 mask);
status_t fs_sync(void *_ns);
status_t fs_read_vnode(void *_ns, ino_t vnid, void **_node, bool reenter);
status_t fs_write_vnode(void *_ns, void *_node, bool reenter);
status_t fs_remove_vnode( void *_ns, void *_node, bool reenter );
status_t fs_access( void *ns, void *node, int mode );
status_t fs_rstat(void *_ns, void *_node, struct stat *st);
status_t fs_wstat(void *_vol, void *_node, const struct stat *st, uint32 mask);
status_t fs_open(void *_ns, void *_node, int omode, void **cookie);
status_t fs_close(void *ns, void *node, void *cookie);
status_t fs_free_cookie(void *ns, void *node, void *cookie);
status_t fs_read(void *_ns, void *_node, void *cookie, off_t pos, void *buf, size_t *len);
status_t fs_write(void *ns, void *node, void *cookie, off_t pos, const void *buf, size_t *len);
status_t fs_mkdir(void *_ns, void *_node, const char *name, int perms, ino_t *_vnid);
status_t fs_rmdir(void *_ns, void *dir, const char *name);
status_t fs_opendir(void* _ns, void* _node, void** cookie);
status_t fs_readdir( void *_ns, void *_node, void *_cookie, struct dirent *buf, size_t bufsize, uint32 *num );
status_t fs_rewinddir(void *_ns, void *_node, void *cookie);
status_t fs_closedir(void *_ns, void *_node, void *cookie);
status_t fs_free_dircookie(void *_ns, void *_node, void *cookie);
status_t fs_readlink(void *_ns, void *_node, char *buf, size_t *bufsize);
status_t fs_fsync(void *_ns, void *_node);
status_t fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *newname);
status_t fs_unlink(void *_ns, void *_node, const char *name);
status_t fs_mount(fs_volume *_vol, const char *device, ulong flags, const char *args, ino_t *vnid);
status_t fs_create_symlink(fs_volume *volume, fs_vnode *dir, const char *name, const char *target, int mode);
status_t fs_create(fs_volume *volume, fs_vnode *dir, const char *name, int omode, int perms, void **_cookie, ino_t *_vnid);
status_t fs_walk(fs_volume *_vol, fs_vnode *_dir, const char *file, ino_t *vnid);
status_t fs_get_vnode_name(fs_volume *volume, fs_vnode *vnode, char *buffer, size_t bufferSize);
status_t fs_unmount(fs_volume *_vol);
status_t fs_rfsstat(fs_volume *_vol, struct fs_info *);
status_t fs_wfsstat(fs_volume *_vol, const struct fs_info *fss, uint32 mask);
status_t fs_sync(fs_volume *_vol);
status_t fs_read_vnode(fs_volume *_vol, ino_t vnid, fs_vnode *_node, int *_type, uint32 *_flags, bool reenter);
status_t fs_write_vnode(fs_volume *volume, fs_vnode *vnode, bool reenter);
status_t fs_remove_vnode(fs_volume *volume, fs_vnode *vnode, bool reenter);
status_t fs_access(fs_volume *volume, fs_vnode *vnode, int mode);
status_t fs_rstat(fs_volume *volume, fs_vnode *vnode, struct stat *st);
status_t fs_wstat(fs_volume *volume, fs_vnode *vnode, const struct stat *st, uint32 mask);
status_t fs_open(fs_volume *volume, fs_vnode *vnode, int omode, void **cookie);
status_t fs_close(fs_volume *volume, fs_vnode *vnode, void *cookie);
status_t fs_free_cookie(fs_volume *volume, fs_vnode *vnode, void *cookie);
status_t fs_read(fs_volume *volume, fs_vnode *vnode, void *cookie, off_t pos, void *buf, size_t *len);
status_t fs_write(fs_volume *volume, fs_vnode *vnode, void *cookie, off_t pos, const void *buf, size_t *len);
status_t fs_mkdir(fs_volume *volume, fs_vnode *parent, const char *name, int perms, ino_t *_vnid);
status_t fs_rmdir(fs_volume *volume, fs_vnode *parent, const char *name);
status_t fs_opendir(fs_volume *volume, fs_vnode *vnode, void** cookie);
status_t fs_readdir(fs_volume *volume, fs_vnode *vnode, void *_cookie, struct dirent *buf, size_t bufsize, uint32 *num );
status_t fs_rewinddir(fs_volume *volume, fs_vnode *vnode, void *cookie);
status_t fs_closedir(fs_volume *volume, fs_vnode *vnode, void *cookie);
status_t fs_free_dircookie(fs_volume *volume, fs_vnode *vnode, void *cookie);
status_t fs_readlink(fs_volume *volume, fs_vnode *link, char *buf, size_t *bufsize);
status_t fs_fsync(fs_volume *_vol, fs_vnode *_node);
status_t fs_rename(fs_volume *volume, fs_vnode *fromDir, const char *fromName, fs_vnode *toDir, const char *toName);
status_t fs_unlink(fs_volume *volume, fs_vnode *dir, const char *name);
#else
int fs_mount(nspace_id nsid, const char *device, ulong flags, void *parms, size_t len, void **data, ino_t *vnid);
int fs_unmount(void *_ns);
int fs_walk(void *_ns, void *_base, const char *file, char **newpath, ino_t *vnid);
int fs_read_vnode(void *_ns, ino_t vnid, char r, void **node);
int fs_write_vnode(void *_ns, void *_node, char r);
int fs_rstat(void *_ns, void *_node, struct stat *st);
int fs_wstat(void *_vol, void *_node, struct stat *st, long mask);
int fs_open(void *_ns, void *_node, int omode, void **cookie);
int fs_read(void *_ns, void *_node, void *cookie, off_t pos, void *buf, size_t *len);
int fs_write(void *ns, void *node, void *cookie, off_t pos, const void *buf, size_t *len);
int fs_free_cookie(void *ns, void *node, void *cookie);
int fs_close(void *ns, void *node, void *cookie);
int fs_access(void *_ns, void *_node, int mode);
int fs_opendir(void* _ns, void* _node, void** cookie);
int fs_readdir(void *_ns, void *_node, void *cookie, long *num, struct dirent *buf, size_t bufsize);
int fs_rewinddir(void *_ns, void *_node, void *cookie);
int fs_closedir(void *_ns, void *_node, void *cookie);
int fs_free_dircookie(void *_ns, void *_node, void *cookie);
int fs_rfsstat(void *_ns, struct fs_info *);
int fs_wfsstat(void *_vol, struct fs_info *fss, long mask);
int fs_readlink(void *_ns, void *_node, char *buf, size_t *bufsize);
int fs_mkdir(void *_ns, void *_node, const char *name, int perms);
int fs_rmdir(void *_ns, void *dir, const char *name);
int fs_remove_vnode( void *_ns, void *_node, char reenter );
int fs_rename(void *_ns, void *_odir, const char *oldname, void *_ndir, const char *newname);
int fs_create(void *_ns, void *_dir, const char *name, int omode, int perms, ino_t *_vnid, void **_cookie);
int fs_unlink(void *_ns, void *_node, const char *name);
int fs_fsync(void *_ns, void *_node);
int fs_sync(void *_ns);
int fs_create_symlink(void *ns, void *_dir, const char *name, const char *path);
#endif //__HAIKU__
status_t do_unlink(nspace *vol, vnode *dir, const char *name, bool isdir);
status_t do_unlink(fs_volume *volume, vnode *dir, const char *name, bool isdir);
#endif
@@ -33,7 +33,6 @@
#include <malloc.h>
#include <stdio.h>
#ifdef __HAIKU__
#include <fs_interface.h>
#include <kernel/lock.h>
@@ -47,22 +46,11 @@
#include <NodeMonitor.h>
#include <util/kernel_cpp.h>
#else
#include "fsproto.h"
#include "lock.h"
#define publish_vnode new_vnode
#endif
#include "fs_func.h"
#include "ntfsdir.h"
#include "attributes.h"
#ifdef __HAIKU__
static status_t
ntfs_std_ops(int32 op, ...)
{
@@ -76,54 +64,59 @@ ntfs_std_ops(int32 op, ...)
}
}
static file_system_module_info sNTFSFileSystem = {
{
"file_systems/ntfs" B_CURRENT_FS_API_VERSION,
0,
ntfs_std_ops,
},
"ntfs", // short_name
"Windows NT File System", // pretty_name
0, // DDM flags
// scanning
fs_identify_partition,
fs_scan_partition,
fs_free_identify_partition_cookie,
NULL, // free_partition_content_cookie()
&fs_mount,
fs_volume_ops gNTFSVolumeOps = {
&fs_unmount,
&fs_rfsstat,
&fs_wfsstat,
NULL,
&fs_sync,
&fs_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 gNTFSVnodeOps = {
/* vnode operations */
&fs_walk,
&fs_get_vnode_name,
&fs_read_vnode,
&fs_write_vnode,
&fs_remove_vnode,
/* VM file access */
NULL, // &fs_can_page
NULL, // &fs_read_pages
NULL, // &fs_write_pages
NULL,
NULL,
NULL,
NULL, // &fs_get_file_map
NULL, // io()
NULL, // cancel_io()
NULL, // &fs_ioctl
NULL, // &fs_set_flags
NULL, // &fs_select
NULL, // &fs_deselect
NULL,
NULL,
NULL, //&fs_set_flags,
NULL, //&fs_select
NULL, //&fs_deselect
&fs_fsync,
&fs_readlink,
&fs_create_symlink,
NULL, // &fs_link,
&fs_readlink,
&fs_create_symlink,
NULL, //&fs_link,
&fs_unlink,
&fs_rename,
@@ -147,7 +140,7 @@ static file_system_module_info sNTFSFileSystem = {
&fs_free_dircookie,
&fs_readdir,
&fs_rewinddir,
/* attribute directory operations */
&fs_open_attrib_dir,
&fs_close_attrib_dir,
@@ -167,103 +160,32 @@ static file_system_module_info sNTFSFileSystem = {
NULL, //&fs_write_attr_stat,
NULL, //&fs_rename_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
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
};
static file_system_module_info sNTFSFileSystem = {
{
"file_systems/ntfs" B_CURRENT_FS_API_VERSION,
0,
ntfs_std_ops,
},
"ntfs", // short_name
"Windows NT File System", // pretty_name
B_DISK_SYSTEM_SUPPORTS_WRITING, // DDM flags
// scanning
fs_identify_partition,
fs_scan_partition,
fs_free_identify_partition_cookie,
NULL, // free_partition_content_cookie()
&fs_mount,
};
module_info *modules[] = {
(module_info *)&sNTFSFileSystem,
NULL,
};
#else
int32 api_version = B_CUR_FS_API_VERSION;
vnode_ops fs_entry = {
&fs_read_vnode, /* read_vnode func ptr */
&fs_write_vnode, /* write_vnode func ptr */
&fs_remove_vnode, /* remove_vnode func ptr */
NULL, /* secure_vnode func ptr */
&fs_walk, /* walk func ptr */
&fs_access, /* access func ptr */
&fs_create, /* create func ptr */
&fs_mkdir, /* mkdir func ptr */
&fs_create_symlink,
NULL,
&fs_rename,
&fs_unlink, /* unlink func ptr */
&fs_rmdir, /* rmdir func ptr */
&fs_readlink, /* readlink func ptr */
&fs_opendir, /* opendir func ptr */
&fs_closedir, /* closedir func ptr */
&fs_free_dircookie, /* free_dircookie func ptr */
&fs_rewinddir, /* rewinddir func ptr */
&fs_readdir, /* readdir func ptr */
&fs_open, /* open file func ptr */
&fs_close, /* close file func ptr */
&fs_free_cookie, /* free cookie func ptr */
&fs_read, /* read file func ptr */
&fs_write, /* write file func ptr */
NULL, /* readv */
NULL, /* writev */
NULL, /* ioctl func ptr */
NULL, /* setflags file func ptr */
&fs_rstat, /* rstat func ptr */
&fs_wstat, /* wstat func ptr */
&fs_fsync,
NULL, /* initialize func ptr */
&fs_mount, /* mount func ptr */
&fs_unmount, /* unmount func ptr */
&fs_sync, /* sync func ptr */
&fs_rfsstat, /* rfsstat func ptr */
&fs_wfsstat, /* wfsstat func ptr */
NULL, // select
NULL, // deselect
NULL, // open_indexdir
NULL, // close_indexdir
NULL, // free_indexdircookie
NULL, // rewind_indexdir
NULL, // read_indexdir
NULL, // create_index
NULL, // remove_index
NULL, // rename_index
NULL, // stat_index
&fs_open_attrib_dir, // open_attrdir
&fs_close_attrib_dir, // close_attrdir
&fs_free_attrib_dir_cookie, // free_attrdircookie
&fs_rewind_attrib_dir, // rewind_attrdir
&fs_read_attrib_dir, // read_attrdir
&fs_write_attrib, // write_attr
&fs_read_attrib, // read_attr
NULL, // remove_attr
NULL, // rename_attr
&fs_read_attrib_stat, // stat_attr
NULL, // open_query
NULL, // close_query
NULL, // free_querycookie
NULL // read_query
};
#endif
+12 -37
View File
@@ -69,15 +69,10 @@ static int _ntfs_dirent_filler(void *_dirent, const ntfschar *name,
return 0;
}
#ifdef __HAIKU__
status_t
fs_free_dircookie( void *_ns, void *node, void *cookie )
#else
int
fs_free_dircookie( void *_ns, void *node, void *cookie )
#endif
fs_free_dircookie( fs_volume *_vol, fs_vnode *vnode, void *cookie )
{
nspace *ns = (nspace*)_ns;
nspace *ns = (nspace*)_vol->private_volume;
LOCK_VOL(ns);
ERRPRINT("fs_free_dircookie - ENTER\n");
@@ -91,16 +86,11 @@ fs_free_dircookie( void *_ns, void *node, void *cookie )
return B_NO_ERROR;
}
#ifdef __HAIKU__
status_t
fs_opendir( void *_ns, void *_node, void **_cookie )
#else
int
fs_opendir( void *_ns, void *_node, void **_cookie )
#endif
fs_opendir( fs_volume *_vol, fs_vnode *_node, void** _cookie )
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_node->private_node;
dircookie *cookie = (dircookie*)ntfs_calloc( sizeof(dircookie) );
int result = B_NO_ERROR;
ntfs_inode *ni=NULL;
@@ -141,15 +131,10 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_closedir( void *_ns, void *node, void *_cookie )
#else
int
fs_closedir( void *_ns, void *node, void *_cookie )
#endif
fs_closedir( fs_volume *_vol, fs_vnode *_node, void *cookie )
{
nspace *ns = (nspace*)_ns;
nspace *ns = (nspace*)_vol->private_volume;
LOCK_VOL(ns);
@@ -162,16 +147,11 @@ fs_closedir( void *_ns, void *node, void *_cookie )
return B_NO_ERROR;
}
#ifdef __HAIKU__
status_t
fs_readdir( void *_ns, void *_node, void *_cookie, struct dirent *buf, size_t bufsize, uint32 *num )
#else
int
fs_readdir(void *_ns, void *_node, void *_cookie, long *num, struct dirent *buf, size_t bufsize)
#endif
fs_readdir( fs_volume *_vol, fs_vnode *_node, void *_cookie, struct dirent *buf, size_t bufsize, uint32 *num )
{
nspace *ns = (nspace*)_ns;
vnode *node = (vnode*)_node;
nspace *ns = (nspace*)_vol->private_volume;
vnode *node = (vnode*)_node->private_node;
dircookie *cookie = (dircookie*)_cookie;
uint32 nameLength = bufsize - sizeof(buf) + 1, realLen;
int result = B_NO_ERROR;
@@ -230,15 +210,10 @@ exit:
return result;
}
#ifdef __HAIKU__
status_t
fs_rewinddir( void *_ns, void *_node, void *_cookie )
#else
int
fs_rewinddir( void *_ns, void *_node, void *_cookie )
#endif
fs_rewinddir( fs_volume *_vol, fs_vnode *vnode, void *_cookie )
{
nspace *ns = (nspace*)_ns;
nspace *ns = (nspace*)_vol->private_volume;
dircookie *cookie = (dircookie*)_cookie;
int result = EINVAL;
+5 -17
View File
@@ -31,22 +31,10 @@ typedef struct dircookie
char name[MAX_PATH];
} dircookie;
#ifdef __HAIKU__
status_t fs_free_dircookie( void *_ns, void *node, void *cookie );
status_t fs_opendir( void *_ns, void *_node, void **_cookie );
status_t fs_closedir( void *_ns, void *node, void *_cookie );
status_t fs_rewinddir( void *_ns, void *_node, void *_cookie );
status_t fs_readdir( void *_ns, void *_node, void *_cookie, struct dirent *buf, size_t bufsize, uint32 *num );
#else
int fs_free_dircookie( void *_ns, void *node, void *cookie );
int fs_opendir( void *_ns, void *_node, void **_cookie );
int fs_closedir( void *_ns, void *node, void *_cookie );
int fs_rewinddir( void *_ns, void *_node, void *_cookie );
int fs_readdir(void *_ns, void *_node, void *cookie, long *num, struct dirent *buf, size_t bufsize);
#endif //__HAIKU__
status_t fs_closedir(fs_volume *volume, fs_vnode *vnode, void *cookie);
status_t fs_free_dircookie(fs_volume *volume, fs_vnode *vnode, void *cookie);
status_t fs_opendir(fs_volume *volume, fs_vnode *vnode, void** cookie);
status_t fs_readdir(fs_volume *volume, fs_vnode *vnode, void *_cookie, struct dirent *buf, size_t bufsize, uint32 *num );
status_t fs_rewinddir(fs_volume *volume, fs_vnode *vnode, void *cookie);
#endif