Skip to content
  • Tejun Heo's avatar
    v9fs: fix error handling in v9fs_session_init() · 412a19b6
    Tejun Heo authored
    On failure, v9fs_session_init() returns with the v9fs_session_info
    struct partially initialized and expects the caller to invoke
    v9fs_session_close() to clean it up; however, it doesn't track whether
    the bdi is initialized or not and curiously invokes bdi_destroy() in
    both vfs_session_init() failure path too.
    
    A. If v9fs_session_init() fails before the bdi is initialized, the
       follow-up v9fs_session_close() will invoke bdi_destroy() on an
       uninitialized bdi.
    
    B. If v9fs_session_init() fails after the bdi is initialized,
       bdi_destroy() will be called twice on the same bdi - once in the
       failure path of v9fs_session_init() and then by
       v9fs_session_close().
    
    A is broken no matter what.  B used to be okay because bdi_destroy()
    allowed being invoked multiple times on the same bdi, which BTW was
    broken in its own way - if bdi_destroy() was invoked on an initialiezd
    but !registered bdi, it'd fail to free percpu counters.  Since
    f0054bb1
    
     ("writeback: move backing_dev_info->wb_lock and
    ->worklist into bdi_writeback"), this no longer work - bdi_destroy()
    on an initialized but not registered bdi works correctly but multiple
    invocations of bdi_destroy() is no longer allowed.
    
    The obvious culprit here is v9fs_session_init()'s odd and broken error
    behavior.  It should simply clean up after itself on failures.  This
    patch makes the following updates to v9fs_session_init().
    
    * @rc -> @retval error return propagation removed.  It didn't serve
      any purpose.  Just use @rc.
    
    * Move addition to v9fs_sessionlist to the end of the function so that
      incomplete sessions are not put on the list or iterated and error
      path doesn't have to worry about it.
    
    * Update error handling so that it cleans up after itself.
    
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Reported-by: default avatarSasha Levin <sasha.levin@oracle.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    412a19b6