diff options
author | Fabio Checconi <fabio@gandalf.sssup.i> | 2008-04-10 08:28:01 +0200 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2008-04-10 08:28:01 +0200 |
commit | 4faa3c8150c1d4f7b38d962eda7851083e218e3f (patch) | |
tree | a9110e7d49bc5f76d51d437a684844b47c31be3a /COPYING | |
parent | 8191ecd1d14c6914c660dfa007154860a7908857 (diff) | |
download | lwn-4faa3c8150c1d4f7b38d962eda7851083e218e3f.tar.gz lwn-4faa3c8150c1d4f7b38d962eda7851083e218e3f.zip |
cfq-iosched: do not leak ioc_data across iosched switches
When switching scheduler from cfq, cfq_exit_queue() does not clear
ioc->ioc_data, leaving a dangling pointer that can deceive the following
lookups when the iosched is switched back to cfq. The pattern that can
trigger that is the following:
- elevator switch from cfq to something else;
- module unloading, with elv_unregister() that calls cfq_free_io_context()
on ioc freeing the cic (via the .trim op);
- module gets reloaded and the elevator switches back to cfq;
- reallocation of a cic at the same address as before (with a valid key).
To fix it just assign NULL to ioc_data in __cfq_exit_single_io_context(),
that is called from the regular exit path and from the elevator switching
code. The only path that frees a cic and is not covered is the error handling
one, but cic's freed in this way are never cached in ioc_data.
Signed-off-by: Fabio Checconi <fabio@gandalf.sssup.it>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'COPYING')
0 files changed, 0 insertions, 0 deletions