Whamcloud - gitweb
LU-14131 osd-ldiskfs: reduce credits for overwritting 04/40604/2
authorWang Shilong <wshilong@ddn.com>
Wed, 11 Nov 2020 06:51:09 +0000 (14:51 +0800)
committerOleg Drokin <green@whamcloud.com>
Thu, 26 Nov 2020 09:26:57 +0000 (09:26 +0000)
If all blocks are mapped which means this is overwritting
case or space has been allocated by fallocate.

There is no need to modify exten tree, and we only
need 1 credits for inode.

Signed-off-by: Wang Shilong <wshilong@ddn.com>
Change-Id: I907861d4862256a8a23a81812953e2330e1d9925
Reviewed-on: https://review.whamcloud.com/40604
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/osd-ldiskfs/osd_io.c

index d65421c..2814cfe 100644 (file)
@@ -1154,6 +1154,13 @@ static int osd_declare_write_commit(const struct lu_env *env,
                quota_space += PAGE_SIZE;
        }
 
                quota_space += PAGE_SIZE;
        }
 
+       credits++; /* inode */
+       /*
+        * overwrite case, no need to modify tree and
+        * allocate blocks.
+        */
+       if (!newblocks)
+               goto out_declare;
        /*
         * each extent can go into new leaf causing a split
         * 5 is max tree depth: inode + 4 index blocks
        /*
         * each extent can go into new leaf causing a split
         * 5 is max tree depth: inode + 4 index blocks
@@ -1167,12 +1174,10 @@ static int osd_declare_write_commit(const struct lu_env *env,
                depth = ext_depth(inode);
                depth = max(depth, 1) + 1;
                newblocks += depth;
                depth = ext_depth(inode);
                depth = max(depth, 1) + 1;
                newblocks += depth;
-               credits++; /* inode */
                credits += depth * 2 * extents;
        } else {
                depth = 3;
                newblocks += depth;
                credits += depth * 2 * extents;
        } else {
                depth = 3;
                newblocks += depth;
-               credits++; /* inode */
                credits += depth * extents;
        }
 
                credits += depth * extents;
        }
 
@@ -1196,6 +1201,7 @@ static int osd_declare_write_commit(const struct lu_env *env,
        else
                credits += newblocks;
 
        else
                credits += newblocks;
 
+out_declare:
        osd_trans_declare_op(env, oh, OSD_OT_WRITE, credits);
 
        /* make sure the over quota flags were not set */
        osd_trans_declare_op(env, oh, OSD_OT_WRITE, credits);
 
        /* make sure the over quota flags were not set */