• David Jeffery's avatar
    block: fix warning when I/O elevator is changed as request_queue is being removed · e9a823fb
    David Jeffery authored
    There is a race between changing I/O elevator and request_queue removal
    which can trigger the warning in kobject_add_internal.  A program can
    use sysfs to request a change of elevator at the same time another task
    is unregistering the request_queue the elevator would be attached to.
    The elevator's kobject will then attempt to be connected to the
    request_queue in the object tree when the request_queue has just been
    removed from sysfs.  This triggers the warning in kobject_add_internal
    as the request_queue no longer has a sysfs directory:
    
    kobject_add_internal failed for iosched (error: -2 parent: queue)
    ------------[ cut here ]------------
    WARNING: CPU: 3 PID: 14075 at lib/kobject.c:244 kobject_add_internal+0x103/0x2d0
    
    To fix this warning, we can check the QUEUE_FLAG_REGISTERED flag when
    changing the elevator and use the request_queue's sysfs_lock to
    serialize between clearing the flag and the elevator testing the flag.
    Signed-off-by: default avatarDavid Jeffery <djeffery@redhat.com>
    Tested-by: default avatarMing Lei <ming.lei@redhat.com>
    Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    e9a823fb
blk-sysfs.c 23.4 KB