diff --git a/block/blk-sysfs.c b/block/blk-sysfs.c index 07494deb1a26..67836f212e2d 100644 --- a/block/blk-sysfs.c +++ b/block/blk-sysfs.c @@ -1002,9 +1002,6 @@ void blk_unregister_queue(struct gendisk *disk) */ if (q->mq_ops) blk_mq_unregister_dev(disk_to_dev(disk), q); - - kobject_uevent(&q->kobj, KOBJ_REMOVE); - kobject_del(&q->kobj); blk_trace_remove_sysfs(disk_to_dev(disk)); mutex_lock(&q->sysfs_lock); @@ -1015,6 +1012,11 @@ void blk_unregister_queue(struct gendisk *disk) if (q->request_fn || q->elevator) elv_unregister_queue(q); mutex_unlock(&q->sysfs_lock); + + /* Now that we've deleted all child objects, we can delete the queue. */ + kobject_uevent(&q->kobj, KOBJ_REMOVE); + kobject_del(&q->kobj); + mutex_unlock(&q->sysfs_dir_lock); kobject_put(&disk_to_dev(disk)->kobj);