@@ -683,8 +683,8 @@ static struct attribute *queue_attrs[] = {
683683static umode_t queue_attr_visible (struct kobject * kobj , struct attribute * attr ,
684684 int n )
685685{
686- struct request_queue * q =
687- container_of ( kobj , struct request_queue , kobj ) ;
686+ struct gendisk * disk = container_of ( kobj , struct gendisk , queue_kobj );
687+ struct request_queue * q = disk -> queue ;
688688
689689 if (attr == & queue_io_timeout_entry .attr &&
690690 (!q -> mq_ops || !q -> mq_ops -> timeout ))
@@ -710,8 +710,8 @@ static ssize_t
710710queue_attr_show (struct kobject * kobj , struct attribute * attr , char * page )
711711{
712712 struct queue_sysfs_entry * entry = to_queue (attr );
713- struct request_queue * q =
714- container_of ( kobj , struct request_queue , kobj ) ;
713+ struct gendisk * disk = container_of ( kobj , struct gendisk , queue_kobj );
714+ struct request_queue * q = disk -> queue ;
715715 ssize_t res ;
716716
717717 if (!entry -> show )
@@ -727,63 +727,19 @@ queue_attr_store(struct kobject *kobj, struct attribute *attr,
727727 const char * page , size_t length )
728728{
729729 struct queue_sysfs_entry * entry = to_queue (attr );
730- struct request_queue * q ;
730+ struct gendisk * disk = container_of (kobj , struct gendisk , queue_kobj );
731+ struct request_queue * q = disk -> queue ;
731732 ssize_t res ;
732733
733734 if (!entry -> store )
734735 return - EIO ;
735736
736- q = container_of (kobj , struct request_queue , kobj );
737737 mutex_lock (& q -> sysfs_lock );
738738 res = entry -> store (q , page , length );
739739 mutex_unlock (& q -> sysfs_lock );
740740 return res ;
741741}
742742
743- static void blk_free_queue_rcu (struct rcu_head * rcu_head )
744- {
745- kmem_cache_free (blk_requestq_cachep ,
746- container_of (rcu_head , struct request_queue , rcu_head ));
747- }
748-
749- /**
750- * blk_release_queue - releases all allocated resources of the request_queue
751- * @kobj: pointer to a kobject, whose container is a request_queue
752- *
753- * This function releases all allocated resources of the request queue.
754- *
755- * The struct request_queue refcount is incremented with blk_get_queue() and
756- * decremented with blk_put_queue(). Once the refcount reaches 0 this function
757- * is called.
758- *
759- * Drivers exist which depend on the release of the request_queue to be
760- * synchronous, it should not be deferred.
761- *
762- * Context: can sleep
763- */
764- static void blk_release_queue (struct kobject * kobj )
765- {
766- struct request_queue * q =
767- container_of (kobj , struct request_queue , kobj );
768-
769- might_sleep ();
770-
771- percpu_ref_exit (& q -> q_usage_counter );
772-
773- if (q -> poll_stat )
774- blk_stat_remove_callback (q , q -> poll_cb );
775- blk_stat_free_callback (q -> poll_cb );
776-
777- blk_free_queue_stats (q -> stats );
778- kfree (q -> poll_stat );
779-
780- if (queue_is_mq (q ))
781- blk_mq_release (q );
782-
783- ida_free (& blk_queue_ida , q -> id );
784- call_rcu (& q -> rcu_head , blk_free_queue_rcu );
785- }
786-
787743static const struct sysfs_ops queue_sysfs_ops = {
788744 .show = queue_attr_show ,
789745 .store = queue_attr_store ,
@@ -794,10 +750,15 @@ static const struct attribute_group *blk_queue_attr_groups[] = {
794750 NULL
795751};
796752
797- struct kobj_type blk_queue_ktype = {
753+ static void blk_queue_release (struct kobject * kobj )
754+ {
755+ /* nothing to do here, all data is associated with the parent gendisk */
756+ }
757+
758+ static struct kobj_type blk_queue_ktype = {
798759 .default_groups = blk_queue_attr_groups ,
799760 .sysfs_ops = & queue_sysfs_ops ,
800- .release = blk_release_queue ,
761+ .release = blk_queue_release ,
801762};
802763
803764static void blk_debugfs_remove (struct gendisk * disk )
@@ -823,20 +784,20 @@ int blk_register_queue(struct gendisk *disk)
823784 int ret ;
824785
825786 mutex_lock (& q -> sysfs_dir_lock );
826- ret = kobject_add (& q -> kobj , & disk_to_dev (disk )-> kobj , "queue" );
787+ kobject_init (& disk -> queue_kobj , & blk_queue_ktype );
788+ ret = kobject_add (& disk -> queue_kobj , & disk_to_dev (disk )-> kobj , "queue" );
827789 if (ret < 0 )
828- goto out_unlock_dir ;
790+ goto out_put_queue_kobj ;
829791
830792 if (queue_is_mq (q )) {
831793 ret = blk_mq_sysfs_register (disk );
832794 if (ret )
833- goto out_del_queue_kobj ;
795+ goto out_put_queue_kobj ;
834796 }
835797 mutex_lock (& q -> sysfs_lock );
836798
837799 mutex_lock (& q -> debugfs_mutex );
838- q -> debugfs_dir = debugfs_create_dir (kobject_name (q -> kobj .parent ),
839- blk_debugfs_root );
800+ q -> debugfs_dir = debugfs_create_dir (disk -> disk_name , blk_debugfs_root );
840801 if (queue_is_mq (q ))
841802 blk_mq_debugfs_register (q );
842803 mutex_unlock (& q -> debugfs_mutex );
@@ -860,7 +821,7 @@ int blk_register_queue(struct gendisk *disk)
860821 blk_throtl_register (disk );
861822
862823 /* Now everything is ready and send out KOBJ_ADD uevent */
863- kobject_uevent (& q -> kobj , KOBJ_ADD );
824+ kobject_uevent (& disk -> queue_kobj , KOBJ_ADD );
864825 if (q -> elevator )
865826 kobject_uevent (& q -> elevator -> kobj , KOBJ_ADD );
866827 mutex_unlock (& q -> sysfs_lock );
@@ -889,9 +850,8 @@ int blk_register_queue(struct gendisk *disk)
889850out_debugfs_remove :
890851 blk_debugfs_remove (disk );
891852 mutex_unlock (& q -> sysfs_lock );
892- out_del_queue_kobj :
893- kobject_del (& q -> kobj );
894- out_unlock_dir :
853+ out_put_queue_kobj :
854+ kobject_put (& disk -> queue_kobj );
895855 mutex_unlock (& q -> sysfs_dir_lock );
896856 return ret ;
897857}
@@ -938,8 +898,8 @@ void blk_unregister_queue(struct gendisk *disk)
938898 mutex_unlock (& q -> sysfs_lock );
939899
940900 /* Now that we've deleted all child objects, we can delete the queue. */
941- kobject_uevent (& q -> kobj , KOBJ_REMOVE );
942- kobject_del (& q -> kobj );
901+ kobject_uevent (& disk -> queue_kobj , KOBJ_REMOVE );
902+ kobject_del (& disk -> queue_kobj );
943903 mutex_unlock (& q -> sysfs_dir_lock );
944904
945905 blk_debugfs_remove (disk );
0 commit comments