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
+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);