Commit a3c75e3e authored by Sami Tolvanen's avatar Sami Tolvanen
Browse files

Zero blocks before BLKDISCARD

Due to observed BLKDISCARD flakiness, overwrite blocks that we want
to discard with zeros first to avoid later issues with dm-verity if
BLKDISCARD is not successful.

Bug: 20614277
Bug: 20881595
Change-Id: I4f6f2db39db990879ff10468c9db41606497bd6f
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment