int i;
  
        /*
 -       * __blk_mq_update_nr_hw_queues will update the nr_hw_queues and
 -       * queue_hw_ctx after freeze the queue, so we use q_usage_counter
 -       * to avoid race with it.
 +       * __blk_mq_update_nr_hw_queues() updates nr_hw_queues and queue_hw_ctx
 +       * while the queue is frozen. So we can use q_usage_counter to avoid
 +       * racing with it. __blk_mq_update_nr_hw_queues() uses
 +       * synchronize_rcu() to ensure this function left the critical section
 +       * below.
         */
-       rcu_read_lock();
-       if (percpu_ref_is_zero(&q->q_usage_counter)) {
-               rcu_read_unlock();
+       if (!percpu_ref_tryget(&q->q_usage_counter))
                return;
-       }
  
        queue_for_each_hw_ctx(q, hctx, i) {
                struct blk_mq_tags *tags = hctx->tags;