if (atomic_long_inc_return(&fsc->writeback_count) >
            CONGESTION_ON_THRESH(fsc->mount_options->congestion_kb))
-               set_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
+               fsc->write_congested = true;
 
        req = ceph_osdc_new_request(osdc, &ci->i_layout, ceph_vino(inode), page_off, &len, 0, 1,
                                    CEPH_OSD_OP_WRITE, CEPH_OSD_FLAG_WRITE, snapc,
 
        if (atomic_long_dec_return(&fsc->writeback_count) <
            CONGESTION_OFF_THRESH(fsc->mount_options->congestion_kb))
-               clear_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
+               fsc->write_congested = false;
 
        return err;
 }
        BUG_ON(!inode);
        ihold(inode);
 
+       if (wbc->sync_mode == WB_SYNC_NONE &&
+           ceph_inode_to_client(inode)->write_congested)
+               return AOP_WRITEPAGE_ACTIVATE;
+
        wait_on_page_fscache(page);
 
        err = writepage_nounlock(page, wbc);
                        if (atomic_long_dec_return(&fsc->writeback_count) <
                             CONGESTION_OFF_THRESH(
                                        fsc->mount_options->congestion_kb))
-                               clear_bdi_congested(inode_to_bdi(inode),
-                                                   BLK_RW_ASYNC);
+                               fsc->write_congested = false;
 
                        ceph_put_snap_context(detach_page_private(page));
                        end_page_writeback(page);
        bool done = false;
        bool caching = ceph_is_cache_enabled(inode);
 
+       if (wbc->sync_mode == WB_SYNC_NONE &&
+           fsc->write_congested)
+               return 0;
+
        dout("writepages_start %p (mode=%s)\n", inode,
             wbc->sync_mode == WB_SYNC_NONE ? "NONE" :
             (wbc->sync_mode == WB_SYNC_ALL ? "ALL" : "HOLD"));
 
                        if (atomic_long_inc_return(&fsc->writeback_count) >
                            CONGESTION_ON_THRESH(
-                                   fsc->mount_options->congestion_kb)) {
-                               set_bdi_congested(inode_to_bdi(inode),
-                                                 BLK_RW_ASYNC);
-                       }
-
+                                   fsc->mount_options->congestion_kb))
+                               fsc->write_congested = true;
 
                        pages[locked_pages++] = page;
                        pvec.pages[i] = NULL;