Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 280cb6e9 authored by Sami Tolvanen's avatar Sami Tolvanen Committed by Gerrit Code Review
Browse files

Merge "Zero blocks before BLKDISCARD"

parents e6f6097a a3c75e3e
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -1465,6 +1465,7 @@ pcdout:
static int PerformCommandErase(CommandParameters* params) {
    char* range = NULL;
    int i;
    int j;
    int rc = -1;
    RangeSet* tgt = NULL;
    struct stat st;
@@ -1491,7 +1492,7 @@ static int PerformCommandErase(CommandParameters* params) {
    range = strtok_r(NULL, " ", &params->cpos);

    if (range == NULL) {
        fprintf(stderr, "missing target blocks for zero\n");
        fprintf(stderr, "missing target blocks for erase\n");
        goto pceout;
    }

@@ -1500,7 +1501,22 @@ static int PerformCommandErase(CommandParameters* params) {
    if (params->canwrite) {
        fprintf(stderr, " erasing %d blocks\n", tgt->size);

        allocate(BLOCKSIZE, &params->buffer, &params->bufsize);
        memset(params->buffer, 0, BLOCKSIZE);

        for (i = 0; i < tgt->count; ++i) {
            // Always zero the blocks first to work around possibly flaky BLKDISCARD
            // Bug: 20881595
            if (!check_lseek(params->fd, (off64_t) tgt->pos[i * 2] * BLOCKSIZE, SEEK_SET)) {
                goto pceout;
            }

            for (j = tgt->pos[i * 2]; j < tgt->pos[i * 2 + 1]; ++j) {
                if (write_all(params->fd, params->buffer, BLOCKSIZE) == -1) {
                    goto pceout;
                }
            }

            // offset in bytes
            blocks[0] = tgt->pos[i * 2] * (uint64_t) BLOCKSIZE;
            // length in bytes