diff --git a/headers/os/drivers/fs_interface.h b/headers/os/drivers/fs_interface.h index 2b65cce789..d39574592c 100644 --- a/headers/os/drivers/fs_interface.h +++ b/headers/os/drivers/fs_interface.h @@ -310,7 +310,7 @@ extern status_t publish_vnode(fs_volume *volume, ino_t vnodeID, void *privateNode, fs_vnode_ops *ops, int type, uint32 flags); extern status_t get_vnode(fs_volume *volume, ino_t vnodeID, - void **_privateNode, fs_vnode_ops **_vnodeOps); + void **_privateNode); extern status_t put_vnode(fs_volume *volume, ino_t vnodeID); extern status_t acquire_vnode(fs_volume *volume, ino_t vnodeID); extern status_t remove_vnode(fs_volume *volume, ino_t vnodeID); diff --git a/headers/private/fs_shell/fssh_fs_interface.h b/headers/private/fs_shell/fssh_fs_interface.h index 23f6f521b1..d4d406c9c8 100644 --- a/headers/private/fs_shell/fssh_fs_interface.h +++ b/headers/private/fs_shell/fssh_fs_interface.h @@ -344,8 +344,7 @@ extern fssh_status_t fssh_publish_vnode(fssh_fs_volume *volume, fssh_vnode_id vnodeID, void *privateNode, fssh_fs_vnode_ops *ops, int type, uint32_t flags); extern fssh_status_t fssh_get_vnode(fssh_fs_volume *volume, - fssh_vnode_id vnodeID, void **_privateNode, - fssh_fs_vnode_ops **_vnodeOps); + fssh_vnode_id vnodeID, void **_privateNode); extern fssh_status_t fssh_put_vnode(fssh_fs_volume *volume, fssh_vnode_id vnodeID); extern fssh_status_t fssh_acquire_vnode(fssh_fs_volume *volume, diff --git a/src/add-ons/kernel/file_systems/bfs/Inode.cpp b/src/add-ons/kernel/file_systems/bfs/Inode.cpp index 7733d72c25..1e0b25d8a8 100644 --- a/src/add-ons/kernel/file_systems/bfs/Inode.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Inode.cpp @@ -2701,7 +2701,7 @@ AttributeIterator::GetNext(char* name, size_t* _length, uint32* _type, // if you haven't yet access to the attributes directory, get it if (fAttributes == NULL) { if (get_vnode(volume->FSVolume(), volume->ToVnode(fInode->Attributes()), - (void**)&fAttributes, NULL) != B_OK) { + (void**)&fAttributes) != B_OK) { FATAL(("get_vnode() failed in AttributeIterator::GetNext(ino_t" " = %Ld,name = \"%s\")\n", fInode->ID(), name)); return B_ENTRY_NOT_FOUND; diff --git a/src/add-ons/kernel/file_systems/bfs/Inode.h b/src/add-ons/kernel/file_systems/bfs/Inode.h index e06efc17a8..3547011ba2 100644 --- a/src/add-ons/kernel/file_systems/bfs/Inode.h +++ b/src/add-ons/kernel/file_systems/bfs/Inode.h @@ -354,8 +354,7 @@ public: { Unset(); - return fStatus = get_vnode(volume->FSVolume(), id, (void**)&fInode, - NULL); + return fStatus = get_vnode(volume->FSVolume(), id, (void**)&fInode); } status_t SetTo(Volume* volume, block_run run) diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp index 49f693c541..81682ee15b 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -556,7 +556,7 @@ bfs_lookup(fs_volume* _volume, fs_vnode* _directory, const char* file, locker.Unlock(); Inode* inode; - status = get_vnode(volume->FSVolume(), *_vnodeID, (void**)&inode, NULL); + status = get_vnode(volume->FSVolume(), *_vnodeID, (void**)&inode); if (status != B_OK) { REPORT_ERROR(status); return B_ENTRY_NOT_FOUND; diff --git a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp index e30a6f3172..91e2da77f6 100644 --- a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp @@ -1493,7 +1493,7 @@ cdda_lookup(fs_volume* _volume, fs_vnode* _dir, const char* name, ino_t* _id) if (inode == NULL) return B_ENTRY_NOT_FOUND; - status = get_vnode(volume->FSVolume(), inode->ID(), NULL, NULL); + status = get_vnode(volume->FSVolume(), inode->ID(), NULL); if (status < B_OK) return status; diff --git a/src/add-ons/kernel/file_systems/ext2/Volume.cpp b/src/add-ons/kernel/file_systems/ext2/Volume.cpp index 480e67d689..0a30ab77dc 100644 --- a/src/add-ons/kernel/file_systems/ext2/Volume.cpp +++ b/src/add-ons/kernel/file_systems/ext2/Volume.cpp @@ -310,7 +310,7 @@ Volume::Mount(const char* deviceName, uint32 flags) if ((fBlockCache = opener.InitCache(NumBlocks(), fBlockSize)) == NULL) return B_ERROR; - status = get_vnode(fFSVolume, EXT2_ROOT_NODE, (void**)&fRootNode, NULL); + status = get_vnode(fFSVolume, EXT2_ROOT_NODE, (void**)&fRootNode); if (status != B_OK) { TRACE("could not create root node: get_vnode() failed!\n"); return status; diff --git a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp index 4268a80fdb..5804d1f9ab 100644 --- a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp @@ -319,7 +319,7 @@ ext2_lookup(fs_volume* _volume, fs_vnode* _directory, const char* name, break; } - return get_vnode(volume->FSVolume(), *_vnodeID, NULL, NULL); + return get_vnode(volume->FSVolume(), *_vnodeID, NULL); } diff --git a/src/add-ons/kernel/file_systems/fat/dir.c b/src/add-ons/kernel/file_systems/fat/dir.c index 4fba295480..e0ce4d2c40 100644 --- a/src/add-ons/kernel/file_systems/fat/dir.c +++ b/src/add-ons/kernel/file_systems/fat/dir.c @@ -433,7 +433,7 @@ findfile(nspace *vol, vnode *dir, const char *file, ino_t *vnid, if (vnid) *vnid = found_vnid; if (node) - result = get_vnode(vol->volume, found_vnid, (void **)node, NULL); + result = get_vnode(vol->volume, found_vnid, (void **)node); result = B_OK; } else { result = ENOENT; diff --git a/src/add-ons/kernel/file_systems/fat/file.c b/src/add-ons/kernel/file_systems/fat/file.c index 88e6f8799e..8f14df5f48 100644 --- a/src/add-ons/kernel/file_systems/fat/file.c +++ b/src/add-ons/kernel/file_systems/fat/file.c @@ -890,7 +890,7 @@ dosfs_create(fs_volume *_vol, fs_vnode *_dir, const char *name, int omode, *vnid = dummy.vnid; dummy.magic = ~VNODE_MAGIC; - result = get_vnode(_vol, *vnid, (void **)&file, NULL); + result = get_vnode(_vol, *vnid, (void **)&file); if (result < B_OK) { if (vol->fs_flags & FS_FLAGS_OP_SYNC) _dosfs_sync(vol); @@ -1155,7 +1155,7 @@ dosfs_rename(fs_volume *_vol, fs_vnode *_odir, const char *oldname, if (vnid == vol->root_vnode.vnid) break; - result = get_vnode(_vol, vnid, (void **)&dir, NULL); + result = get_vnode(_vol, vnid, (void **)&dir); if (result < B_OK) goto bi1; parent = dir->dir_vnid; diff --git a/src/add-ons/kernel/file_systems/iso9660/kernel_interface.cpp b/src/add-ons/kernel/file_systems/iso9660/kernel_interface.cpp index aa9f62bdd2..6c9d750ede 100644 --- a/src/add-ons/kernel/file_systems/iso9660/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/iso9660/kernel_interface.cpp @@ -225,12 +225,12 @@ fs_walk(fs_volume *_vol, fs_vnode *_base, const char *file, ino_t *_vnodeID) // base directory TRACE(("fs_walk - found \".\" file.\n")); *_vnodeID = baseNode->id; - return get_vnode(_vol, *_vnodeID, NULL, NULL); + return get_vnode(_vol, *_vnodeID, NULL); } else if (strcmp(file, "..") == 0) { // parent directory TRACE(("fs_walk - found \"..\" file.\n")); *_vnodeID = baseNode->parID; - return get_vnode(_vol, *_vnodeID, NULL, NULL); + return get_vnode(_vol, *_vnodeID, NULL); } // look up file in the directory @@ -273,7 +273,7 @@ fs_walk(fs_volume *_vol, fs_vnode *_base, const char *file, ino_t *_vnodeID) TRACE(("fs_walk - New vnode id is %Ld\n", *_vnodeID)); result = get_vnode(_vol, *_vnodeID, - (void **)&newNode, NULL); + (void **)&newNode); if (result == B_OK) { newNode->parID = baseNode->id; done = true; diff --git a/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c b/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c index 31d3ad1017..a327c8de39 100644 --- a/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c +++ b/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c @@ -898,7 +898,7 @@ fs_walk(fs_volume *_volume, fs_vnode *_base, const char *file, ino_t *vnid) isLink=S_ISLNK(st.st_mode); } - if ((result=get_vnode (_volume,*vnid,(void **)&dummy,NULL))super_volume; } bool WriteSupport() { return fWriteSupport; } @@ -83,6 +84,7 @@ public: status_t InitCheck(); + fs_volume * Volume() { return fVolume->Volume(); } fs_volume * SuperVolume() { return fVolume->SuperVolume(); } fs_vnode * SuperVnode() { return &fSuperVnode; } ino_t InodeNumber() { return fInodeNumber; } @@ -114,7 +116,8 @@ private: class AttributeFile { public: - AttributeFile(fs_volume *volume, fs_vnode *vnode); + AttributeFile(fs_volume *overlay, fs_volume *volume, + fs_vnode *vnode); ~AttributeFile(); status_t InitCheck() { return fStatus; } @@ -123,8 +126,8 @@ public: ino_t FileInode() { return fFileInode; } status_t CreateEmpty(); - status_t WriteAttributeFile(fs_volume *volume, - fs_vnode *vnode); + status_t WriteAttributeFile(fs_volume *overlay, + fs_volume *volume, fs_vnode *vnode); status_t ReadAttributeDir(struct dirent *dirent, size_t bufferSize, uint32 *numEntries, @@ -286,8 +289,8 @@ status_t OverlayInode::GetAttributeFile(AttributeFile **attributeFile) { if (fAttributeFile == NULL) { - fAttributeFile = new(std::nothrow) AttributeFile(SuperVolume(), - &fSuperVnode); + fAttributeFile = new(std::nothrow) AttributeFile(Volume(), + SuperVolume(), &fSuperVnode); if (fAttributeFile == NULL) { TRACE_ALWAYS("no memory to allocate attribute file\n"); return B_NO_MEMORY; @@ -321,7 +324,8 @@ OverlayInode::WriteAttributeFile() if (result != B_OK) return result; - return fAttributeFile->WriteAttributeFile(SuperVolume(), &fSuperVnode); + return fAttributeFile->WriteAttributeFile(Volume(), SuperVolume(), + &fSuperVnode); } @@ -553,7 +557,8 @@ OverlayInode::Write(void *_cookie, off_t position, const void *buffer, // #pragma mark AttributeFile -AttributeFile::AttributeFile(fs_volume *volume, fs_vnode *vnode) +AttributeFile::AttributeFile(fs_volume *overlay, fs_volume *volume, + fs_vnode *vnode) : fStatus(B_NO_INIT), fVolumeID(volume->id), fFileInode(0), @@ -633,13 +638,14 @@ AttributeFile::AttributeFile(fs_volume *volume, fs_vnode *vnode) else if (i == 2) fAttributeFileInode = inodeNumber; - fStatus = get_vnode(volume, inodeNumber, ¤tVnode.private_node, - ¤tVnode.ops); + OverlayInode *overlayInode = NULL; + fStatus = get_vnode(overlay, inodeNumber, (void **)&overlayInode); if (fStatus != B_OK) { TRACE_ALWAYS("getting vnode failed: %s\n", strerror(fStatus)); return; } + currentVnode = *overlayInode->SuperVnode(); lastInodeNumber = inodeNumber; } @@ -767,7 +773,8 @@ AttributeFile::CreateEmpty() status_t -AttributeFile::WriteAttributeFile(fs_volume *volume, fs_vnode *vnode) +AttributeFile::WriteAttributeFile(fs_volume *overlay, fs_volume *volume, + fs_vnode *vnode) { if (fFile == NULL) return B_NO_INIT; @@ -787,15 +794,17 @@ AttributeFile::WriteAttributeFile(fs_volume *volume, fs_vnode *vnode) } fs_vnode currentVnode; + OverlayInode *overlayInode = NULL; if (fAttributeDirInode == 0) { - result = get_vnode(volume, fDirectoryInode, - ¤tVnode.private_node, ¤tVnode.ops); + result = get_vnode(overlay, fDirectoryInode, (void **)&overlayInode); if (result != B_OK) { TRACE_ALWAYS("failed to get directory vnode: %s\n", strerror(result)); return result; } + currentVnode = *overlayInode->SuperVnode(); + // create the attribute directory result = currentVnode.ops->create_dir(volume, ¤tVnode, ATTRIBUTE_OVERLAY_ATTRIBUTE_DIR_NAME, S_IRWXU | S_IRWXG | S_IRWXO, @@ -813,14 +822,15 @@ AttributeFile::WriteAttributeFile(fs_volume *volume, fs_vnode *vnode) void *attrFileCookie = NULL; if (fAttributeFileInode == 0) { - result = get_vnode(volume, fAttributeDirInode, - ¤tVnode.private_node, ¤tVnode.ops); + result = get_vnode(overlay, fAttributeDirInode, (void **)&overlayInode); if (result != B_OK) { TRACE_ALWAYS("failed to get attribute directory vnode: %s\n", strerror(result)); return result; } + currentVnode = *overlayInode->SuperVnode(); + // create the attribute file result = currentVnode.ops->create(volume, ¤tVnode, nameBuffer, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP @@ -835,22 +845,24 @@ AttributeFile::WriteAttributeFile(fs_volume *volume, fs_vnode *vnode) return result; } - result = get_vnode(volume, fAttributeFileInode, - ¤tVnode.private_node, ¤tVnode.ops); + result = get_vnode(overlay, fAttributeFileInode, (void **)&overlayInode); if (result != B_OK) { TRACE_ALWAYS("getting attribute file vnode after create failed: %s\n", strerror(result)); return result; } + + currentVnode = *overlayInode->SuperVnode(); } else { - result = get_vnode(volume, fAttributeFileInode, - ¤tVnode.private_node, ¤tVnode.ops); + result = get_vnode(overlay, fAttributeFileInode, (void **)&overlayInode); if (result != B_OK) { TRACE_ALWAYS("getting attribute file vnode failed: %s\n", strerror(result)); return result; } + currentVnode = *overlayInode->SuperVnode(); + // open the attribute file result = currentVnode.ops->open(volume, ¤tVnode, O_RDWR | O_TRUNC, &attrFileCookie); @@ -1296,6 +1308,11 @@ static status_t overlay_get_super_vnode(fs_volume *volume, fs_vnode *vnode, fs_volume *superVolume, fs_vnode *_superVnode) { + if (volume == superVolume) { + *_superVnode = *vnode; + return B_OK; + } + OverlayInode *node = (OverlayInode *)vnode->private_node; fs_vnode *superVnode = node->SuperVnode(); diff --git a/src/add-ons/kernel/file_systems/reiserfs/Volume.cpp b/src/add-ons/kernel/file_systems/reiserfs/Volume.cpp index d5f0419847..7b86d7fa10 100644 --- a/src/add-ons/kernel/file_systems/reiserfs/Volume.cpp +++ b/src/add-ons/kernel/file_systems/reiserfs/Volume.cpp @@ -294,7 +294,7 @@ Volume::GetKeyOffsetForName(const char *name, int len, uint64 *result) status_t Volume::GetVNode(ino_t id, VNode **node) { - return get_vnode(GetFSVolume(), id, (void**)node, NULL); + return get_vnode(GetFSVolume(), id, (void**)node); } // PutVNode diff --git a/src/system/kernel/device_manager/devfs.cpp b/src/system/kernel/device_manager/devfs.cpp index 9feee876ef..f4b9a36012 100644 --- a/src/system/kernel/device_manager/devfs.cpp +++ b/src/system/kernel/device_manager/devfs.cpp @@ -407,8 +407,7 @@ add_partition(struct devfs* fs, struct devfs_vnode* device, const char* name, // increase reference count of raw device - // the partition device really needs it - status = get_vnode(fs->volume, device->id, (void**)&partition->raw_device, - NULL); + status = get_vnode(fs->volume, device->id, (void**)&partition->raw_device); if (status < B_OK) goto err1; @@ -959,7 +958,7 @@ devfs_lookup(fs_volume *_volume, fs_vnode *_dir, const char *name, ino_t *_id) return B_ENTRY_NOT_FOUND; } - status = get_vnode(fs->volume, vnode->id, NULL, NULL); + status = get_vnode(fs->volume, vnode->id, NULL); if (status < B_OK) return status; @@ -1063,7 +1062,7 @@ devfs_create(fs_volume* _volume, fs_vnode* _dir, const char* name, int openMode, if (openMode & O_EXCL) return B_FILE_EXISTS; - status = get_vnode(fs->volume, vnode->id, NULL, NULL); + status = get_vnode(fs->volume, vnode->id, NULL); if (status < B_OK) return status; @@ -2092,7 +2091,7 @@ devfs_unpublish_device(BaseDevice* device, bool disconnect) { devfs_vnode* node; status_t status = get_vnode(sDeviceFileSystem->volume, device->ID(), - (void**)&node, NULL); + (void**)&node); if (status != B_OK) return status; diff --git a/src/system/kernel/fs/rootfs.cpp b/src/system/kernel/fs/rootfs.cpp index d7d2ef1ef8..0c99d895f8 100644 --- a/src/system/kernel/fs/rootfs.cpp +++ b/src/system/kernel/fs/rootfs.cpp @@ -284,7 +284,7 @@ remove_node(struct rootfs *fs, struct rootfs_vnode *directory, { // schedule this vnode to be removed when it's ref goes to zero - bool gotNode = (get_vnode(fs->volume, vnode->id, NULL, NULL) == B_OK); + bool gotNode = (get_vnode(fs->volume, vnode->id, NULL) == B_OK); status_t status = B_OK; if (gotNode) @@ -447,7 +447,7 @@ rootfs_lookup(fs_volume *_volume, fs_vnode *_dir, const char *name, ino_t *_id) goto err; } - status = get_vnode(fs->volume, vnode->id, NULL, NULL); + status = get_vnode(fs->volume, vnode->id, NULL); if (status < B_OK) goto err; diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp index f4baa9270a..02112849bd 100644 --- a/src/system/kernel/fs/vfs.cpp +++ b/src/system/kernel/fs/vfs.cpp @@ -3626,8 +3626,7 @@ publish_vnode(fs_volume *volume, ino_t vnodeID, void *privateNode, extern "C" status_t -get_vnode(fs_volume *volume, ino_t vnodeID, void **_privateNode, - fs_vnode_ops **_vnodeOps) +get_vnode(fs_volume *volume, ino_t vnodeID, void **_privateNode) { struct vnode *vnode; @@ -3653,14 +3652,8 @@ get_vnode(fs_volume *volume, ino_t vnodeID, void **_privateNode, if (_privateNode != NULL) *_privateNode = resolvedNode.private_node; - if (_vnodeOps != NULL) - *_vnodeOps = resolvedNode.ops; - } else { - if (_privateNode != NULL) - *_privateNode = vnode->private_node; - if (_vnodeOps != NULL) - *_vnodeOps = vnode->ops; - } + } else if (_privateNode != NULL) + *_privateNode = vnode->private_node; return B_OK; } @@ -4054,7 +4047,7 @@ vfs_get_fs_node_from_path(fs_volume *volume, const char *path, bool kernel, } // Use get_vnode() to resolve the cookie for the right layer. - status = get_vnode(volume, vnode->id, _node, NULL); + status = get_vnode(volume, vnode->id, _node); put_vnode(vnode); return status; diff --git a/src/tools/fs_shell/vfs.cpp b/src/tools/fs_shell/vfs.cpp index fb5eeacbb3..0072b540d2 100644 --- a/src/tools/fs_shell/vfs.cpp +++ b/src/tools/fs_shell/vfs.cpp @@ -1986,7 +1986,7 @@ fssh_publish_vnode(fssh_fs_volume *volume, fssh_vnode_id vnodeID, extern "C" fssh_status_t fssh_get_vnode(fssh_fs_volume *volume, fssh_vnode_id vnodeID, - void **privateNode, fssh_fs_vnode_ops **vnodeOps) + void **privateNode) { struct vnode *vnode; @@ -2012,14 +2012,8 @@ fssh_get_vnode(fssh_fs_volume *volume, fssh_vnode_id vnodeID, if (privateNode != NULL) *privateNode = resolvedNode.private_node; - if (vnodeOps != NULL) - *vnodeOps = resolvedNode.ops; - } else { - if (privateNode != NULL) - *privateNode = vnode->private_node; - if (vnodeOps != NULL) - *vnodeOps = vnode->ops; - } + } else if (privateNode != NULL) + *privateNode = vnode->private_node; return FSSH_B_OK; } @@ -2451,7 +2445,7 @@ vfs_get_fs_node_from_path(fssh_fs_volume *volume, const char *path, bool kernel, } // Use get_vnode() to resolve the cookie for the right layer. - status = ::fssh_get_vnode(volume, vnode->id, _node, NULL); + status = ::fssh_get_vnode(volume, vnode->id, _node); put_vnode(vnode); return FSSH_B_OK;