Whamcloud - gitweb
LU-13013 osd: do not count credits for mapped blocks 66/36866/9
authorAlex Zhuravlev <bzzz@whamcloud.com>
Tue, 26 Nov 2019 13:24:55 +0000 (16:24 +0300)
committerOleg Drokin <green@whamcloud.com>
Sat, 19 Sep 2020 14:12:13 +0000 (14:12 +0000)
this should help to save credits if an application
overwrites using many tiny fragments.

Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: Ice6541672339f2ba9c4e3d91403a756be323baab
Reviewed-on: https://review.whamcloud.com/36866
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Yingjin Qian <qian@ddn.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osd-ldiskfs/osd_io.c

index 78f88e6..4e1735a 100644 (file)
@@ -1102,14 +1102,14 @@ static int osd_declare_write_commit(const struct lu_env *env,
        const struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt));
        struct inode            *inode = osd_dt_obj(dt)->oo_inode;
        struct osd_thandle      *oh;
        const struct osd_device *osd = osd_obj2dev(osd_dt_obj(dt));
        struct inode            *inode = osd_dt_obj(dt)->oo_inode;
        struct osd_thandle      *oh;
-       int                     extents = 1;
+       int                     extents = 0;
        int                     depth;
        int                     i;
        int                     depth;
        int                     i;
-       int                     newblocks;
+       int                     newblocks = 0;
        int                     rc = 0;
        int                     credits = 0;
        long long               quota_space = 0;
        int                     rc = 0;
        int                     credits = 0;
        long long               quota_space = 0;
-       struct osd_fextent      extent = { 0 };
+       struct osd_fextent      mapped = { 0 }, extent = { 0 };
        enum osd_quota_local_flags local_flags = 0;
        enum osd_qid_declare_flags declare_flags = OSD_QID_BLK;
        ENTRY;
        enum osd_quota_local_flags local_flags = 0;
        enum osd_qid_declare_flags declare_flags = OSD_QID_BLK;
        ENTRY;
@@ -1118,19 +1118,8 @@ static int osd_declare_write_commit(const struct lu_env *env,
        oh = container_of(handle, struct osd_thandle, ot_super);
        LASSERT(oh->ot_handle == NULL);
 
        oh = container_of(handle, struct osd_thandle, ot_super);
        LASSERT(oh->ot_handle == NULL);
 
-       newblocks = npages;
-
        /* calculate number of extents (probably better to pass nb) */
        for (i = 0; i < npages; i++) {
        /* calculate number of extents (probably better to pass nb) */
        for (i = 0; i < npages; i++) {
-               if (i && lnb[i].lnb_file_offset !=
-                   lnb[i - 1].lnb_file_offset + lnb[i - 1].lnb_len)
-                       extents++;
-
-               if (osd_is_mapped(dt, lnb[i].lnb_file_offset, &extent))
-                       lnb[i].lnb_flags |= OBD_BRW_MAPPED;
-               else
-                       quota_space += PAGE_SIZE;
-
                /* ignore quota for the whole request if any page is from
                 * client cache or written by root.
                 *
                /* ignore quota for the whole request if any page is from
                 * client cache or written by root.
                 *
@@ -1145,6 +1134,22 @@ static int osd_declare_write_commit(const struct lu_env *env,
                    (lnb[i].lnb_flags & (OBD_BRW_FROM_GRANT | OBD_BRW_SYNC)) ==
                    OBD_BRW_FROM_GRANT)
                        declare_flags |= OSD_QID_FORCE;
                    (lnb[i].lnb_flags & (OBD_BRW_FROM_GRANT | OBD_BRW_SYNC)) ==
                    OBD_BRW_FROM_GRANT)
                        declare_flags |= OSD_QID_FORCE;
+
+               if (osd_is_mapped(dt, lnb[i].lnb_file_offset, &mapped)) {
+                       lnb[i].lnb_flags |= OBD_BRW_MAPPED;
+                       continue;
+               }
+
+               /* count only unmapped changes */
+               newblocks++;
+               if (lnb[i].lnb_file_offset != extent.end || extent.end == 0) {
+                       extents++;
+                       extent.end = lnb[i].lnb_file_offset + lnb[i].lnb_len;
+               } else {
+                       extent.end += lnb[i].lnb_len;
+               }
+
+               quota_space += PAGE_SIZE;
        }
 
        /*
        }
 
        /*