struct bkey_s_c_extent e;
        struct data_opts data_opts;
        enum data_cmd data_cmd;
-       u64 cur_inum = U64_MAX;
+       u64 delay, cur_inum = U64_MAX;
        int ret = 0, ret2;
 
        closure_init_stack(&ctxt.cl);
        if (rate)
                bch2_ratelimit_reset(rate);
 
-       while (!kthread || !(ret = kthread_should_stop())) {
-               if (rate &&
-                   bch2_ratelimit_delay(rate) &&
-                   (bch2_btree_iter_unlock(&stats->iter),
-                    (ret = bch2_ratelimit_wait_freezable_stoppable(rate))))
-                       break;
+       while (1) {
+               do {
+                       delay = rate ? bch2_ratelimit_delay(rate) : 0;
+
+                       if (delay) {
+                               bch2_btree_iter_unlock(&stats->iter);
+                               set_current_state(TASK_INTERRUPTIBLE);
+                       }
+
+                       if (kthread && (ret = kthread_should_stop())) {
+                               __set_current_state(TASK_RUNNING);
+                               goto out;
+                       }
+
+                       if (delay)
+                               schedule_timeout(delay);
+
+                       if (unlikely(freezing(current))) {
+                               bch2_btree_iter_unlock(&stats->iter);
+                               move_ctxt_wait_event(&ctxt, list_empty(&ctxt.reads));
+                               closure_sync(&ctxt.cl);
+                               try_to_freeze();
+                       }
+               } while (delay);
 peek:
                k = bch2_btree_iter_peek(&stats->iter);
                if (!k.k)
                bch2_btree_iter_next(&stats->iter);
                bch2_btree_iter_cond_resched(&stats->iter);
        }
-
+out:
        bch2_btree_iter_unlock(&stats->iter);
 
        move_ctxt_wait_event(&ctxt, list_empty(&ctxt.reads));
 
                d->next = now - NSEC_PER_SEC * 2;
 }
 
-int bch2_ratelimit_wait_freezable_stoppable(struct bch_ratelimit *d)
-{
-       bool kthread = (current->flags & PF_KTHREAD) != 0;
-
-       while (1) {
-               u64 delay = bch2_ratelimit_delay(d);
-
-               if (delay)
-                       set_current_state(TASK_INTERRUPTIBLE);
-
-               if (kthread && kthread_should_stop())
-                       return 1;
-
-               if (!delay)
-                       return 0;
-
-               schedule_timeout(delay);
-               try_to_freeze();
-       }
-}
-
 /* pd controller: */
 
 /*
 
 
 u64 bch2_ratelimit_delay(struct bch_ratelimit *);
 void bch2_ratelimit_increment(struct bch_ratelimit *, u64);
-int bch2_ratelimit_wait_freezable_stoppable(struct bch_ratelimit *);
 
 struct bch_pd_controller {
        struct bch_ratelimit    rate;