ceph: fix un-balanced fsc->writeback_count update
authorYan, Zheng <zyan@redhat.com>
Fri, 15 Dec 2017 08:57:40 +0000 (16:57 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 29 Jan 2018 17:36:09 +0000 (18:36 +0100)
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
fs/ceph/addr.c

index 78a1208..b4336b4 100644 (file)
@@ -578,7 +578,6 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
        struct ceph_fs_client *fsc;
        struct ceph_snap_context *snapc, *oldest;
        loff_t page_off = page_offset(page);
-       long writeback_stat;
        int err, len = PAGE_SIZE;
        struct ceph_writeback_ctl ceph_wbc;
 
@@ -619,8 +618,7 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
        dout("writepage %p page %p index %lu on %llu~%u snapc %p seq %lld\n",
             inode, page, page->index, page_off, len, snapc, snapc->seq);
 
-       writeback_stat = atomic_long_inc_return(&fsc->writeback_count);
-       if (writeback_stat >
+       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);
 
@@ -655,6 +653,11 @@ static int writepage_nounlock(struct page *page, struct writeback_control *wbc)
        end_page_writeback(page);
        ceph_put_wrbuffer_cap_refs(ci, 1, snapc);
        ceph_put_snap_context(snapc);  /* page's reference */
+
+       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);
+
        return err;
 }