From: Zhang Yi <yi.zh...@huawei.com>

Add fsx to suppoet fallocate FALLOC_FL_WRITE_ZEROES command by
introducing OP_WRITE_ZEROES operation.

Signed-off-by: Zhang Yi <yi.zh...@huawei.com>
---
 ltp/fsx.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 80 insertions(+)

diff --git a/ltp/fsx.c b/ltp/fsx.c
index 41933354..0c5dc93f 100644
--- a/ltp/fsx.c
+++ b/ltp/fsx.c
@@ -111,6 +111,7 @@ enum {
        OP_FALLOCATE,
        OP_PUNCH_HOLE,
        OP_ZERO_RANGE,
+       OP_WRITE_ZEROES,
        OP_COLLAPSE_RANGE,
        OP_INSERT_RANGE,
        OP_CLONE_RANGE,
@@ -175,6 +176,7 @@ int     keep_size_calls = 1;            /* -K flag disables 
*/
 int     unshare_range_calls = 1;        /* -u flag disables */
 int     punch_hole_calls = 1;           /* -H flag disables */
 int     zero_range_calls = 1;           /* -z flag disables */
+int    write_zeroes_calls = 1;         /* -M flag disables */
 int    collapse_range_calls = 1;       /* -C flag disables */
 int    insert_range_calls = 1;         /* -I flag disables */
 int    mapped_reads = 1;               /* -R flag disables it */
@@ -273,6 +275,7 @@ static const char *op_names[] = {
        [OP_FALLOCATE] = "fallocate",
        [OP_PUNCH_HOLE] = "punch_hole",
        [OP_ZERO_RANGE] = "zero_range",
+       [OP_WRITE_ZEROES] = "write_zeroes",
        [OP_COLLAPSE_RANGE] = "collapse_range",
        [OP_INSERT_RANGE] = "insert_range",
        [OP_CLONE_RANGE] = "clone_range",
@@ -450,6 +453,13 @@ logdump(void)
                        if (overlap)
                                prt("\t******ZZZZ");
                        break;
+               case OP_WRITE_ZEROES:
+                       prt("WZERO    0x%x thru 0x%x\t(0x%x bytes)",
+                           lp->args[0], lp->args[0] + lp->args[1] - 1,
+                           lp->args[1]);
+                       if (overlap)
+                               prt("\t******ZZZZ");
+                       break;
                case OP_COLLAPSE_RANGE:
                        prt("COLLAPSE 0x%x thru 0x%x\t(0x%x bytes)",
                            lp->args[0], lp->args[0] + lp->args[1] - 1,
@@ -1352,6 +1362,58 @@ do_zero_range(unsigned offset, unsigned length, int 
keep_size)
 }
 #endif
 
+#ifdef FALLOC_FL_WRITE_ZEROES
+void
+do_write_zeroes(unsigned offset, unsigned length)
+{
+       unsigned end_offset;
+       int mode = FALLOC_FL_WRITE_ZEROES;
+
+       if (length == 0) {
+               if (!quiet && testcalls > simulatedopcount)
+                       prt("skipping zero length write zeroes\n");
+               log4(OP_WRITE_ZEROES, offset, length, FL_SKIPPED);
+               return;
+       }
+
+       end_offset = offset + length;
+       if (end_offset > biggest) {
+               biggest = end_offset;
+               if (!quiet && testcalls > simulatedopcount)
+                       prt("write_zeroes to largest ever: 0x%x\n", end_offset);
+       }
+
+       log4(OP_WRITE_ZEROES, offset, length, FL_NONE);
+
+       if (end_offset > file_size)
+               update_file_size(offset, length);
+
+       if (testcalls <= simulatedopcount)
+               return;
+
+       if ((progressinterval && testcalls % progressinterval == 0) ||
+           (debug && (monitorstart == -1 || monitorend == -1 ||
+                     end_offset <= monitorend))) {
+               prt("%lld write zeroes\tfrom 0x%x to 0x%x, (0x%x bytes)\n", 
testcalls,
+                       offset, offset+length, length);
+       }
+       if (fallocate(fd, mode, (loff_t)offset, (loff_t)length) == -1) {
+               prt("write zeroes: 0x%x to 0x%x\n", offset, offset + length);
+               prterr("do_write_zeroes: fallocate");
+               report_failure(161);
+       }
+
+       memset(good_buf + offset, '\0', length);
+}
+
+#else
+void
+do_write_zeroes(unsigned offset, unsigned length)
+{
+       return;
+}
+#endif
+
 #ifdef FALLOC_FL_COLLAPSE_RANGE
 void
 do_collapse_range(unsigned offset, unsigned length)
@@ -2296,6 +2358,12 @@ have_op:
                        goto out;
                }
                break;
+       case OP_WRITE_ZEROES:
+               if (!write_zeroes_calls) {
+                       log4(OP_WRITE_ZEROES, offset, size, FL_SKIPPED);
+                       goto out;
+               }
+               break;
        case OP_COLLAPSE_RANGE:
                if (!collapse_range_calls) {
                        log4(OP_COLLAPSE_RANGE, offset, size, FL_SKIPPED);
@@ -2372,6 +2440,10 @@ have_op:
                TRIM_OFF_LEN(offset, size, maxfilelen);
                do_zero_range(offset, size, keep_size);
                break;
+       case OP_WRITE_ZEROES:
+               TRIM_OFF_LEN(offset, size, maxfilelen);
+               do_write_zeroes(offset, size);
+               break;
        case OP_COLLAPSE_RANGE:
                TRIM_OFF_LEN(offset, size, file_size - 1);
                offset = rounddown_64(offset, block_size);
@@ -2519,6 +2591,9 @@ usage(void)
 #ifdef FALLOC_FL_ZERO_RANGE
 "      -z: Do not use zero range calls\n"
 #endif
+#ifdef FALLOC_FL_WRITE_ZEROES
+"      -z: Do not use write zeroes calls\n"
+#endif
 #ifdef FALLOC_FL_COLLAPSE_RANGE
 "      -C: Do not use collapse range calls\n"
 #endif
@@ -3019,6 +3094,9 @@ main(int argc, char **argv)
                case 'z':
                        zero_range_calls = 0;
                        break;
+               case 'M':
+                       write_zeroes_calls = 0;
+                       break;
                case 'C':
                        collapse_range_calls = 0;
                        break;
@@ -3281,6 +3359,8 @@ main(int argc, char **argv)
                punch_hole_calls = test_fallocate(FALLOC_FL_PUNCH_HOLE | 
FALLOC_FL_KEEP_SIZE);
        if (zero_range_calls)
                zero_range_calls = test_fallocate(FALLOC_FL_ZERO_RANGE);
+       if (write_zeroes_calls)
+               write_zeroes_calls = test_fallocate(FALLOC_FL_WRITE_ZEROES);
        if (collapse_range_calls)
                collapse_range_calls = test_fallocate(FALLOC_FL_COLLAPSE_RANGE);
        if (insert_range_calls)
-- 
2.46.1


Reply via email to