if (atomic_long_inc_return(&nfss->writeback) >
                        NFS_CONGESTION_ON_THRESH)
-               set_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
+               nfss->write_congested = 1;
 }
 
 static void nfs_end_page_writeback(struct nfs_page *req)
 
        end_page_writeback(req->wb_page);
        if (atomic_long_dec_return(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH)
-               clear_bdi_congested(inode_to_bdi(inode), BLK_RW_ASYNC);
+               nfss->write_congested = 0;
 }
 
 /*
        struct inode *inode = page_file_mapping(page)->host;
        int err;
 
+       if (wbc->sync_mode == WB_SYNC_NONE &&
+           NFS_SERVER(inode)->write_congested)
+               return AOP_WRITEPAGE_ACTIVATE;
+
        nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGE);
        nfs_pageio_init_write(&pgio, inode, 0,
                                false, &nfs_async_write_completion_ops);
        int priority = 0;
        int err;
 
+       if (wbc->sync_mode == WB_SYNC_NONE &&
+           NFS_SERVER(inode)->write_congested)
+               return 0;
+
        nfs_inc_stats(inode, NFSIOS_VFSWRITEPAGES);
 
        if (!(mntflags & NFS_MOUNT_WRITE_EAGER) || wbc->for_kupdate ||
        }
        nfss = NFS_SERVER(data->inode);
        if (atomic_long_read(&nfss->writeback) < NFS_CONGESTION_OFF_THRESH)
-               clear_bdi_congested(inode_to_bdi(data->inode), BLK_RW_ASYNC);
+               nfss->write_congested = 0;
 
        nfs_init_cinfo(&cinfo, data->inode, data->dreq);
        nfs_commit_end(cinfo.mds);
 
        struct nlm_host         *nlm_host;      /* NLM client handle */
        struct nfs_iostats __percpu *io_stats;  /* I/O statistics */
        atomic_long_t           writeback;      /* number of writeback pages */
+       unsigned int            write_congested;/* flag set when writeback gets too high */
        unsigned int            flags;          /* various flags */
 
 /* The following are for internal use only. Also see uapi/linux/nfs_mount.h */