diff --git a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp index 16b269b993..dfecff31be 100644 --- a/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp +++ b/src/add-ons/kernel/file_systems/bfs/BlockAllocator.cpp @@ -869,6 +869,9 @@ BlockAllocator::CheckNextNode(check_control *control) // get iterator for the next directory +#ifdef UNSAFE_GET_VNODE + RecursiveLocker locker(fVolume->Lock()); +#endif Vnode vnode(fVolume, cookie->current); Inode *inode; if (vnode.Get(&inode) < B_OK) { diff --git a/src/add-ons/kernel/file_systems/bfs/Index.cpp b/src/add-ons/kernel/file_systems/bfs/Index.cpp index d741cdc4cb..0619446a5c 100644 --- a/src/add-ons/kernel/file_systems/bfs/Index.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Index.cpp @@ -83,15 +83,16 @@ Index::SetTo(const char *name) if (status != B_OK) return status; - if (get_vnode(fVolume->ID(), id, (void **)&fNode) != B_OK) + Vnode vnode(fVolume, id); + if (vnode.Get(&fNode) != B_OK) return B_ENTRY_NOT_FOUND; if (fNode == NULL) { FATAL(("fatal error at Index::InitCheck(), get_vnode() returned NULL pointer\n")); - put_vnode(fVolume->ID(), id); return B_ERROR; } + vnode.Keep(); return B_OK; } diff --git a/src/add-ons/kernel/file_systems/bfs/Inode.cpp b/src/add-ons/kernel/file_systems/bfs/Inode.cpp index 1f4086a7a7..e56dc6924c 100644 --- a/src/add-ons/kernel/file_systems/bfs/Inode.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Inode.cpp @@ -2169,6 +2169,9 @@ AttributeIterator::GetNext(char *name, size_t *_length, uint32 *_type, vnode_id // if you haven't yet access to the attributes directory, get it if (fAttributes == NULL) { +#ifdef UNSAFE_GET_VNODE + RecursiveLocker locker(volume->Lock()); +#endif if (get_vnode(volume->ID(), volume->ToVnode(fInode->Attributes()), (void **)&fAttributes) != 0 || fAttributes == NULL) { diff --git a/src/add-ons/kernel/file_systems/bfs/Inode.h b/src/add-ons/kernel/file_systems/bfs/Inode.h index a923819c6e..5af7979dc9 100644 --- a/src/add-ons/kernel/file_systems/bfs/Inode.h +++ b/src/add-ons/kernel/file_systems/bfs/Inode.h @@ -238,8 +238,11 @@ class Vnode { } status_t Get(Inode **inode) - { + { // should we check inode against NULL here? it should not be necessary +#ifdef UNSAFE_GET_VNODE + RecursiveLocker locker(fVolume->Lock()); +#endif return get_vnode(fVolume->ID(), fID, (void **)inode); } diff --git a/src/add-ons/kernel/file_systems/bfs/Jamfile b/src/add-ons/kernel/file_systems/bfs/Jamfile index d51189dafc..e6c9340f6f 100644 --- a/src/add-ons/kernel/file_systems/bfs/Jamfile +++ b/src/add-ons/kernel/file_systems/bfs/Jamfile @@ -7,6 +7,7 @@ oldOPTIM = $(OPTIM) ; { local defines = KEEP_WRONG_DIRENT_RECLEN + UNSAFE_GET_VNODE #BFS_BIG_ENDIAN_ONLY ; diff --git a/src/add-ons/kernel/file_systems/bfs/Query.cpp b/src/add-ons/kernel/file_systems/bfs/Query.cpp index 6b2d6c870e..b14085cbfa 100644 --- a/src/add-ons/kernel/file_systems/bfs/Query.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Query.cpp @@ -1035,8 +1035,9 @@ Equation::GetNextMatching(Volume *volume, TreeIterator *iterator, continue; } + Vnode vnode(volume, offset); Inode *inode; - if ((status = get_vnode(volume->ID(), offset, (void **)&inode)) != B_OK) { + if ((status = vnode.Get(&inode)) != B_OK) { REPORT_ERROR(status); FATAL(("could not get inode %Ld in index \"%s\"!\n", offset, fAttribute)); // try with next @@ -1104,8 +1105,6 @@ Equation::GetNextMatching(Volume *volume, TreeIterator *iterator, #endif } - put_vnode(volume->ID(), inode->ID()); - if (status == MATCH_OK) return B_OK; }