[haiku-bugs] Re: [Haiku] #3685: PANIC: vnode already exists

  • From: "bonefish" <trac@xxxxxxxxxxxx>
  • Date: Wed, 26 Jun 2013 14:21:16 -0000

#3685: PANIC: vnode already exists
-----------------------------+----------------------------
   Reporter:  rossi          |      Owner:  axeld
       Type:  bug            |     Status:  new
   Priority:  normal         |  Milestone:  R1
  Component:  System/Kernel  |    Version:  R1/Development
 Resolution:                 |   Keywords:
 Blocked By:                 |   Blocking:  5260
Has a Patch:  0              |   Platform:  All
-----------------------------+----------------------------

Comment (by bonefish):

 I just ran into a similar `panic()` that I was able to reproduce and
 analyze. The cause in my case was a race condition with the VFS's
 `get_vnode()` in response to `_user_open_dir_entry_ref()`. Since
 `get_vnode()` first calls `create_new_vnode_and_lock()` and afterwards the
 FS's `get_vnode()` hook, there's a time window where the vnode exists, but
 the respective node may not exist in the FS. If the node doesn't actually
 exist and concurrently another thread creates a new file or directory with
 that node ID, the `new_vnode()` or `publish_vnode()` it calls will
 encounter the existing vnode and fail (the former will `panic()`).

 Not sure what a good solution would be. `new_vnode()`/`publish_vnode()`
 could wait until the vnode becomes unbusy or disappears (a new marker flag
 might be needed to distinguish the case from others where the node is
 busy). That might be problematic, however, since the caller may hold a FS
 specific lock, so that we'd risk a deadlock with the concurrent
 `get_vnode()` hook which may also want to acquire that lock.

 An IMO cleaner alternative would be to change the interface and semantics
 of the `get_vnode()` hook. It would be required to create the vnode (via
 `publish_vnode()` or a new interface). We would have to push the burden of
 dealing with concurrent invocations to the hook, though.

 Note that this ticket may actually point to a different problem than the
 one I've analyzed. In my case `vnode->node` was expectedly NULL. Here it
 isn't, though.

--
Ticket URL: <http://dev.haiku-os.org/ticket/3685#comment:3>
Haiku <http://dev.haiku-os.org>
Haiku - the operating system.

Other related posts: