struct page *page, void *fsdata)
 {
        struct inode *inode = file_inode(file);
-       int check_cap = 0;
+       bool check_cap = false;
 
        dout("write_end file %p inode %p page %p %d~%d (%d)\n", file,
             inode, page, (int)pos, (int)copied, (int)len);
 
        return -1;
 }
 
+bool __ceph_should_report_size(struct ceph_inode_info *ci)
+{
+       loff_t size = ci->vfs_inode.i_size;
+       /* mds will adjust max size according to the reported size */
+       if (ci->i_flushing_caps & CEPH_CAP_FILE_WR)
+               return false;
+       if (size >= ci->i_max_size)
+               return true;
+       /* half of previous max_size increment has been used */
+       if (ci->i_max_size > ci->i_reported_size &&
+           (size << 1) >= ci->i_max_size + ci->i_reported_size)
+               return true;
+       return false;
+}
+
 /*
  * Swiss army knife function to examine currently used and wanted
  * versus held caps.  Release, flush, ack revoked caps to mds as
                        }
 
                        /* approaching file_max? */
-                       if ((inode->i_size << 1) >= ci->i_max_size &&
-                           (ci->i_reported_size << 1) < ci->i_max_size) {
+                       if (__ceph_should_report_size(ci)) {
                                dout("i_size approaching max_size\n");
                                goto ack;
                        }
 
        int num_pages;
        int written = 0;
        int flags;
-       int check_caps = 0;
        int ret;
+       bool check_caps = false;
        struct timespec mtime = current_time(inode);
        size_t count = iov_iter_count(from);
 
 
        return err;
 }
 
-int ceph_inode_set_size(struct inode *inode, loff_t size)
+bool ceph_inode_set_size(struct inode *inode, loff_t size)
 {
        struct ceph_inode_info *ci = ceph_inode(inode);
-       int ret = 0;
+       bool ret;
 
        spin_lock(&ci->i_ceph_lock);
        dout("set_size %p %llu -> %llu\n", inode, inode->i_size, size);
        i_size_write(inode, size);
        inode->i_blocks = calc_inode_blocks(size);
 
-       /* tell the MDS if we are approaching max_size */
-       if ((size << 1) >= ci->i_max_size &&
-           (ci->i_reported_size << 1) < ci->i_max_size)
-               ret = 1;
+       ret = __ceph_should_report_size(ci);
 
        spin_unlock(&ci->i_ceph_lock);
        return ret;
 
 
 extern int ceph_inode_holds_cap(struct inode *inode, int mask);
 
-extern int ceph_inode_set_size(struct inode *inode, loff_t size);
+extern bool ceph_inode_set_size(struct inode *inode, loff_t size);
 extern void __ceph_do_pending_vmtruncate(struct inode *inode);
 extern void ceph_queue_vmtruncate(struct inode *inode);
 
                                       struct ceph_snap_context *snapc);
 extern void ceph_flush_snaps(struct ceph_inode_info *ci,
                             struct ceph_mds_session **psession);
+extern bool __ceph_should_report_size(struct ceph_inode_info *ci);
 extern void ceph_check_caps(struct ceph_inode_info *ci, int flags,
                            struct ceph_mds_session *session);
 extern void ceph_check_delayed_caps(struct ceph_mds_client *mdsc);