diff options
author | Tejun Heo <tj@kernel.org> | 2015-06-08 14:57:31 +0900 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-06-08 09:05:06 -0600 |
commit | 412a19b64ad17f7650ff778fd2cb9032938cf71f (patch) | |
tree | dfee77d911dc3814dd3b453977ee3e8183bcb50e /mm | |
parent | 5857cd637bc0d60dc7e37af396b01324f199d89b (diff) | |
download | linux-stable-412a19b64ad17f7650ff778fd2cb9032938cf71f.tar.gz linux-stable-412a19b64ad17f7650ff778fd2cb9032938cf71f.tar.bz2 linux-stable-412a19b64ad17f7650ff778fd2cb9032938cf71f.zip |
v9fs: fix error handling in v9fs_session_init()
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
f0054bb1e1f3 ("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: Tejun Heo <tj@kernel.org>
Reported-by: Sasha Levin <sasha.levin@oracle.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'mm')
0 files changed, 0 insertions, 0 deletions